Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1118 / 1203
(#) nedudgi válasza menyus hozzászólására (») Ápr 21, 2020 /
 
A SWAPF utasítás felcseréli egy regiszter két félbájtját. (Ha jól értem a problémát.)
(#) menyus válasza nedudgi hozzászólására (») Ápr 21, 2020 /
 
Igen, ezért tettem bele a kódba. Mivel nálam a nibble k fel vannak cserélve. A PORTB alsó négy bitje vezérli az LCD felső 4 bitjét. De már úgy belekavarodtam hogy lehet inkább átgányolom a panelt ahogy pipi is javasolta.
(#) menyus válasza pipi hozzászólására (») Ápr 21, 2020 /
 
Átnéztem a panelt, mivel a PORTB felső nibble ban van már olyan dolog aminek a működése le van programozva és az már jó, így békén hagyom. Az RS és az EN LCD lábak vannak még rajta de az nem szól bele az említett problémába így maradhatnak. A PORTD4-7 (ami a leg logikusabb) és az elcs&&tt PORTB 0-3 bitjei viszont egyelőre büntetlenül felcserélhetőek mert a PORTD csak szimplán analóg kapcsolókat vezérel amit a PORTB is megtehet, raadásul szinte egymás mellett vannak. Tehát megyek és átdrótozom a panelt. Ezek után pedig remélhetőleg kitisztul a kép, nem bolondulok bele a nibble és bit csereberékbe. Köszi.
A hozzászólás módosítva: Ápr 21, 2020
(#) benjami válasza menyus hozzászólására (») Ápr 21, 2020 / 1
 
Ha belefér egy picit nagyobb kód és picit hosszabb futási idő, akkor bitenként is kirakható a 4 bitnyi adat (16 utasításból megvan, a btfsc, bsf, btfss, bcf utasítás sorozatot kell négyszer elismételni hozzá). Csináltam anno C-ben LCD drivert és ha nem sorrendben adtuk meg a lábakat akkor nem volt más lehetőség. Max sebességen működtetve a vezérlőt szinte mérhetetlenül kicsi a futási időben a lassulás.
(#) ktamas66 válasza menyus hozzászólására (») Ápr 21, 2020 / 1
 
Szoftverből egyszerűbb lenne:
Valami hasonló megoldással:
  1. ;------[ LCD DATA rutin ]--------------------------------------------
  2. ;       Ez a rutin az LCDDATA-ban levö adatot kiirja az LCD-re, az aktuális karakterpozicióba.
  3. LCDDATA
  4.         swapf   lcddata,f       ;alsó-felsö nibble helyet cserél
  5.         movlw   0x0F            ;felsö nibble select
  6.         andwf   lcddata,w
  7.         movwf   ktlcd
  8.         movlw   0
  9.         btfsc   ktlcd,3
  10.         iorlw   b'00000001'
  11.         btfsc   ktlcd,2
  12.         iorlw   b'00000010'
  13.         btfsc   ktlcd,1
  14.         iorlw   b'00000100'
  15.         btfsc   ktlcd,0
  16.         iorlw   b'00001000'
  17.         addlw   0xa0            ;a port egyéb lábait állitja be
  18.         movwf   lcdport
  19.         enable
  20.         swapf   lcddata,f       ;alsó nibble
  21.         movlw   0x0F
  22.         andwf   lcddata,w
  23.         movwf   ktlcd
  24.         movlw   0
  25.         btfsc   ktlcd,3
  26.         iorlw   b'00000001'
  27.         btfsc   ktlcd,2
  28.         iorlw   b'00000010'
  29.         btfsc   ktlcd,1
  30.         iorlw   b'00000100'
  31.         btfsc   ktlcd,0
  32.         iorlw   b'00001000'
  33.         addlw   0xa0
  34.         movwf   lcdport
  35.         enable
  36.         movlw   .4                      ;40 mikrosec várakozás
  37.         call DELAY10
  38.         return

Nem gondoltam teljesen végig, ez csak a bitek sorrendjét változtatja meg, de szerintem ez alapján testre tudod szabni..
(#) proli007 válasza menyus hozzászólására (») Ápr 21, 2020 / 1
 
Hello! A nibble bitcserét legegyszerűbben talán egy 16 elemes táblázattal lehet megoldani.
Pld.
0000 - 0000 = 0
0001 - 1000 = 8
0010 - 0100 = 4
...
Így a nibble a táblázat elemére mutat, a visszatérő érték, pedig a cserélt bit-tel. Tulajdonképen a PC-hez adódik hozzá a nibble, és az az táblázat elemére ugrik.
A táblázatot pedig így kell kezelni.
(#) menyus válasza menyus hozzászólására (») Ápr 21, 2020 /
 
Upppsz.. Még egy kérdés ami lehet lényeges lehet. Írtam hogy felcserélem a PORTB - PORTD t. Viszont a PORTD minden lába fel van húzva tápra (5v) 82k ohm al. Ezek az ellenállások a fixen felforrasztott PIC alatt vannak, ezért macerás őket kivenni. Kérdés maradhatnak vagy sem? Tehát így az LCD D4 - D7 lábai is fel lesznek húzva 5V ra. Gondot jelent ez?
(#) menyus válasza proli007 hozzászólására (») Ápr 21, 2020 /
 
Köszönöm Nagyuram az újabb supportot. Megcsinálom ezt a kis hardveres átalakítást és utána kérdezek ha elakadok. De szerintem menni fog ez. Csak ez a keresztbe kötés bonyolította meg az életemet.
A hozzászólás módosítva: Ápr 21, 2020
(#) menyus válasza ktamas66 hozzászólására (») Ápr 21, 2020 /
 
Köszönöm szépen, de kezdőként jobban átlátom ha hardveresen is egyértelmű a dolog ezért átalakítom a panelt. Köszönöm a példakódot, az átalakítás előtt kipróbálom azért, tanulok belőle! De aztán vissza a kályhához, és rendbe teszem amit elszúrtam.
(#) pipi válasza menyus hozzászólására (») Ápr 21, 2020 /
 
Használd 4 bites módban, akkor kevesebbet kell átmadzagolni
(#) menyus válasza pipi hozzászólására (») Ápr 21, 2020 /
 
Úgy volt eddig is, ezért kellett a keresztben lévő nibble kkel szenvedni. ( 8 bites módban nem lett voilna gondom szerintem mert ott egyértelműek az utasítás küldések, nincs maszkolás. ) Az LCD lábain akkor nem okot gondot a 82k Ohm felhúzó ellenállás (VDD +5V ) ?
A hozzászólás módosítva: Ápr 21, 2020
(#) Pali79 válasza menyus hozzászólására (») Ápr 21, 2020 / 1
 
Pedig ez a sokkal ésszerűbb megoldás! Ezt a kódot egyszer kell megírni és utána oda kötöd az LCD-t ahová akarod. Akár úgy is megvalósítható, hogy a 4 bit 4 különböző porton van!
(#) menyus válasza Pali79 hozzászólására (») Ápr 21, 2020 /
 
Hűűű, az jól hangzki, de már megtörtént a "műtét", nem is látszik mert az LCD pont a kontroller felett ül és takarja az átkötéseket. Azért köszönöm a kódot, ezt is ki fogom próbálni. Jó ha van a repertoárban, bár a legközelebbi LCD s projectemnél már jobban figyelek a tervezésnél.

Most állok neki átszabni a kódot az új felállás szerint, remélem így már nem fog ki rajtam.

Köszönöm mindenkinek a segítséget, a 82k Ohm os felhúzóellenállásokat végül benne hagytam (LCD D4 - D7 en, (azaz egyben a PORTD 4-7 en) mert a PORTD re kötöttem át a 4 adatbitet. Azokon a lábakon volt pull up 82K, és nem akartam leforrasztanni ezt a 40 lábú böhömöt mert a tok alatt vannak az ellenállások. Remélem nem kavar be a parancs és az adatátvitelbe sem.
(#) menyus válasza Pali79 hozzászólására (») Ápr 21, 2020 /
 
Most nézem, nem is olyan bonyi ez a kód, köszönöm. Tulajdonképpen bitenként küldi az adatot az LCD nek, ez ís egy járható út és egyben megoldás a problámámra.

Köszönöm szépen!
(#) Pali79 válasza menyus hozzászólására (») Ápr 21, 2020 /
 
Nem bitenként küldi, csak bitenként vizsgálja a küldendő adatot. Régen én is belefutottam abba a hibába, hogy vagy a PIC lábait másra kellett használni vagy egyéb okból nagyon bonyolult lett a bekötés. Akkor kértem én is segítséget és ha jól emlékszem én is ktamás66 útmutatása szerint indultam el.
Használd egészséggel!
(#) menyus hozzászólása Ápr 21, 2020 /
 
Nos, mindjárt működik a dolog. Az inicializálás már ok, kijelző letörörve kurzor a felső sor bal oldali legelső mezejében. Már csak írnom kéne rá, pl a "Háború és Beke" t.
(#) menyus válasza Pali79 hozzászólására (») Ápr 21, 2020 /
 
Köszönöm, elmentettem a kódot vésztartalékként. De lehet eljátszom vele, csak át kell alakítanom akkor a PORTD megfelelő bitjeire. Érdekes megoldás de teljesen logikus, egyszerű és egyértelmű. Legalábbis így első ránézésre.
(#) menyus válasza menyus hozzászólására (») Ápr 21, 2020 /
 
Viccen kívül, az inicializálás az ok, de azért van még mit átirogatno, mert az eredeti proli007 oktató példakódban minden vezérlő és adatláb a PORTD re van konfigolva, nálam meg az LCD RS és EN bemenetét pl. a PORTB 4-5 bitje vezérli. Tehát ezt még át kell írni, de ez már nem gond.

Mindenesetre a sikerélmény mára megvan és ez motivál. Tehát 3 óra előtt tuti nem fekszem le...
A hozzászólás módosítva: Ápr 21, 2020
(#) Pali79 válasza menyus hozzászólására (») Ápr 21, 2020 / 1
 
Nem kell átalakítani semmit sem!
A te kódod elején #define paranccsal megadod a az én kódomban leírt RS, EN, stb és include fáljként megadod az én kódomat. Én így használom.
(#) sonajkniz válasza menyus hozzászólására (») Ápr 21, 2020 / 1
 
Az én megoldásom hasonló Pali79-éhez.

  1. Előszőr definiálni kell az áramkörnek megfelelően a kijelzőhöz használandó portokat.
  2. Példa:                                                                
  3.                                              
  4. #define     E       LATA,2                                            
  5. #define     RS      LATA,1                                            
  6. #define     D7      LATB,7                                            
  7. #define     D6      LATB,6                                            
  8. #define     D5      LATB,5                                            
  9. #define     D4      LATB,4



Amikor adatot akarok küldeni:
  1. MOVF    ADAT,W
  2.     CALL    KIIRAS
  3.     ;vagy
  4.     MOVLW   B'00111001'
  5.     CALL    KIIRAS
  6.     ;vagy
  7.     MOVLW   0x46
  8.     CALL    KIIRAS

A kiíró rutin pedig így néz ki:
  1. KIIRAS
  2.     NOP
  3.     MOVWF   KULDENDO
  4.     BCF     D7
  5.     BCF     D6
  6.     BCF     D5
  7.     BCF     D4
  8.     BTFSC   KULDENDO,7
  9.     BSF     D7
  10.     BTFSC   KULDENDO,6
  11.     BSF     D6
  12.     BTFSC   KULDENDO,5
  13.     BSF     D5
  14.     BTFSC   KULDENDO,4
  15.     BSF     D4
  16.     DELAY   D'1'               ;El? várakozás
  17.     BSF     E                  ;Beírás indul
  18.     DELAY   D'6'               ;Kivárás
  19.     BCF     E                  ;Beírás vége
  20.     DELAY   D'1'
  21.     BCF     D7
  22.     BCF     D6
  23.     BCF     D5
  24.     BCF     D4
  25.     BTFSC   KULDENDO,3
  26.     BSF     D7
  27.     BTFSC   KULDENDO,2
  28.     BSF     D6
  29.     BTFSC   KULDENDO,1
  30.     BSF     D5
  31.     BTFSC   KULDENDO,0
  32.     BSF     D4
  33.     DELAY   D'1'               ;El? várakozás
  34.     BSF     E                  ;Beírás indul
  35.     DELAY   D'6'               ;Kivárás
  36.     BCF     E                  ;Beírás vége
  37.     DELAY   D'1'
  38.     BCF     D7
  39.     BCF     D6
  40.     BCF     D5
  41.     BCF     D4    
  42.     RETURN
A hozzászólás módosítva: Ápr 21, 2020
(#) menyus válasza sonajkniz hozzászólására (») Ápr 21, 2020 /
 
Ez már a bőség zavara, köszönöm.
(#) menyus válasza Pali79 hozzászólására (») Ápr 21, 2020 /
 
Értem, köszi.
(#) menyus hozzászólása Ápr 21, 2020 /
 
Minden működik, legalábbis proli007 kódja igen. Most már csak azt kell megoldjam valahogy, hogy különböző feltételek teljesülése vagy nem teljesülése esetén más és más szöveget írjon ki az LCD re. Ez egy tesztelő masina lesz, USB n tol be parancsokat egy szoftvernek ami PC re csatlakoztatva futtat egy hardveren tesztet. A hardver különbözü pontjain közben méréseket vagy jelszinteket kell chekkolni, és a szerint hogy jó vagy nem jó a teszt eredmény, ki kéne iratni az LCD re. Én arra gondoltam hogy egy regiszterben az eredményeknek megfelelően jelzőbiteket állítok be, majd a végén kiértékelem és a feltételeknek megfelelően hívok meg a kiirató rutinba különböző text eket. Mindegyik text egy külön rutin, ami csak meghívódik a feltétel teljesülése esetén a kiirató rutinba. Remélem össze tudom stoppolni valahogy, így ahogy kitaláltam elvileg működnie kéne... Nagyon sokféle szöveget kéne kiirítni, kb 20 - 30 félét, tehát ennyi text rutin kell gondolom. Vagy szerintetek hogyan kéne ezt megoldani, "egyszerűen?"
(#) Pali79 válasza menyus hozzászólására (») Ápr 22, 2020 /
 
Szerintem a legjobb ilyenkor ha mindig kiírod mind a 16 karaktert, akkor nem kell görcsölni a különböző hosszúságú szövegekkel, csak egy rutint kell használni. A szöveget DB paraccsal letárolod, a rutin elején beállítasz egy számlálót, TBLRD*+ paranccsal olvasol.
(#) menyus válasza Pali79 hozzászólására (») Ápr 22, 2020 /
 
Köszönöm, de ezt körül kell járnom. Egyelőre nem világos a "DB" és "TBLRD +" parancs (ez nem "C" véletlenül? Mert asm ben én nem látom sehol az utasításkészletben ) és semmit nem találok róla. És azt se nagyon értem hogy proli007 kódjában a TXT1 és TXT2 string táblák rutinhívással vannak meghívva de a rutin végén nincs "return" (hogy tér vissza a főprogramba onnét?) , Tehát történik valami még "a háttérben", ami a kódból számomra nem derül ki. Van egy másik kód(igaz F684A ra de ez a lényeget tekintve nem érdekes..) amiben a string karaktrenként retlw utasításokkal működik és az utolsó karakter az "h0", ezt chekkolják és onnét tudja a program hogy véget ért a kiírás. Ez se rossz megoldás de bárhogy próbálok ugyan ezzel a rutinnal más string ben letárolt szöveget kiiratni vagy az egyik szöveg jelenik meg jól vagy a másik. Az egyik szöveg a kettő közül mindig "irkafirka lesz"... Mindjárt beollózom mivel próbálkozom, segítenétek?
(#) menyus hozzászólása Ápr 22, 2020 /
 
Ezzel próbálkozom de nem működik, de ha múködne is ez még mindig csak 1 feltétel és 2 szöveg. Ennél lényegesebben több kéne mert sok feltétel van sokféle szöveggel. Bocs hogy ilyen rendezetlenül jelenik meg a kód, nem tudom miért, talán az eredeti kód formázása miatt

  1. START
  2.                 movlw   .15             ; Bekapcsolás után 3sec várakozás (15*200ms),
  3.                 movwf   count1          ; hogy az LCD tuti elinduljon.
  4. STRT            movlw   .200            ; 200msec várakozás
  5.                 call    WAIT            ; Várakozás LCD RESET miatt
  6.                 decfsz  count1,f        ; 15*200ms=3sec
  7.                 goto    STRT           
  8.  
  9.                 call    LCDSET          ; LCD setup rutine (LCD Inicializálás)
  10.                 banksel lcdport         ; Bank0
  11.                 movlw   0x00            ; Pozícionálás a 0. karakterpozícióra
  12.                 movwf   lcdaddr         ; LCD-ADDR feltöltése
  13. NEXT
  14.                 movf    lcdaddr,w       ; Megadom, melyik karaktert kell beolvasni az 1. sorban
  15.                 btfsc   PORTE,2                 ; NYOMÓGOMB, MINT FELTÉTEL
  16.                 call    TXT1            ; Karakter beolvasása az 1. táblából
  17.                 GOTO    X
  18.                 CALL    TXT3
  19. X              movwf   chr1            ; 1. sor aktuális kiírandó karaktere
  20.                 movf    lcdaddr,w       ; Megadom, melyik karaktert kell beolvasni a 2.sorban
  21.                 btfsc   PORTE,2                 ; NYOMÓGOMB, MINT FELTÉTEL
  22.                 call    TXT2                    ; Karakter beolvasása a 2. táblából
  23.                 GOTO    Y
  24.                 CALL    TXT4
  25. Y               movwf   chr2            ; 2. sor aktuális kiírandó karaktere
  26.  
  27.                 call    LCD_addr                ; DDRAM (karakter pozíció 1,sorra)
  28.                 movf    chr1,w          ; Első sor karakterét a w-be
  29.                 movwf   lcddata                 ; a karaktert a kimeneti regiszterbe teszem
  30.                 call    LCD_data                ; kiírom az LCD-1. sorába
  31.  
  32.                 bsf     lcdaddr,6       ; Cím átállítása a 2. sorra
  33.                 call    LCD_addr        ; DDRAM (karakter pozíció 2. sorra)
  34.                 movf    chr2,w          ; Második sor karakterét a w-be
  35.                movwf    lcddata                 ; a karaktert a kimeneti regiszterbe teszem    
  36.                call    LCD_data        ; kiírom az LCD 2. sorába
  37.                bcf     lcdaddr,6       ; Cím visszaállítása az 1. sorra
  38.  
  39.                 banksel lcdport                 ; Bank0
  40. ;               movf    lcdaddr,w       ; Kiírási pozíció a W-be
  41. ;               movwf   PORTD                   ; Kijelezzük a Bportán hol állunk (csak a móka kedvéért)
  42.  
  43.                 movlw   .200                    ; 200msec várakozás, hogy látható legyen a kiírás
  44.                 call    WAIT   
  45.                 incf    lcdaddr,f               ; Következő karakter pozíció
  46. ;               movlw   0x0f                    ; Maszk alsó nibble (megakadályozzuk, hogy 16-nál több legyen. (20 KARAKTERES AZ LCD, NEM 16...)
  47. ;               andwf   lcdaddr,f               ; Cím byte maszk (Csak az első sorba írunk)       (MINDKÉT SORBA ÍRJUNK....)
  48.                 goto    NEXT                    ; Újra kezdjük!
  49.  
  50.  
  51.  
  52. ;------ Szöveg táblázat olvasása ------------------------------------------------------
  53. TXT1    ADDWF   PCL,F
  54.         RETLW   A' '                ;
  55.         RETLW   A' '                ;
  56.         RETLW   A' '                ;
  57.         RETLW   A'L'                ;  
  58.         RETLW   A'C'                ;  
  59.         RETLW   A'D'                ;  
  60.         RETLW   A' '                ;  
  61.         RETLW   A'4'                ;  
  62.         RETLW   A'-'                ;
  63.         RETLW   A'B'                ;
  64.         RETLW   A'I'                ;
  65.         RETLW   A'T'                ;
  66.         RETLW   A' '                ;
  67.         RETLW   A'M'                ;
  68.         RETLW   A'O'                ;
  69.         RETLW   A'D'                ;
  70.         RETLW   A'E'                ;
  71.         RETLW   A' '                ;
  72.         RETLW   A' '                ;
  73.         RETLW   A' '                ;
  74.         RETLW   H'0'                ;
  75.        
  76.         RETURN
  77.                  
  78.  
  79. TXT2  ADDWF   PCL,F
  80.       RETLW   A' '                ;
  81.       RETLW   A' '                ;
  82.       RETLW   A' '                ;
  83.       RETLW   A'L'                ;  
  84.       RETLW   A'C'                ;  
  85.       RETLW   A'D'                ;  
  86.       RETLW   A' '                ;  
  87.       RETLW   A'8'                ;  
  88.       RETLW   A'-'                ;
  89.       RETLW   A'B'                ;
  90.       RETLW   A'I'                ;
  91.       RETLW   A'T'                ;
  92.       RETLW   A' '                ;
  93.       RETLW   A'M'                ;
  94.       RETLW   A'O'                ;
  95.       RETLW   A'D'                ;
  96.       RETLW   A'E'                ;
  97.       RETLW   A' '                ;
  98.       RETLW   A' '                ;
  99.       RETLW   A' '                ;
  100.       RETLW   H'0'                ;
  101.        
  102.         RETURN
  103.          
  104.  
  105.  TXT3   ADDWF   PCL,F
  106.         RETLW   A' '                ;
  107.         RETLW   A' '                ;
  108.         RETLW   A'1'                ;
  109.         RETLW   A'P'                ;  
  110.         RETLW   A'R'                ;  
  111.         RETLW   A'Ó'                ;  
  112.         RETLW   A'B'                ;  
  113.         RETLW   A'A'                ;  
  114.         RETLW   A'-'                ;
  115.         RETLW   A'B'                ;
  116.         RETLW   A'I'                ;
  117.         RETLW   A'T'                ;
  118.         RETLW   A' '                ;
  119.         RETLW   A'M'                ;
  120.         RETLW   A'O'                ;
  121.         RETLW   A'D'                ;
  122.         RETLW   A'E'                ;
  123.         RETLW   A' '                ;
  124.         RETLW   A' '                ;
  125.         RETLW   A' '                ;
  126.         RETLW   H'0'                ;
  127.        
  128.         RETURN
  129.                  
  130.  
  131. TXT4    ADDWF   PCL,F
  132.         RETLW   A' '                ;
  133.         RETLW   A' '                ;
  134.         RETLW   A'2'                ;
  135.         RETLW   A'p'                ;  
  136.         RETLW   A'r'                ;  
  137.         RETLW   A'Ó'                ;  
  138.         RETLW   A'B'                ;  
  139.         RETLW   A'A'                ;  
  140.         RETLW   A'-'                ;
  141.         RETLW   A'B'                ;
  142.         RETLW   A'I'                ;
  143.         RETLW   A'T'                ;
  144.         RETLW   A' '                ;
  145.         RETLW   A'M'                ;
  146.         RETLW   A'O'                ;
  147.         RETLW   A'D'                ;
  148.         RETLW   A'E'                ;
  149.         RETLW   A' '                ;
  150.         RETLW   A' '                ;
  151.         RETLW   A' '                ;
  152.         RETLW   H'0'                ;
  153.        
  154.         RETURN
A hozzászólás módosítva: Ápr 22, 2020
(#) ktamas66 válasza menyus hozzászólására (») Ápr 22, 2020 /
 
TBL utasítások nincsenek ebben a PIC-ben.
A mellékelt kódban a PRINT rutin ír mi mindig egy egész sort egyszerre ( gondolom 20 karakteres LCD-d van mivel ennyi van a kódban). Ezt nem látom a kódodban.
A szövegek tárolásakor figyelni kell, hogy memóriában hol helyezkednek el, mivel az addwf PCL csak az alsó bájtot állítja, így nem lóghat túl a 256-os memóriahatáron. Ezt az ORG utasítással irányíthatod.
(#) menyus válasza ktamas66 hozzászólására (») Ápr 22, 2020 /
 
Igen, valóban a példakód 16 karakteres LCD re íródott, az egyém 20 karakteres. Valóban van még 2 rutin amit nem linkletem be, az "LCDaddr" és az "LCDdata"

  1. ;----- LCD ADDRES RUTIN -----------------------------------
  2. ;       Ez a rutin az lcdaddr-ben lévő adatot küldi az LCD-re
  3. ;       mint karakter memória címet (DD ADDR azaz karakter pozíció)
  4. LCD_addr
  5.         banksel lcdport         ; Bank0
  6.         movf    lcdaddr,w       ; Áttesszük a címet, a LCD-pozíció RAM-ba
  7.         movwf   lcdpos
  8.         bsf     lcdpos,7        ; Set DDRAM = 1 (bit7=1 : address set + 6bites DDRAM cím)
  9.  
  10.         movlw   0xf0            ; Felső nibble kiválasztása
  11.         andwf   lcdpos,w        ; Maszkoljuk a felső nibble-t
  12.         movwf   lcdport         ; LCD portra kitesszük,
  13. ;       lcdwr                   ; írás lesz (RW vezérlőbit),
  14.         lcdcmd                  ; parancs, nem adat (RS vezérlő bit),
  15.         enable                  ; kiírjuk.
  16.  
  17.         swapf   lcdpos,f        ; alsó-felső nibble csere
  18.         movlw   0xf0            ; maszk (ez már az alsó nibble lesz, csak felül)
  19.         andwf   lcdpos,w        ; Maszkoljuk a felső nibble-t
  20.         movwf   lcdport         ; LCD portra kitesszük,
  21. ;       lcdwr                   ; írás lesz (RW),
  22.         lcdcmd                  ; parancs, nem adat (RS),
  23.         enable                  ; kiírjuk.
  24.  
  25.         movlw   .4              ; 40usec várakozás
  26.         call    DELAY10
  27.         return
  28.  
  29. ;----- LCD DATA rutin -------------------------------
  30. ;       Ez a rutin az LCDDATA-ban lévő adatot kiírja az LCD-re,
  31. ;       az aktuális kursor pozícióba
  32. LCD_data
  33.         banksel lcdtris         ; Bank1
  34. ;       clrf    lcdtris         ; PortD mind out
  35.         MOVLW   B'00001111'
  36.         MOVWF   TRISD
  37.         banksel lcdport         ; Bank0
  38.         movlw   0xf0            ; Maszk felső nibble
  39.         andwf   lcddata,w       ; Adat byte maszkolása
  40.         movwf   lcdport         ; Kivitel a portra
  41. ;       lcdwr                   ; Adat kiírás (Write)
  42.         lcddat                  ; Adatot írok ki
  43.         enable                  ; Enable bit impulzus
  44.         swapf   lcddata,f       ; Alsó-felső nibble csere
  45.         movlw   0xf0            ; Maszk, máraz alsó nibble
  46.         andwf   lcddata,w       ; Adat byte maszk
  47.         movwf   lcdport         ; Kivitel a portra
  48. ;       lcdwr                   ; Adat kiírás (Write)
  49.         lcddat                  ; Adatot írok ki
  50.         enable                  ; Enable bit impulzus
  51.        
  52.         movlw   .4              ; 40usec várakozás
  53.         call    DELAY10
  54.         return


16F877 est használok

Az ORG al a program elején csak a kecdőcím 0x00 és az int 0x04 van megadva
(#) Hp41C válasza menyus hozzászólására (») Ápr 22, 2020 /
 
Szöbegek kiíratása PIC16 kontrollerekkel az alábbi módon történhet:

A program memóriában létre kell hozni a kiírandó szövegek karakter sorozatait:

  1. Szoveg1:  DT "Szoveg1",0
  2. Szoveg2:  DT "Szoveg 2",0
  3. Szoveg3:  DT "Valami más",0
  4. Szoveg4:  DT "Stb",0


Kell készíteni egy rutint, ami egy 16 bites változóban kapja a kezdőcímet: CIM és CIM+1
Hívás előtt fel kell tölteni a változót a kiírandó szöveg címével:
  1. movlw high(Szoveg2)
  2.   movwf CIM+1
  3.   movlw low(Szoveg2)
  4.   movwf CIM
  5.   call SzovegToLcd
  6.  
  7. SzovegToLcd
  8.   clrf Index
  9. Loop:
  10.   call GetNextChar
  11.   addlw 0            ; 0x00 kódú karakter a végjel
  12.   btfsc STATUS,Z  ; vége
  13.   return
  14.   call CharToLcd
  15.   incf Index,f
  16.   goto Loop
  17.  
  18. GetNextChar:
  19.   movf CIM+1,w
  20.   movwf PCLATH
  21.   movf CIM,w
  22.   addwf Index,w
  23.   btfsc STATUS,C   ; Laphatár ellenőrzése
  24.   incf PCLATH,f
  25.   movwf PCL        ; Nem kell return, hiszen a szövegelemek retlw utasítások
(#) menyus válasza Hp41C hozzászólására (») Ápr 22, 2020 /
 
Nagyon köszönöm a segítséget, megpróbálom így összehozni.
Következő: »»   1118 / 1203
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