Fórum témák
- • Óra építése TIL306-os LED kijelzőkkel
- • Áramlökés határoló lágyindító
- • Wharfedale sub ki-be kapcsolgat
- • Villanyszerelés
- • Transzformátor készítés, méretezés
- • Alternativ HE találkozó(k)
- • Rádió építés a kezdetektől a világvevőig
- • LED-es villogó
- • Akkumulátor töltő
- • Elektromos fűnyíró probléma
- • Vicces - mókás történetek
- • LCD kijelző vezérlése, életre keltése
- • Muzeális készülékek-alkatrészek restaurálása
- • Vásárlás, hol kapható?
- • Villanymotor
- • Hangváltók (készítése)
- • Orsós magnók
- • Arduino
- • Műveleti erősítő
- • Klíma szervizelés, javítás
- • MPLAB kérdések
- • Mosógép vezérlők és általános problémáik
- • Li-Po - Li-ion akkumulátor és töltője
- • Elfogadnám, ha ingyen elvihető
- • Videomagnó problémák
- • Elektronikai rendezvények, kiállítások
- • Napelem alkalmazása a lakás energia ellátásában
- • Mosogatógép hiba
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Nokia 3310 (adapter programozáshoz)
- • WiFi antenna készítés
- • Érdekességek
- • Rendelés külföldről (eBay - Paypal)
- • Lázmérők, hőmérők
- • Fejhallgató erősítő
- • Tina
- • Ponthegesztő akkumulátorcellákhoz
- • Kávéfőzőgép hiba
- • Aggregátor gerjesztése
- • Felajánlás, azaz ingyen elvihető
- • Tápegység
- • Műhelyünk felszerelése, szerszámai
- • LED-es világítás
- • DSC riasztó
- • V-FET és SIT erősítő kapcsolások
- • Kompresszor építés (levegő)
- • Erősítő mindig és mindig
- • Frekvenciaváltó
- • Audiofil, High End Audio
- • Villanymotor bekötése
- • Indukciós hevítő készítése
- • Hűtőgép probléma
- • Hörmann kapuk
- • Autóelektronika
- • Kerámialapos tűzhely
» Több friss téma
|
Fórum » PIC programozás assemblyben
Sikerült megoldani! Találtam valami furcsa utalást a PIC- pdf-ben. Kipróbáltam, szkópon látható az adatkivitel. (baud-rate is jó) Érdemes megnézni a csatolt képen az RA0-s sort, az mutatja az érvényes beállítást. "Logikai Analizátoron" viszont semmi sem jelenik meg.
Ez pedig a működést biztosító kódrészlet:
BANKSEL ANSELA ;
CLRF ANSELA ;digital I/O
;UART vezérlés érdekes: (így működik)
bsf ANSELA,TX ;most RA0
BANKSEL TRISA ;RA4-et nem hajlandó kimenetnek beállítani!!!!
MOVLW B'00111111' ;Set RA<5:0> as inputs
MOVWF TRISA
bsf TRISA,FSKbe
bcf TRISA,TX ;itt kimenetnek van beállítva, de ANSEL miatt analóg kimenet
;UART így már megy !!!
bcf TRISA,PWMki
A hozzászólás módosítva: Márc 23, 2024
Sziasztok!
Szeretnék egy kis segítséget kérni, mert már napok óta szívok és már az agyvérzés kerülget. Eléggé kijöttem a gyakorlatból, úgyhogy bármi előfordulhat.
Adott egy I2C LCD meghajtó, a mindehol kapható kínai csoda, PCF8574AT portbővítőre épülő kis modul. Ezt szeretném használni de az istenért sem akar működni.
Ami eddig biztos: a modul működik, az I2C adat küldés működik, LED-et tudok villogtatni vele, a lábkiosztása az alábbi:
DB7, DB6, DB5, DB4, LED (háttérvilágítás), E, RW, RS.
Jó nagy késleltetéseket tettem a kódba, hogy lássam mi történik. Az látszik, hogy átkapcsol kétsoros módba, tehát a 4 bites beállítás és a kétsoros módba kapcsolás működik de innentől semmi. Próba képpen egyetlen "A" betűt akartam megjeleníteni a kijelzőn, de semmi és nem tudok rájönni, hogy miért. A kódot igyekeztem minél bővebben kommentelni és tagolni, hogy érthető legyen.
Init_LCD
call START ;Start parancs, visszatéréskor W-ben a modul címe
call OUT_BYTE ;Modul címzés
movlw b'00000000' ;Modul alaphelyzetbe állítása
call OUT_BYTE
movlw b'00001000' ;Háttérvilágítás be
call Kesleltet255
call Kesleltet255
call Kesleltet255
call Kesleltet255
;1***********************************************************
movlw b'00111000' ;Functoin set DL=1
call OUT_BYTE
movlw b'00111100' ;Functoin set DL=1 + E
call OUT_BYTE
movlw b'00111000' ;Functoin set DL=1 - E
call OUT_BYTE
call Kesleltet255
;2***********************************************************
movlw b'00111100' ;Functoin set DL=1 + E
call OUT_BYTE
movlw b'00111000' ;Functoin set DL=1 - E
call OUT_BYTE
call Kesleltet255
;3***********************************************************
movlw b'00111100' ;Functoin set DL=1 + E
call OUT_BYTE
movlw b'00111000' ;Functoin set DL=1 - E
call OUT_BYTE
call Kesleltet255
;4***********************************************************
movlw b'00101000' ;Functoin set DL=0, 4 bites módba kapcsolás
call OUT_BYTE
movlw b'00101100' ;Functoin set DL=0, 4 bites módba kapcsolás + E
call OUT_BYTE
movlw b'00101000' ;Functoin set DL=0, 4 bites módba kapcsolás - E
call OUT_BYTE
;5***********************************************************
movlw b'00101000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, felső félbájt
call OUT_BYTE
movlw b'00101100' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, felső félbájt + E
call OUT_BYTE
movlw b'00101000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, felső félbájt - E
call OUT_BYTE
movlw b'10001000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, alsó félbájt
call OUT_BYTE
movlw b'10001100' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, alsó félbájt + E
call OUT_BYTE
movlw b'10001000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, alsó félbájt - E
call OUT_BYTE
;6**********************************************************
movlw b'00001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt
call OUT_BYTE
movlw b'00001100' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt - E
call OUT_BYTE
movlw b'10001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt
call OUT_BYTE
movlw b'10001100' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt + E
call OUT_BYTE
movlw b'10001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt - E
call OUT_BYTE
;7**********************************************************
movlw b'00001000' ;Entry mode set I/D=1, S=0 felső bájt
call OUT_BYTE
movlw b'00001100' ;Entry mode set I/D=1, S=0 felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Entry mode set I/D=1, S=0 felső bájt - E
call OUT_BYTE
movlw b'01101000' ;Entry mode set I/D=1, S=0 alsó bájt
call OUT_BYTE
movlw b'01101100' ;Entry mode set I/D=1, S=0 alsó bájt + E
call OUT_BYTE
movlw b'01101000' ;Entry mode set I/D=1, S=0 alsó bájt - E
call OUT_BYTE
;8***********************************************************
movlw b'00001000' ;Clear display, felső bájt
call OUT_BYTE
movlw b'00001100' ;Clear display, felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Clear display, felső bájt - E
call OUT_BYTE
movlw b'00011000' ;Clear display, alsó bájt
call OUT_BYTE
movlw b'00011100' ;Clear display, alsó bájt + E
call OUT_BYTE
movlw b'00011000' ;Clear display, alsó bájt - E
;9**********************************************************
call OUT_BYTE
movlw b'00001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt
call OUT_BYTE
movlw b'00001100' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt - E
call OUT_BYTE
movlw b'11001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt
call OUT_BYTE
movlw b'11001100' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt + E
call OUT_BYTE
movlw b'11001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt - E
call OUT_BYTE
;*********************************************************
movlw b'01001001' ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS
call OUT_BYTE
movlw b'01001101' ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS + E
call OUT_BYTE
movlw b'01001001' ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS - E
call OUT_BYTE
movlw b'00011001' ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS
call OUT_BYTE
movlw b'00011101' ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS + E
call OUT_BYTE
movlw b'00011001' ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS - E
call OUT_BYTE
call STOP
A hozzászólás módosítva: Ápr 23, 2024
Szia! Úgy emlékszem, hogy a 4 bites mód bekapcsolása után csak a fölső 4 bit-et értelmezi (DB4-DB7). Nem tetted fel a rutinokat, így csak sejtéseim lehetnek..
Szia.
Mindenképp csak a a DB4-DB7 részeket használja, mert a többi be sincs kötve. A kiküldött 8 bitből mindig csak a felső 4 az adat vagy a parancs kódja az LCD számára, az alsó 4 bit a háttérvilágítás, az E, az RW és az RS vonal. Ezért is van, hogy a 3. bit már az elején mindig 1, mert az a háttérvilágítás, az 1. bit mindig 0, mert az az RW. Ezért is látható a 38. sortól kezdve, hogy az adatok felső félbájtra és alsó félbájtra vannak szedve. Ezeket nem rutinok csinálják, hanem eleve így írtam meg, hogy az adat felső 4 bitje először az adat felső félbájtját tartalmazzák, aztán a következő küldésnél az alsó félbájtot. Szóval nincs olyan rutin ami ebbe beleszólna.
Idézet: „mert a többi be sincs kötve”
Csak egy ötlet.
Nem hagytad a nem használt bemeneteket lebegni?
Mert ha nincsenek 0-án, már az inicializálás félre megy.
Ha magam csinálom a panelt, mindig lebegve hagyom, nekem nem volt még vele gondom. De ez egy készen kapható modul, mind a 16 tüske benne van és ebben sincsenek bekötve sehová azok a tüskék, csak úgy vannak.
Az a bajom, hogy ehhez a modulhoz rengeteg arduinos példa van de PIC nagyon kevés. Találtam párat de vagy C-ben vagy basic-ben van írva. A basic még valamennyire átlátható lenne de szerintem hülyeség van benne, mert a E és RS vonalat külön kezeli, amit nem egészen értek, hogy hogyan teszi.
Az nem derült ki, hogy PIC milyen órajelen jár, de ez így nem jó.
A specifikáció szerint az LCD utasítások nagy részének a végrehajtása kb. 40us-ig tart, de te az elejét eltekintve egyik utasítás után sem teszel késleltetést.
Az Rs beállásnak meg kell előznie E pulzust. A "nagy" időzítésekről nem tudunk semmit. Én az E impulzus generálását betenném az OUT_BYTE rutinba, így nem kell a állandóan címezgetni az eszközt. Itt egy adatlap az időzítésekről, benne van melyik utasítás mennyi idő alatt hajtódik végre. A hozzászólás módosítva: Ápr 24, 2024
Köszönöm. Ebben az alkalmazásban szoftveres kommunikációt használtam, 4 MHz-es órajel mellett. Elfelejtettem már, de szerintem egy bájt kiküldése biztos tovább tart mint 40usec. De holnap megnézem biztosra.
Idézet: „Az Rs beállásnak meg kell előznie E pulzust.” Ezzel biztos nincs gond, mert az első bájtban van az RS beállítása és a következőben a E vonal.
Nem tudom mire gondolsz az időzítés kapcsán de egy sima késleltető rutin, a nevében szereplő szám a késleltetés mértéke msec-ben.
Az adatlapból látszik, hogy a képernyő törlés végrehajtása 1,7ms, ott nincs berakva késleltetés.
Köszönöm, ez valóban elkerülte a figyelmem. Most tettem be minden parancs kiküldése után késleltetést. De nem változott a helyzet.
Init_LCD
call START ;Start parancs, visszatéréskor W-ben a modul címe
call OUT_BYTE ;Modul címzés
movlw b'00000000' ;Modul alaphelyzetbe állítása
call OUT_BYTE
movlw b'00001000' ;Háttérvilágítás be
call Kesleltet255
call Kesleltet255
call Kesleltet255
call Kesleltet255
;1***********************************************************
movlw b'00111000' ;Functoin set DL=1
call OUT_BYTE
movlw b'00111100' ;Functoin set DL=1 + E
call OUT_BYTE
movlw b'00111000' ;Functoin set DL=1 - E
call OUT_BYTE
call Kesleltet255
;2***********************************************************
movlw b'00111100' ;Functoin set DL=1 + E
call OUT_BYTE
movlw b'00111000' ;Functoin set DL=1 - E
call OUT_BYTE
call Kesleltet255
;3***********************************************************
movlw b'00111100' ;Functoin set DL=1 + E
call OUT_BYTE
movlw b'00111000' ;Functoin set DL=1 - E
call OUT_BYTE
call Kesleltet255
;4***********************************************************
movlw b'00101000' ;Functoin set DL=0, 4 bites módba kapcsolás
call OUT_BYTE
movlw b'00101100' ;Functoin set DL=0, 4 bites módba kapcsolás + E
call OUT_BYTE
movlw b'00101000' ;Functoin set DL=0, 4 bites módba kapcsolás - E
call OUT_BYTE
call Kesleltet100
;5***********************************************************
movlw b'00101000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, felső félbájt
call OUT_BYTE
movlw b'00101100' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, felső félbájt + E
call OUT_BYTE
movlw b'00101000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, felső félbájt - E
call OUT_BYTE
movlw b'10001000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, alsó félbájt
call OUT_BYTE
movlw b'10001100' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, alsó félbájt + E
call OUT_BYTE
movlw b'10001000' ;Functoin set DL=0, N=1, F=0, 4 bites mód, 2 soros kijelzés, 5×7 pixel, alsó félbájt - E
call OUT_BYTE
call Kesleltet100
;6**********************************************************
movlw b'00001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt
call OUT_BYTE
movlw b'00001100' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt - E
call OUT_BYTE
movlw b'10001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt
call OUT_BYTE
movlw b'10001100' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt + E
call OUT_BYTE
movlw b'10001000' ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt - E
call OUT_BYTE
call Kesleltet100
;7**********************************************************
movlw b'00001000' ;Entry mode set I/D=1, S=0 felső bájt
call OUT_BYTE
movlw b'00001100' ;Entry mode set I/D=1, S=0 felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Entry mode set I/D=1, S=0 felső bájt - E
call OUT_BYTE
movlw b'01101000' ;Entry mode set I/D=1, S=0 alsó bájt
call OUT_BYTE
movlw b'01101100' ;Entry mode set I/D=1, S=0 alsó bájt + E
call OUT_BYTE
movlw b'01101000' ;Entry mode set I/D=1, S=0 alsó bájt - E
call OUT_BYTE
call Kesleltet100
;8***********************************************************
movlw b'00001000' ;Clear display, felső bájt
call OUT_BYTE
movlw b'00001100' ;Clear display, felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Clear display, felső bájt - E
call OUT_BYTE
movlw b'00011000' ;Clear display, alsó bájt
call OUT_BYTE
movlw b'00011100' ;Clear display, alsó bájt + E
call OUT_BYTE
movlw b'00011000' ;Clear display, alsó bájt - E
call Kesleltet100
;9**********************************************************
call OUT_BYTE
movlw b'00001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt
call OUT_BYTE
movlw b'00001100' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt + E
call OUT_BYTE
movlw b'00001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt - E
call OUT_BYTE
movlw b'11001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt
call OUT_BYTE
movlw b'11001100' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt + E
call OUT_BYTE
movlw b'11001000' ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt - E
call OUT_BYTE
call Kesleltet100
;*********************************************************
movlw b'01001001' ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS
call OUT_BYTE
movlw b'01001101' ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS + E
call OUT_BYTE
movlw b'01001001' ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS - E
call OUT_BYTE
movlw b'00011001' ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS
call OUT_BYTE
movlw b'00011101' ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS + E
call OUT_BYTE
movlw b'00011001' ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS - E
call OUT_BYTE
call Kesleltet100
call STOP
Az én változatomhoz hasonlítottam a programodat, és két helyen látok eltérést: 70-83 és 100-113-as soroknál. 1 bittel el van csúszva!?
Az enyém ilyen: LCDINIT:
banksel PORTLCD ;Bank0
bcf PORTLCD,LCDRS ;vezérlés mód
call vár_100
call vár_100
call vár_100
; lassú tápfelfutás miatt ajánlott:
movlw b'00110000' ;b'00110100' ;FUNKCIO 8 bites interface
call LCD_nible
movlw b'00110000' ;b'00110100' ;FUNKCIO 8 bites interface
call LCD_nible
movlw b'00110000' ;b'00110100' ;FUNKCIO 8 bites interface
call LCD_nible
call vár_100
movlw b'00100000' ;b'00100100' ;FUNKCIO 4 bites interface
call LCD_nible
call vár_100u
;
movlw b'00111000' ;2 soros, norm 5x7 pixel
movwf LCDVez
call LCDVEZ
call vár_100u
movlw b'00001100' ;kijelző be, kurzor aláhúzás ki, villogás ki
movwf LCDVez
call LCDVEZ
call vár_100u
movlw b'00000001' ;kijelző törlés
movwf LCDVez
call LCDVEZ
call vár_1
call vár_1
movlw b'00000110' ;Entry(karakterbeviteli) mód: kursor increment, kijelző eltolás ki
movwf LCDVez
call LCDVEZ
call vár_100u
RETURN
Volt olyan 16x2-es LCD kijelzővel dolgom, ami nem akart működni olyan programmal ami más kijelzőkkel gond nélkül ment. Valamit módosítanom kellett - időzítések növelése? -és jó lett.
Az én 70-83 és 100-113-as soraim nálad melyikhez kellene hasonlítani? Már jojózik a szemem a sok számtól...
Nálam a 24-es és 33-as sor.
Csak a sorrend más egy kicsit, de a parancsok ugyanazok.
Sorrend fontos?? (Nálad 40. sor, nálam 20. sorban van eltérés. A PDF-ek szerint a 0010 fölső byte kell, de nálam a 0011 van amivel működik. Meghajtó függő, nem tudom...)
Ez teljesen más meghajtó, azért leht a különbség. A legtöbb LCD HD44780 meghajtóra vagy azzal kompatipilisre épül. Annak az adatlapja és egy működő közvetlen PIC-LCD összeköttetéssel működő programból indultam ki. De eddig nem értem el jó eredményt.
Betettem minden bájt kiküldése után egy késleltetést, így most működik.
Köszönöm a segítséget mindenkinek!
Egy PIC18F67K40-et szeretnék programozni. Eddig a régi Mplab IDE-t használtam, mert régi eszközökkel dolgoztam. Ezt a PIC-et a régi már nem ismeri, ezért letöltöttem a Mplab X IDE-t. Ennek jelenleg 6.20 verizója van. Azt írják valahol, hogy az assembler fordító az XC8-cal együtt van, PIC-AS néven. Fel is telepítettem a csomagot. Az első fordítási próba sikertelen volt. Elővettem hát egy olyan kódot amiről tudom biztosan, hogy jó. De ezt sem fordította le, már a LIST P= PIC18F4550, INCLUDE <P18F4550.INC> soroknál hibát ad, de gyakorlatilag egyik utasítást sem ismeri fel.
Valaki tudja, hogy hogyan kell ezt működésre bírni?
"downgrade"-elj 5.25.-re. A hozzászólás módosítva: Szept 29, 2024
Aham, megtaláltam én is közben, hogy az 5.40-től kezdve nincs benne a régi MPASM fordító csak az XC8-ban van de az tök másképp működik, de normális leírást még nem találtam róla.
Szimulátor MPLAB X szimulátorban teszteltem egy megszakításon alapuló időzítőt.
Körhagyó ciklusban ment, azaz amikor lejárt, breakpoint megállította, kiírta a stopwach az időt, majr rányomtam a play-ra és újraindult. Az apróbb szórások fel sem tüntek, de a középső időmérés ledöbbentet. Vajon így fog múködni a PIC-ben is, vagy ez csak a szimulátor hülyesége?
A környezetet kell ismerni a válasz megadásához.
- Nem írja a program az időzítő regisztereit?
- Nincs valahol, valamiért tiltva a megszakítás elfogadása?
- Van más megszakítás is, ami nem engedi időben futni az időzítő kiszolgáló rutinját?
- Van-e DMA-val megvalósított adatátvitel?
- A megszakítási rutin hosszabb lehet valamelyik ágon, mint a beállított időzítés és csak a második kérést fogadja el.
- stb
Szia! Ez egy szimpla tesztprogram, amivel egy olyan időzítő rutint teszteltem, amit arra találtam ki, hogy makróból bármennyit be lehessen építeni a programba, és ne "delay" hanem "millis" fügvényként működjön.
Semmi mást nem csinál közben a program.
Rotary encoder, PIC18F2520 Hello, segítséget kérnék.
Jelenleg egy erősítőt építek. Bemenet választó IC TDA7313. A program működik, hangerőt, hangszínt szabályoz, bemenetet választ, meg ami kell. A menüben lépkedést és a hangerő szabályzást gombokkal tudom használni. Ezt szeretném leváltani rotary encoderre. Próbálkoztam többféle megoldással, még chatgpt-t is segítségül hívtam, írt többféle kódot, de egyik sem akar igazán működni. A bekötés jó. PIC18F2520-at használok, PORTA,1 és PORTA,2-re van kötve. Ha pl jobbra tekertem időnként nem csak felfelé adta a hangerőt, hanem lefelé is. A kód nem bírja mindig eldönteni, hogy melyik irányba forgatom a rotaryt. Mellékelem a kódot.
Ebben vajon mi lehet a hiba vagy valakinek van jobb ötlete a kérdésemre?
; --- RAM változók ---
CBLOCK 0x20
encoder ; aktuális A-B állapot
prev_encoder ; előző A-B állapot
encoder_event ; 0.bit: jobbra, 1.bit: balra
temp
ENDC
; --- Encoder olvasás és „gomb” esemény szimulálása ---
read_encoder:
clrf encoder_event ; minden ciklusban alaphelyzet
movf PORTA, W
swapf WREG, W ; RA2 (bit2) → bit1, RA1 (bit1) → bit0
andlw b'00000011' ; csak a két legalsó bit érdekel
movwf encoder ; aktuális állapot
; Ha nem változott, nincs semmi teendő
movf encoder, W
xorwf prev_encoder, W
bz no_change
; --- Iránydetektálás (egyszerű kvadratúra logika) ---
; Ezt a mintát sok rotary encoderre igaz:
; 00 → 01 → 11 → 10 → 00 (jobbra)
; 00 → 10 → 11 → 01 → 00 (balra)
movf prev_encoder, W
movwf temp
rlcf temp, W ; shiftelt változat
xorwf encoder, W
btfsc STATUS, C
bsf encoder_event, 0 ; jobbra – 0. bit
btfss STATUS, C
bsf encoder_event, 1 ; balra – 1. bit
movf encoder, W
movwf prev_encoder
return
no_change:
return
A hozzászólás módosítva: Ápr 27, 2025
Nem néztem át, csak a tapasztalatom szeretném elmondani: én akkor jártam így, mikor - itthoni üzletben - vettem egy csomó apró rotary encoder-t, és annyira rossz volt a mechanikus érintkezők minősége, a műanyag test pontossága és minden egyéb, hogy csak véletlenül érintkezett jól és jókor, különben azzal is össze-vissza lépkedett egy amúgy jó firmware. Valamint pár tekerés után konkrétan elkoptak az érintkezői és elgörbült a belseje, megnéztem. : -) Még meg is beszéltük másokkal valahol, hogy ők is vettek belőle, és ugyanúgy jártak.
Szia.
Én annó úgy csináltam, hogy külön vizsgáltam az A és B bit állapotát, ennek megfelelően változtattam a tároló változó bitjeit, majd ezt dolgoztam fel. Nem biztos, hogy segít, de emlékem szerint működött a dolog.
Encoder
clrf new
btfss PORTB,1
bsf new,0
btfss PORTB,0
bsf new,1
movf new,W
sublw 0x03
btfss STATUS,Z
goto Noveles
decfsz last,W
goto Noveles
goto Enc_kilep
Noveles
movf new,W
sublw 0x03
btfss STATUS,Z
goto Enc_kilep
movf last,W
sublw 0x02
btfss STATUS,Z
goto Enc_kilep
Enc_kilep
movf new,W
movwf last
return
Ezek szerencsére jók, máshol működnek. Nem örülök, hogy egy új alkatrész ennyire gagyi lehet.
Köszönöm, kipróbáltam. Ha gyorsan forgatom néha lépeget egyet vissza vagy előre.
|
|