|
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.
|
|