Fórum témák

» Több friss téma
Fórum » PIC programozás assemblyben
 
Témaindító: sonajkniz, idő: Máj 30, 2015
Témakörök:
Lapozás: OK   32 / 32
(#) nemgyuri válasza nemgyuri hozzászólására (») Márc 23, 2024 /
 
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:
  1. BANKSEL ANSELA ;
  2.         CLRF ANSELA ;digital I/O
  3. ;UART vezérlés érdekes: (így működik)
  4.         bsf ANSELA,TX   ;most RA0
  5.        
  6.         BANKSEL TRISA ;RA4-et nem hajlandó kimenetnek beállítani!!!!
  7.         MOVLW B'00111111' ;Set RA<5:0> as inputs
  8.         MOVWF TRISA
  9.         bsf     TRISA,FSKbe
  10.         bcf     TRISA,TX   ;itt kimenetnek van beállítva, de ANSEL miatt analóg kimenet
  11.         ;UART így már megy !!!
  12.         bcf     TRISA,PWMki
A hozzászólás módosítva: Márc 23, 2024

PIN1572_2.PNG
    
(#) Pali79 hozzászólása Kedd, 9:44 /
 
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.
  1. Init_LCD
  2.         call    START                   ;Start parancs, visszatéréskor W-ben a modul címe
  3.         call    OUT_BYTE                ;Modul címzés
  4.         movlw   b'00000000'             ;Modul alaphelyzetbe állítása
  5.         call    OUT_BYTE
  6.         movlw   b'00001000'             ;Háttérvilágítás be
  7.         call    Kesleltet255
  8.         call    Kesleltet255
  9.         call    Kesleltet255
  10.         call    Kesleltet255
  11. ;1***********************************************************
  12.         movlw   b'00111000'             ;Functoin set DL=1
  13.         call    OUT_BYTE
  14.         movlw   b'00111100'             ;Functoin set DL=1 + E
  15.         call    OUT_BYTE
  16.         movlw   b'00111000'             ;Functoin set DL=1 - E
  17.         call    OUT_BYTE
  18.         call    Kesleltet255
  19. ;2***********************************************************  
  20.         movlw   b'00111100'             ;Functoin set DL=1 + E
  21.         call    OUT_BYTE
  22.         movlw   b'00111000'             ;Functoin set DL=1 - E
  23.         call    OUT_BYTE
  24.         call    Kesleltet255
  25. ;3***********************************************************
  26.         movlw   b'00111100'             ;Functoin set DL=1 + E
  27.         call    OUT_BYTE
  28.         movlw   b'00111000'             ;Functoin set DL=1 - E
  29.         call    OUT_BYTE
  30.         call    Kesleltet255
  31. ;4***********************************************************
  32.         movlw   b'00101000'             ;Functoin set DL=0, 4 bites módba kapcsolás
  33.         call    OUT_BYTE
  34.         movlw   b'00101100'             ;Functoin set DL=0, 4 bites módba kapcsolás + E
  35.         call    OUT_BYTE
  36.         movlw   b'00101000'             ;Functoin set DL=0, 4 bites módba kapcsolás - E
  37.         call    OUT_BYTE
  38. ;5***********************************************************
  39.         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
  40.         call    OUT_BYTE
  41.         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
  42.         call    OUT_BYTE
  43.         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
  44.         call    OUT_BYTE
  45.  
  46.         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
  47.         call    OUT_BYTE
  48.         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
  49.         call    OUT_BYTE
  50.         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
  51.         call    OUT_BYTE
  52. ;6**********************************************************
  53.         movlw   b'00001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt
  54.         call    OUT_BYTE
  55.         movlw   b'00001100'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt + E
  56.         call    OUT_BYTE
  57.         movlw   b'00001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt - E
  58.         call    OUT_BYTE
  59.  
  60.         movlw   b'10001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt
  61.         call    OUT_BYTE
  62.         movlw   b'10001100'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt + E
  63.         call    OUT_BYTE
  64.         movlw   b'10001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt - E
  65.         call    OUT_BYTE
  66. ;7**********************************************************
  67.         movlw   b'00001000'             ;Entry mode set I/D=1, S=0  felső bájt
  68.         call    OUT_BYTE
  69.         movlw   b'00001100'             ;Entry mode set I/D=1, S=0  felső bájt + E
  70.         call    OUT_BYTE
  71.         movlw   b'00001000'             ;Entry mode set I/D=1, S=0  felső bájt - E
  72.         call    OUT_BYTE
  73.  
  74.         movlw   b'01101000'             ;Entry mode set I/D=1, S=0  alsó bájt
  75.         call    OUT_BYTE
  76.         movlw   b'01101100'             ;Entry mode set I/D=1, S=0  alsó bájt + E
  77.         call    OUT_BYTE
  78.         movlw   b'01101000'             ;Entry mode set I/D=1, S=0  alsó bájt - E
  79.         call    OUT_BYTE
  80. ;8***********************************************************
  81.         movlw   b'00001000'             ;Clear display, felső bájt
  82.         call    OUT_BYTE
  83.         movlw   b'00001100'             ;Clear display, felső bájt + E
  84.         call    OUT_BYTE
  85.         movlw   b'00001000'             ;Clear display, felső bájt - E
  86.         call    OUT_BYTE
  87.  
  88.         movlw   b'00011000'             ;Clear display, alsó bájt
  89.         call    OUT_BYTE
  90.         movlw   b'00011100'             ;Clear display, alsó bájt + E
  91.         call    OUT_BYTE
  92.         movlw   b'00011000'             ;Clear display, alsó bájt - E
  93. ;9**********************************************************
  94.         call    OUT_BYTE
  95.         movlw   b'00001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt
  96.         call    OUT_BYTE
  97.         movlw   b'00001100'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt + E
  98.         call    OUT_BYTE
  99.         movlw   b'00001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt - E
  100.         call    OUT_BYTE
  101.  
  102.         movlw   b'11001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt
  103.         call    OUT_BYTE
  104.         movlw   b'11001100'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt + E
  105.         call    OUT_BYTE
  106.         movlw   b'11001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt - E
  107.         call    OUT_BYTE
  108. ;*********************************************************
  109.         movlw   b'01001001'             ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS
  110.         call    OUT_BYTE
  111.         movlw   b'01001101'             ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS + E
  112.         call    OUT_BYTE
  113.         movlw   b'01001001'             ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS - E
  114.         call    OUT_BYTE
  115.  
  116.         movlw   b'00011001'             ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS
  117.         call    OUT_BYTE
  118.         movlw   b'00011101'             ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS + E
  119.         call    OUT_BYTE
  120.         movlw   b'00011001'             ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS - E
  121.         call    OUT_BYTE
  122.         call    STOP
A hozzászólás módosítva: Kedd, 9:45
(#) nemgyuri válasza Pali79 hozzászólására (») Kedd, 23:35 /
 
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..
(#) Pali79 válasza nemgyuri hozzászólására (») Sze, 6:58 /
 
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.
(#) sonajkniz válasza Pali79 hozzászólására (») Sze, 7:38 /
 
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.
(#) Pali79 válasza sonajkniz hozzászólására (») Sze, 17:07 /
 
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.
(#) helektro válasza Pali79 hozzászólására (») Sze, 21:14 /
 
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.
(#) ktamas66 válasza Pali79 hozzászólására (») Sze, 21:20 /
 
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: Sze, 21:21
(#) Pali79 válasza helektro hozzászólására (») Sze, 23:10 /
 
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.
(#) Pali79 válasza ktamas66 hozzászólására (») Sze, 23:19 /
 
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.
(#) ktamas66 válasza Pali79 hozzászólására (») Sze, 23:52 /
 
Az adatlapból látszik, hogy a képernyő törlés végrehajtása 1,7ms, ott nincs berakva késleltetés.
Következő: »»   32 / 32
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem