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 / 33
(#) 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 Ápr 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.
  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: Ápr 23, 2024
(#) nemgyuri válasza Pali79 hozzászólására (») Á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..
(#) Pali79 válasza nemgyuri hozzászólására (») Ápr 24, 2024 /
 
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 (») Ápr 24, 2024 /
 
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 (») Ápr 24, 2024 /
 
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 (») Ápr 24, 2024 /
 
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 (») Ápr 24, 2024 /
 
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
(#) Pali79 válasza helektro hozzászólására (») Á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.
(#) Pali79 válasza ktamas66 hozzászólására (») Ápr 24, 2024 /
 
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 (») Ápr 24, 2024 /
 
Az adatlapból látszik, hogy a képernyő törlés végrehajtása 1,7ms, ott nincs berakva késleltetés.
(#) Pali79 válasza ktamas66 hozzászólására (») Ápr 25, 2024 /
 
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.
  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.         call    Kesleltet100
  39. ;5***********************************************************
  40.         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
  41.         call    OUT_BYTE
  42.         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
  43.         call    OUT_BYTE
  44.         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
  45.         call    OUT_BYTE
  46.  
  47.         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
  48.         call    OUT_BYTE
  49.         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
  50.         call    OUT_BYTE
  51.         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
  52.         call    OUT_BYTE
  53.         call    Kesleltet100
  54. ;6**********************************************************
  55.         movlw   b'00001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt
  56.         call    OUT_BYTE
  57.         movlw   b'00001100'             ;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.         movlw   b'00001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, felső bájt - E
  60.         call    OUT_BYTE
  61.  
  62.         movlw   b'10001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt
  63.         call    OUT_BYTE
  64.         movlw   b'10001100'             ;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.         movlw   b'10001000'             ;Display control D=0, C=0, B=0, kijelző letiltása, kurzor ki, villogás ki, alsó bájt - E
  67.         call    OUT_BYTE
  68.         call    Kesleltet100
  69. ;7**********************************************************
  70.         movlw   b'00001000'             ;Entry mode set I/D=1, S=0  felső bájt
  71.         call    OUT_BYTE
  72.         movlw   b'00001100'             ;Entry mode set I/D=1, S=0  felső bájt + E
  73.         call    OUT_BYTE
  74.         movlw   b'00001000'             ;Entry mode set I/D=1, S=0  felső bájt - E
  75.         call    OUT_BYTE
  76.  
  77.         movlw   b'01101000'             ;Entry mode set I/D=1, S=0  alsó bájt
  78.         call    OUT_BYTE
  79.         movlw   b'01101100'             ;Entry mode set I/D=1, S=0  alsó bájt + E
  80.         call    OUT_BYTE
  81.         movlw   b'01101000'             ;Entry mode set I/D=1, S=0  alsó bájt - E
  82.         call    OUT_BYTE
  83.         call    Kesleltet100
  84. ;8***********************************************************
  85.         movlw   b'00001000'             ;Clear display, felső bájt
  86.         call    OUT_BYTE
  87.         movlw   b'00001100'             ;Clear display, felső bájt + E
  88.         call    OUT_BYTE
  89.         movlw   b'00001000'             ;Clear display, felső bájt - E
  90.         call    OUT_BYTE
  91.  
  92.         movlw   b'00011000'             ;Clear display, alsó bájt
  93.         call    OUT_BYTE
  94.         movlw   b'00011100'             ;Clear display, alsó bájt + E
  95.         call    OUT_BYTE
  96.         movlw   b'00011000'             ;Clear display, alsó bájt - E
  97.         call    Kesleltet100
  98. ;9**********************************************************
  99.         call    OUT_BYTE
  100.         movlw   b'00001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt
  101.         call    OUT_BYTE
  102.         movlw   b'00001100'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt + E
  103.         call    OUT_BYTE
  104.         movlw   b'00001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, felső bájt - E
  105.         call    OUT_BYTE
  106.  
  107.         movlw   b'11001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt
  108.         call    OUT_BYTE
  109.         movlw   b'11001100'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt + E
  110.         call    OUT_BYTE
  111.         movlw   b'11001000'             ;Display control D=1, C=0, B=0, kijelző engedélyezése, kurzor ki, villogás ki, alsó bájt - E
  112.         call    OUT_BYTE
  113.         call    Kesleltet100
  114. ;*********************************************************
  115.         movlw   b'01001001'             ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS
  116.         call    OUT_BYTE
  117.         movlw   b'01001101'             ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS + E
  118.         call    OUT_BYTE
  119.         movlw   b'01001001'             ;"A" karakter az 1. sor, 1. helyére, felső bájt + RS - E
  120.         call    OUT_BYTE
  121.  
  122.         movlw   b'00011001'             ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS
  123.         call    OUT_BYTE
  124.         movlw   b'00011101'             ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS + E
  125.         call    OUT_BYTE
  126.         movlw   b'00011001'             ;"A" karakter az 1. sor, 1. helyére, alsó bájt + RS - E
  127.         call    OUT_BYTE
  128.         call    Kesleltet100
  129.         call    STOP
(#) nemgyuri válasza Pali79 hozzászólására (») Ápr 25, 2024 /
 
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:
  1. LCDINIT:
  2.         banksel PORTLCD ;Bank0
  3.         bcf     PORTLCD,LCDRS   ;vezérlés mód          
  4.         call    vár_100
  5.         call    vár_100
  6.         call    vár_100
  7. ; lassú tápfelfutás miatt ajánlott:
  8.         movlw   b'00110000'     ;b'00110100'    ;FUNKCIO 8 bites interface
  9.         call    LCD_nible
  10.         movlw   b'00110000'     ;b'00110100'    ;FUNKCIO 8 bites interface
  11.         call    LCD_nible
  12.         movlw   b'00110000'     ;b'00110100'    ;FUNKCIO 8 bites interface
  13.         call    LCD_nible
  14.         call    vár_100
  15.        
  16.         movlw   b'00100000'     ;b'00100100'    ;FUNKCIO 4 bites interface
  17.         call    LCD_nible
  18.         call    vár_100u
  19. ;
  20.         movlw   b'00111000'     ;2 soros, norm 5x7 pixel
  21.         movwf   LCDVez
  22.         call    LCDVEZ
  23.         call    vár_100u
  24.         movlw   b'00001100'     ;kijelző be, kurzor aláhúzás ki, villogás ki
  25.         movwf   LCDVez
  26.         call    LCDVEZ
  27.         call    vár_100u
  28.         movlw   b'00000001'     ;kijelző törlés
  29.         movwf   LCDVez
  30.         call    LCDVEZ
  31.         call    vár_1
  32.         call    vár_1  
  33.         movlw   b'00000110'     ;Entry(karakterbeviteli) mód: kursor increment, kijelző eltolás ki
  34.         movwf   LCDVez
  35.         call    LCDVEZ
  36.         call    vár_100u
  37.         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.
(#) Pali79 válasza nemgyuri hozzászólására (») Ápr 25, 2024 /
 
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...
(#) nemgyuri válasza Pali79 hozzászólására (») Ápr 25, 2024 /
 
Nálam a 24-es és 33-as sor.
(#) Pali79 válasza nemgyuri hozzászólására (») Ápr 26, 2024 /
 
Csak a sorrend más egy kicsit, de a parancsok ugyanazok.
(#) nemgyuri válasza Pali79 hozzászólására (») Ápr 26, 2024 /
 
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...)

4bit_LCD.PNG
    
(#) Pali79 válasza nemgyuri hozzászólására (») Ápr 26, 2024 /
 
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.
(#) Pali79 hozzászólása Ápr 26, 2024 /
 
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!
(#) Pali79 hozzászólása Szept 29, 2024 /
 
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?
(#) PDM válasza Pali79 hozzászólására (») Szept 29, 2024 /
 
"downgrade"-elj 5.25.-re.
A hozzászólás módosítva: Szept 29, 2024
(#) Pali79 válasza PDM hozzászólására (») 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.
(#) sonajkniz hozzászólása Feb 24, 2025 /
 

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?
(#) Hp41C válasza sonajkniz hozzászólására (») Feb 25, 2025 /
 
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
(#) sonajkniz válasza Hp41C hozzászólására (») Feb 25, 2025 /
 
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.
(#) DRoland hozzászólása Ápr 27, 2025 /
 

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?
  1. ; --- RAM változók ---
  2.     CBLOCK  0x20
  3.         encoder         ; aktuális A-B állapot
  4.         prev_encoder    ; előző A-B állapot
  5.         encoder_event   ; 0.bit: jobbra, 1.bit: balra
  6.         temp
  7.     ENDC
  8.  
  9. ; --- Encoder olvasás és „gomb” esemény szimulálása ---
  10. read_encoder:
  11.     clrf    encoder_event        ; minden ciklusban alaphelyzet
  12.  
  13.     movf    PORTA, W
  14.     swapf   WREG, W              ; RA2 (bit2) → bit1, RA1 (bit1) → bit0
  15.     andlw   b'00000011'          ; csak a két legalsó bit érdekel
  16.     movwf   encoder              ; aktuális állapot
  17.  
  18.     ; Ha nem változott, nincs semmi teendő
  19.     movf    encoder, W
  20.     xorwf   prev_encoder, W
  21.     bz      no_change
  22.  
  23.     ; --- Iránydetektálás (egyszerű kvadratúra logika) ---
  24.     ; Ezt a mintát sok rotary encoderre igaz:
  25.     ; 00 → 01 → 1110 → 00 (jobbra)
  26.     ; 00 → 1011 → 01 → 00 (balra)
  27.  
  28.     movf    prev_encoder, W
  29.     movwf   temp
  30.     rlcf     temp, W              ; shiftelt változat
  31.     xorwf   encoder, W
  32.  
  33.     btfsc   STATUS, C
  34.     bsf     encoder_event, 0     ; jobbra – 0. bit
  35.     btfss   STATUS, C
  36.     bsf     encoder_event, 1     ; balra – 1. bit
  37.  
  38.     movf    encoder, W
  39.     movwf   prev_encoder
  40.  
  41.     return
  42.  
  43. no_change:
  44.     return
A hozzászólás módosítva: Ápr 27, 2025
(#) tki válasza DRoland hozzászólására (») Á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.
(#) Pali79 válasza DRoland hozzászólására (») Ápr 27, 2025 /
 
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.
  1. Encoder
  2.         clrf    new
  3.         btfss   PORTB,1        
  4.         bsf             new,0
  5.         btfss   PORTB,0        
  6.         bsf             new,1
  7.         movf    new,W
  8.         sublw   0x03          
  9.         btfss   STATUS,Z
  10.         goto    Noveles
  11.         decfsz  last,W
  12.         goto    Noveles
  13.         incf    tmp1
  14.         goto    Enc_kilep
  15. Noveles
  16.         movf    new,W
  17.         sublw   0x03          
  18.         btfss   STATUS,Z
  19.         goto    Enc_kilep
  20.         movf    last,W
  21.         sublw   0x02          
  22.         btfss   STATUS,Z
  23.         goto    Enc_kilep
  24.         decf    tmp1
  25. Enc_kilep
  26.         movf    new,W
  27.         movwf   last
  28.         return
(#) DRoland válasza tki hozzászólására (») Ápr 27, 2025 /
 
Ezek szerencsére jók, máshol működnek. Nem örülök, hogy egy új alkatrész ennyire gagyi lehet.
(#) DRoland válasza Pali79 hozzászólására (») Ápr 27, 2025 /
 
Köszönöm, kipróbáltam. Ha gyorsan forgatom néha lépeget egyet vissza vagy előre.
Következő: »»   32 / 33
Bejelentkezés

Belépés

Hirdetés
XDT.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