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   907 / 1207
(#) Fricu válasza Hp41C hozzászólására (») Márc 8, 2017 /
 
Pic Simulátor IDE

ezeknek utánanézek.
A pickit 3-al ugyanúgy küldöm át a a programot, mint korábban: PGD/PGC/MCLR kombóval (ICSP)

877a.jpg
    
(#) Firefighter1 válasza icserny hozzászólására (») Márc 8, 2017 /
 
Akkor az kilőve..
Már csak az a kérdés hogy a klon mennyire klon....?
Használható e vagy sem...
(#) gazspe hozzászólása Márc 8, 2017 /
 
Sziasztok! Regiszter értékét tudok decimális változóval megadni?
(#) Elektro.on válasza Fricu hozzászólására (») Márc 8, 2017 /
 
Ezzel a szimulátorral figyelj oda, mert nem mindent úgy csinál mint a fizkai PIC. Az sem érdekli, hogy a quartzot, hogy konfigolod. Simán lefut a neki beállított frekivel. Más gondom is volt vele de részletekre már nem emlékszem.
(#) Bakman válasza gazspe hozzászólására (») Márc 8, 2017 /
 
Tudsz, a fordító minden számrendszert átfordít binárisra, csak azt értik a digitális eszközök.
(#) Hp41C válasza gazspe hozzászólására (») Márc 8, 2017 /
 
Milyen programban?
(#) gazspe válasza Hp41C hozzászólására (») Márc 8, 2017 /
 
Bocsánat, valóban szűkszavú voltam. MPlab C. Egy 8 bites regiszter utolsó 4 bitjét szeretném függvény alapján változtatni, csak decimális környezetben otthonosabban mozgok.
A hozzászólás módosítva: Márc 8, 2017
(#) Fricu válasza Elektro.on hozzászólására (») Márc 9, 2017 /
 
A hardver kvarc beállítása jó (4MHz), másik progi fut rajta. A Simulátor beállítása is ugyan az, mint működő változatnál, tehát ez sem okozhatja a gondot.
Ha logikai hiba lenne (rossz cím, hivatkozás, stb., akkor a szimulátor azt kihozná (annyira gagyi nem lehet), gondolom.
Én inkább valami időzítési dologra gondolok, ebben vannak mindenféle késleltetések, hogy az LCD jól működhessen. Ezeknek az ütemezése lehet a gond - érzésem szerint, de ehhez már kevés vagyok, ezért kértem tanácsot.
(#) Hp41C válasza gazspe hozzászólására (») Márc 9, 2017 / 1
 
A C alapértelmezett számrendszere a tizes.
  1. unsigned char munka;
  2.  
  3. munka = 241; // 0xF1
  4. munka ^= (munka ^ 12)  & 0x0F; // Csak az alsó 4 bit fog megváltozni

A két sor lefuttatása után a munka tartalma 252 = 0xFC.
(#) Hp41C válasza Fricu hozzászólására (») Márc 9, 2017 /
 
Idézet a PIC16F87xA adatlapjából (DS39582B-page 45):
Idézet:
„Low-Voltage ICSP Programming (LVP) is enabled by default which disables the RB3 I/O function. LVP must be disabled to enable RB3 as an I/O pin and allow maximum compatibility to the other 28-pin and 40-pin mid-range devices.”

Ha LVP engedélyezett és az RB3 az LCD modul D7 kivezetésére magy (4 bites mód), a láb lebeghet illetve a modulban levő felhúzó ellenállás magas szintre viheti. Ha magas szint előfordulhat rajta akárcsk rövid ideig, a kontroller programozási módba léphet...

Már írtál majdnem egy oldalt, hoyg miért nem fut a 16F84 -re írt program a 16F877A -n, nem kellenhe kipróbálni a javasoltakat?

Pokoli szerencséd van:
- A del változóba betöltött érték maximális értéke 15, azaz nem érinti a 4. és 5. bitet. Mi történne, ha a programot kiegészítenéd megszakítás kezeléssel. A PIR1 gegiszter írása azonnal kiváltja a megszakítást azokon a biteken, ahol 1 érték íródik be és a hozzá tartozó megszakítás engedélyezett.
- A cmd azaz PIR2 regisztert valamiért nem használja a program... Szerintem valaki rájött, hogy hiányoznak a nem megvalósított bitek...

Teszteld le a szimulátort:
Miután a cmd változót nem használja a program, töröljük ki.
  1. ; data segment
  2.  CBLOCK 0x00C                  
  3.  del,                                 ; variables for passing the parameters
  4.  temp, i                                ; local variables
  5.  ENDC

Működik a szimulátorban így is???
A hozzászólás módosítva: Márc 9, 2017
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
Természetesen magam is próbálkozok folyamatosan. Egyenlőre kevesebb, mint több sikerrel.
Nem azt várom, hogy megcsinálja valaki helyettem, csak ötleteket, amit köszönök.
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
Ki fogom próbálni
(#) eSDi válasza Fricu hozzászólására (») Márc 9, 2017 /
 
Üdv!

Nagy valószínűséggel időzítési probléma lesz, ahogy írtad. A valós eltelt idő számlálója 200ms-ot mutat, ebből 100ms-nak kellene lennie minimum az LCD inicializálásnak és ehhez jön hozzá még a többi. De ha már használod ezt a programot, miért nem írod meg BASIC-ben? Főleg, ha csak ennyi lenne a kiírási feladat. Nem lenne egy egetverően nagy feladat, főleg úgy hogy a példák között van ilyen, azt hiszem pont 16F877A-ra.
(#) Hp41C válasza eSDi hozzászólására (») Márc 9, 2017 /
 
Nem jó új vágányra terelni a tapasztalatlan programozót.
Idézet:
„Értelemszerűen a hardver ugyan az (ami a 84a-val ment), csak PIC van cserélve és átdugdosva az eltérő lábkiosztás (és szám) miatt.”

Ha abból indulok ki, amit az idézetben állít, akkor a fenti hibákat kijavítva, az összekötéseket újra megvizsgálva, az esetleg hiányzó szűrőkondenzátorokat beépítve (az összehuzalozás megnöveli az induktivitásokat, így a kondenzátorokat közvetlenül a 16F877A táp és föld lábaihoz) és az eredetileg használt 4MHz -es kristállyal működnie kellene. 4MHz -nél egy utasítás 1us a 16F87xA -n is...
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
A szűrőkondi közvetlenül a foglalat lábára forrasztva (100nF kerámia, 2x a 877-nél mert két helyen kap tápot), 10KOhm-os felhúzóellenállás az MCLR lábra, kontrasztpoti, mind ok.
És ahogy írom és mutatom 84a-val megy a led villogtatás (3-as kép), és a kiíratás is.
Az angol az eredeti, a magyar már az enyém - 2-es, 1-es kép.
877-el is megy a fénysor, tehát a panel, PIC, oszcillátor jó.
A szimulátoron mindkét típus azonosan fut le, kijelzéssel.
A panelon viszont csak a 84-el.
Lehet, hogy nem túl jó a program, de a 84-en megy.
Próbálom tovább..
(#) Fricu válasza eSDi hozzászólására (») Márc 9, 2017 /
 
Milyen példák között?
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
A cmd törlése a programból a panelon eredménytelen, a szimulátor csak a felső sort írja ki, azt is hibásan:

4.JPG
    
(#) Hp41C válasza Fricu hozzászólására (») Márc 9, 2017 /
 
Nos akkor mégiscsak kezeli a kontroller sajátosságait a szimulátor. A cmd törlésével a temp került a PIR2 (a 7., 5., 2., 1. bit nem létezik, mindig 0) regiszterbe, de ezen a változón keresztül küldi a programod az adatokat az LCD -nek. Azt csinálja, amit vártam: Elrontja az adatokat...
Ha megfogadod a tanácsokat és
- a cblock 0x00C -t kijavítod végre cblock 0x020 -ra,
- a konfigurációs sor megadását kiegészíted az _LVP_OFF -fal,
működni fog....
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
No, átírtam a programot, hogy ne a B portot, hanem a D-t használja, így nincs "érdekütközés".
A fordítás és feltöltés lefut, de kijelzés az LCD-n nincs.
A szimulátor szerint ez is jó:

5.JPG
    
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
Máris nézem
(#) Fricu válasza Hp41C hozzászólására (») Márc 9, 2017 /
 
Hát, kivettem a cmd-t, átírtam a cblock-ot és kikapcsoltam az LVP-t is a konfigban.
Eredmény: szimulátor ok, nem ír be fals karaktereket, de a kijelző továbbra is kuka.
Több ötletem nincs, elkezdem az időzítést piszkálni. Az az érzésem, ott a baj.

  1. TITLE  "lcd4.asm"               ; working with an LCD in the 4-bit mode
  2.  List P=16F877a, R=DEC
  3.  INCLUDE "p16F877a.inc"
  4.  
  5. ; data segment
  6.  CBLOCK 0x020                  
  7.  del                            ; variables for passing the parameters
  8.  temp, i                                ; local variables
  9.  ENDC
  10.  
  11. ; code segment
  12.  PAGE
  13.  __CONFIG _CP_OFF  & _PWRTE_ON  & _WDT_OFF & _HS_OSC & _LVP_OFF
  14.  
  15.   org 0                                 ; start program at the beginning of mem
  16.         goto start
  17.  
  18. msg1                                    ; first message to display
  19.         addwf   PCL, f
  20.         dt "  Welcome to", 0
  21.  
  22. msg2                                    ; second message to display
  23.         addwf   PCL, f
  24.         dt "PIC programming", 0
  25.  
  26. start
  27.         bsf     STATUS, RP0             ; change to BANK 1     
  28.         clrf    TRISB ^ 0x80            ; enable RB1-RB7 for output
  29.         movlw   0x7F                    ; enable internal Pull-Ups
  30.         movwf   OPTION_REG ^ 0x80
  31.         bcf     STATUS, RP0             ; back to BANK 0
  32.  
  33.         call    initLCD                 ; initialize LCD display
  34.  
  35. ; output of the top row (msg1)
  36.         clrf    i                      
  37. L1      movf    i, w
  38.         call    msg1                    ; get the next char
  39.         iorlw   0                       ; end of string?
  40.         btfsc   STATUS, Z      
  41.         goto    L2                      ; YES - jump out of the loop
  42.         call    writeDATA               ; NO - send it to LCD
  43.         incf    i, f                    ; update the char index
  44.         goto    L1
  45.  
  46. L2      movlw   0xC0
  47.         call    writeCMD                ; move the cursor to the second line
  48.         clrf    i                       ; clear the index of the second string
  49.  
  50. ; output the bottom row (msg2)
  51. L3      movf    i, w                                   
  52.         call    msg2                    ; get the next char
  53.         iorlw   0                       ; end of string?
  54.         btfsc   STATUS, Z                      
  55.         goto    L4                      ; YES - jump out of the loop
  56.         call    writeDATA               ; NO - send it to LCD
  57.         incf    i, f                    ; update the char index
  58.         goto    L3
  59.  
  60. L4  goto $                              ; endless loop
  61.  
  62.  
  63. ; procedures
  64. initLCD                                 ; initialize LCD right after power up
  65.         movlw   15
  66.         movwf   del
  67.         call    delay                   ; a 15 msec delay after power is on
  68.  
  69.         movlw   3
  70.         movwf   PORTB                   ; start LCD init process
  71.         movlw   5
  72.         movwf   del    
  73.         call    delay                   ; wait for 5 msec      
  74.  
  75.         movlw   3
  76.         movwf   PORTB                   ; start LCD init process
  77.         bsf     PORTB, 4                ; toggle the LCD Enable pin
  78.         bcf     PORTB, 4
  79.         movlw   5
  80.         movwf   del    
  81.         call    delay                   ; wait for 5 msec
  82.  
  83.         bsf     PORTB, 4                ; repeat the reset command (2nd time)
  84.         bcf     PORTB, 4
  85.         movlw   40                      ; wait for 200 usec
  86.         sublw   1
  87.         sublw   0
  88.         btfss   STATUS, Z
  89.         goto    $-3
  90.  
  91.         bsf     PORTB, 4                ; repeat the reset command (3rd time)
  92.         bcf     PORTB, 4
  93.         movlw   40                      ; wait for 200 usec
  94.         sublw   1
  95.         sublw   0
  96.         btfss   STATUS, Z
  97.         goto    $-3
  98.  
  99.         movlw   2                       ; initialize LCD 4-bit mode
  100.         movwf   PORTB
  101.         bsf     PORTB, 4                ; toggle the LCD Enable pin
  102.         bcf     PORTB, 4
  103.  
  104.         movlw   0x28                    ; 2-line mode
  105.         call    writeCMD
  106.  
  107.         movlw   1
  108.         call    writeCMD                ; clear display
  109.  
  110.         movlw   5                       ; wait for 5 msec after clearing
  111.         movwf   del
  112.         call    delay
  113.  
  114.         movlw   0x06                    ; cursor move after each char
  115.         call    writeCMD
  116.  
  117.         movlw   0x0E                    ; turn on LCD and enable cursor
  118.         call    writeCMD
  119.         return
  120.  
  121. writeCMD                                ; write to LCD a 1-byte command in W
  122.         movwf   temp
  123.         swapf   temp, w
  124.         andlw   0x0F                    ; leave only the high 4 bits in W
  125.         movwf   PORTB
  126.         bsf     PORTB, 4                ; toggle the E bit
  127.         bcf     PORTB, 4
  128.        
  129.         movfw   temp                    ; proceed with the low bit
  130.         andlw   0x0F
  131.         movwf   PORTB
  132.         bsf     PORTB, 4                ; toggle the  bit      
  133.         bcf     PORTB, 4
  134.  
  135.         movlw   40                      ; wait for 200 usec
  136.         sublw   1
  137.         sublw   0
  138.         btfss   STATUS, Z
  139.         goto    $-3
  140.         return
  141.  
  142. writeDATA                               ; write to LCD a 1-byte data in W
  143.         movwf   temp
  144.         swapf   temp, w
  145.         andlw   0x0F                    ; leave only the lower 4 bits in W     
  146.         movwf   PORTB
  147.         bsf     PORTB, 5                ; sending data
  148.         bsf     PORTB, 4                ; toggle the E bit
  149.         bcf     PORTB, 4
  150.        
  151.         movfw   temp                    ; proceed with the low bit
  152.         andlw   0x0F
  153.         movwf   PORTB
  154.         bsf     PORTB, 5                ; sending data
  155.         bsf     PORTB, 4                ; toggle the  bit      
  156.         bcf     PORTB, 4
  157.  
  158.         movlw   5                       ; wait for 5 msec
  159.         movwf   del
  160.         call    delay
  161.         return
  162.  
  163. delay                                   ; a delay for del milliseconds
  164.         movlw   200
  165.        
  166.         sublw   1                       ; this loop takes 5us*200 = 1ms
  167.         sublw   0                       ; for PIC16F877A @ 4 Mhz
  168.         btfss   STATUS, Z
  169.         goto    $-3
  170.  
  171.         decfsz  del,f
  172.         goto    delay
  173.         return
  174.  
  175.  end
A hozzászólás módosítva: Márc 9, 2017

6.JPG
    
(#) Pali79 válasza Fricu hozzászólására (») Márc 9, 2017 /
 
Az a szimulátor nem sok mindenre jó, mint ahogy Te is tapasztalod.
(#) Fricu válasza Pali79 hozzászólására (») Márc 9, 2017 /
 
Van jobb (letölthető szabadon)?
(#) Pali79 válasza Fricu hozzászólására (») Márc 9, 2017 /
 
Persze, az MPLAB SIM.
(#) Fricu válasza Pali79 hozzászólására (») Márc 9, 2017 /
 
Köszi, próbálom.
De előre szólok, hogy sikítok, ha azzal is jó - és nem megy a kijlző
(#) eSDi válasza Hp41C hozzászólására (») Márc 10, 2017 /
 
Az a probléma, hogy egy BASIC-re kifejlesztett IDE szimulátorát használja az MPLAB-ban írt programjához. Így szerintem csak saját magával szúr ki, mert sok funkciótól elesik. Példának okáért a program követéstől, amit gondolom az MPLAB szimulátorában is megtalálni. Én csak arra akartam rávilágítani, hogy ha assembly nyelven szeretne megtanulni programozni, akkor arra koncentráljon és használja az MPLAB IDE-t, ha BASIC-ben, akkor pedig ezt. Nem jó keverni a dolgokat, mert abból ilyen problémák származnak.
(#) eSDi válasza Fricu hozzászólására (») Márc 10, 2017 /
 
Ha újabb verziót használsz, akkor a c:\Documents and settings\"sajátnév"\AppData\Roaming\OshonSoft\PIC Simulator IDE\ helyen találod meg.
Ha régebbit, akkor a program telepítési mappájában. Vagy az oshonsoft.com címen.
(#) Fricu válasza eSDi hozzászólására (») Márc 10, 2017 /
 
Nem tudom miért lenne Basicra fejlesztve? A hex fájlt kell betallózni, azt futtatja. Hogy mivel hoztad létre nem mindegy?
Maga a szimulátor gépközeli környezet, munkaregiszterrel, gépi kódokkal, stb.
Épp ezért csak egyszerűbb pgm-et lehet igazán követni (nekem), a bonyolultabb fordítmányok már nem láthatók át (vissza) se assembly-be, pláne nem Basic.re.
Szerintem..
A másikat még nem volt időm nézni - de fogom.
(#) ramok válasza Hp41C hozzászólására (») Márc 10, 2017 /
 
Szia Hp41C
A másodszorra küldött fájlok közül én is lefordítottam az .ASM -et Mplab 8.9 el. Ugyan az a HEX
lett min amit küldtél. Ezt beégetve már müködik a frekimérő. Na nem egyből lett jó.
--Gerjedt az MB506 előosztó. Ezt sikerült megoldani.
--Alacsony fr bemenetről átkapcsolva előosztós bemenetre és nagy bemenő jelszint esetén
a kijelzőről eltünt minden. Ilyenkor leállt az oszcillátor egy rövid időre. Később hiába indult
ujra, nem jelzett ki semmit. A hiba a tápellátásban volt. Ezekben az esetekben a +5V-on
negatív és pozitív ugrások jelentek meg. 9V-os elemmel táplálva ezek megszüntek.
Még a pontos 10 MHz-et kell beállítani h pontosan mérjen.

Összefoglalva: Köszi a sgítséget a program átírásával. Minden elismerésem.

ramok
A hozzászólás módosítva: Márc 10, 2017

DSC00757.JPG
    
(#) Fricu válasza Hp41C hozzászólására (») Márc 10, 2017 /
 
No, megy...
Kombináltam a te javaslatod a portcserével és lőn fényesség a kijelzőn!
Valamiért a portB-vel nem megy, hiába az LVP_OFF. Átírva portD-re jó.
Nem teljesen értem, de megy. A cmd maradt.

  1. TITLE  "lcd4.asm"               ; working with an LCD in the 4-bit mode
  2.  List P=16F877a, R=DEC
  3.  INCLUDE "p16F877a.inc"
  4.  
  5. ; data segment
  6.  CBLOCK 0x020
  7.  del, cmd                               ; variables for passing the parameters
  8.  temp, i                                ; local variables
  9.  ENDC
  10.  
  11. ; code segment
  12.  PAGE
  13.  __CONFIG _CP_OFF  & _PWRTE_ON  & _WDT_OFF & _HS_OSC & _LVP_OFF
  14.  
  15.   org 0                                 ; start program at the beginning of mem
  16.         goto start
  17.  
  18. msg1                                    ; first message to display
  19.         addwf   PCL, f
  20.         dt "Hello Nagyfiam!!", 0
  21.  
  22. msg2                                    ; second message to display
  23.         addwf   PCL, f
  24.         dt "PIC16F877a progi", 0
  25.  
  26. start
  27.         bsf     STATUS, RP0             ; change to BANK 1     
  28.         clrf    TRISD ^ 0x80            ; enable RD(B)1-RD(B)7 for output
  29.         movlw   0x7F                    ; enable internal Pull-Ups
  30.         movwf   OPTION_REG ^ 0x80
  31.         bcf     STATUS, RP0             ; back to BANK 0
  32.  
  33.         call    initLCD                 ; initialize LCD display
  34.  
  35. ; output of the top row (msg1)
  36.         clrf    i                      
  37. L1      movf    i, w
  38.         call    msg1                    ; get the next char
  39.         iorlw   0                       ; end of string?
  40.         btfsc   STATUS, Z      
  41.         goto    L2                      ; YES - jump out of the loop
  42.         call    writeDATA               ; NO - send it to LCD
  43.         incf    i, f                    ; update the char index
  44.         goto    L1
  45.  
  46. L2      movlw   0xC0
  47.         call    writeCMD                ; move the cursor to the second line
  48.         clrf    i                       ; clear the index of the second string
  49.  
  50. ; output the bottom row (msg2)
  51. L3      movf    i, w                                   
  52.         call    msg2                    ; get the next char
  53.         iorlw   0                       ; end of string?
  54.         btfsc   STATUS, Z                      
  55.         goto    L4                      ; YES - jump out of the loop
  56.         call    writeDATA               ; NO - send it to LCD
  57.         incf    i, f                    ; update the char index
  58.         goto    L3
  59.  
  60. L4  goto $                              ; endless loop
  61.  
  62.  
  63. ; procedures
  64. initLCD                                 ; initialize LCD right after power up
  65.         movlw   15
  66.         movwf   del
  67.         call    delay                   ; a 15 msec delay after power is on
  68.  
  69.         movlw   3
  70.         movwf   PORTD                   ; (B)start LCD init process
  71.         movlw   5
  72.         movwf   del    
  73.         call    delay                   ; wait for 5 msec      
  74.  
  75.         movlw   3
  76.         movwf   PORTD                   ; (B)start LCD init process
  77.         bsf     PORTD, 4                ; (B)toggle the LCD Enable pin
  78.         bcf     PORTD, 4        ; (B)
  79.         movlw   5
  80.         movwf   del    
  81.         call    delay                   ; wait for 5 msec
  82.  
  83.         bsf     PORTD, 4                ; (B)repeat the reset command (2nd time)
  84.         bcf     PORTD, 4        ; (B)
  85.         movlw   40                      ; wait for 200 usec
  86.         sublw   1
  87.         sublw   0
  88.         btfss   STATUS, Z
  89.         goto    $-3
  90.  
  91.         bsf     PORTD, 4                ; (B)repeat the reset command (3rd time)
  92.         bcf     PORTD, 4        ; (B)
  93.         movlw   40                      ; wait for 200 usec
  94.         sublw   1
  95.         sublw   0
  96.         btfss   STATUS, Z
  97.         goto    $-3
  98.  
  99.         movlw   2                       ; initialize LCD 4-bit mode
  100.         movwf   PORTD       ; (B)
  101.         bsf     PORTD, 4                ; (B)toggle the LCD Enable pin
  102.         bcf     PORTD, 4        ; (B)
  103.  
  104.         movlw   0x28                    ; 2-line mode
  105.         call    writeCMD
  106.  
  107.         movlw   1
  108.         call    writeCMD                ; clear display
  109.  
  110.         movlw   5                       ; wait for 5 msec after clearing
  111.         movwf   del
  112.         call    delay
  113.  
  114.         movlw   0x06                    ; cursor move after each char
  115.         call    writeCMD
  116.  
  117.         movlw   0x0E                    ; turn on LCD and enable cursor
  118.         call    writeCMD
  119.         return
  120.  
  121. writeCMD                                ; write to LCD a 1-byte command in W
  122.         movwf   temp
  123.         swapf   temp, w
  124.         andlw   0x0F                    ; leave only the high 4 bits in W
  125.         movwf   PORTD       ; (B)
  126.         bsf     PORTD, 4                ; (B)toggle the E bit
  127.         bcf     PORTD, 4        ; (B)
  128.        
  129.         movfw   temp                    ; proceed with the low bit
  130.         andlw   0x0F
  131.         movwf   PORTD       ; (B)
  132.         bsf     PORTD, 4                ; (B)toggle the  bit
  133.         bcf     PORTD, 4        ; (B)
  134.  
  135.         movlw   40                      ; wait for 200 usec
  136.         sublw   1
  137.         sublw   0
  138.         btfss   STATUS, Z
  139.         goto    $-3
  140.         return
  141.  
  142. writeDATA                               ; write to LCD a 1-byte data in W
  143.         movwf   temp
  144.         swapf   temp, w
  145.         andlw   0x0F                    ; leave only the lower 4 bits in W     
  146.         movwf   PORTD       ; (B)
  147.         bsf     PORTD, 5                ; (B)sending data
  148.         bsf     PORTD, 4                ; (B)toggle the E bit
  149.         bcf     PORTD, 4        ; (B)
  150.        
  151.         movfw   temp                    ; proceed with the low bit
  152.         andlw   0x0F
  153.         movwf   PORTD       ; (B)
  154.         bsf     PORTD, 5                ; (B)sending data
  155.         bsf     PORTD, 4                ; (B)toggle the  bit
  156.         bcf     PORTD, 4        ; (B)
  157.  
  158.         movlw   5                       ; wait for 5 msec
  159.         movwf   del
  160.         call    delay
  161.         return
  162.  
  163. delay                                   ; a delay for del milliseconds
  164.         movlw   200
  165.        
  166.         sublw   1                       ; this loop takes 5us*200 = 1ms
  167.         sublw   0                       ; for PIC16F877a @ 4 Mhz
  168.         btfss   STATUS, Z
  169.         goto    $-3
  170.  
  171.         decfsz  del,f
  172.         goto    delay
  173.         return
  174.  
  175.  end


Erről jut eszembe a kérdés:
az ICSP-n keresztüli felprogramozásnál hogy szokták megoldani, hogy az RB6/PGD RB7/PGC lábakon keresztül menjen a feltöltés, aztán a program viszont adat kimenetként (bemenetként) használja?
Amúgy nem ez volt itt is gond? A kijelzőhöz csak az alsó 4-bit van használva RB0-3, és a RB6-7 szabad volt, de az RB3-is többfunkciós (LVP).
Köszi az eddigieket
Következő: »»   907 / 1207
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