Fórum témák

» Több friss téma
Fórum » PIC programozás
 
Témaindító: G-Lex, idő: Okt 24, 2005
Lapozás: OK   23 / 66
(#) zenetom válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Lehet tényleg nem nekem való ez a PIC-ezés?
Kicsit leredukáltam a kódot, de így csak 8db 0-t ír ki.
  1. CONVERSION_BIN                 ;ha egy változó értéke binárisan pl. '01110001' akkor ezt így írja ki LCD-re
  2.         CALL LCD_TORLES
  3.         CALL HOSSZU_DELAY
  4.         MOVLW d'8'
  5.         MOVWF SZAMLALO_COUNTER
  6. CONVERSION_BIN_ELSO_BYTE
  7.         MOVF SZAMLALO_COUNTER,F      
  8.         BTFSC STATUS,2                                        ; ha a STATUS Z bite 1 akkor a SZAMLALO_COUNTER 0, és ugrik végére
  9.         GOTO CONVERSION_BIN_VEGE                 
  10.         DECF SZAMLALO_COUNTER,F
  11.         BTFSS SZAMLALO_INFO_ELSO,SZAMLALO_COUNTER     ;ha a vizsgált bit 1 akkor ugrik és 1-et ír ki az LCD-re
  12.         CALL KIIR_NULLA
  13.         BTFSC SZAMLALO_INFO_ELSO,SZAMLALO_COUNTER     ;ha a vizsgált bit 1 akkor 1-et ír ki az LCD-re
  14.         CALL KIIR_EGY
  15.         GOTO CONVERSION_BIN_ELSO_BYTE
  16. CONVERSION_BIN_VEGE
  17.         RETURN
(#) Hp41C válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Szia!

Nézz utánna az "Instuction Set Summary" fejezetben, hogy milyen paraméterei vannak a btfss és a btfsc utasításnak....

Megfejtés a bitszám csak konstans (0..7) lehet, itt pedig egy változó címével (SZAMLALO_COUNTER_2) paraméterezed... A végrehajtott kód attól függ, milyen értéket vesz fel a SZAMLALO_COUNTER_2 címének utolsó 3 bitje...

Segítség: Ha már úgyis azt a fejezetet nézed, vizsgáld meg a léptető utasításokat is...

Továbbá a '0' kódját követi az '1' kódja, azaz (ord('1')=ord('0')+1), így előkészítheted a W-be a '0' kódját, ha a soron következő bit 1, akkor addlw 0x01, és máris írhatod ki...


- A STATUS regiszter bitjét írd Z -nek, olvashatóbb lesz a program.
- Ha nem ugrasz messzire, használhatod a bra ill a rcall utasításokat (csak 2 byte/darab).
- Ha a ciklus ellenőrzését a végére teszed, akkor a decfsz SZAMLALO_COUNTER,F is használható...

Szia
(#) zenetom válasza Hp41C hozzászólására (») Ápr 2, 2010 /
 
Köszi a segítséget!
Akkor a BSF és a BCF utasításhoz is csak konstans szám mehet ... lehet átfele írogatni egy-két sort
szerk.: 'work'ot se lehet megadni?
(#) kobold válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Ha nem gépeltem el nagyon, ez is működhet:
  1. CONVERSION_BIN
  2.         CALL    LCD_TORLES
  3.         CALL    HOSSZU_DELAY
  4.         MOVLW   0x80
  5.         MOVWF   SZAMLALO_COUNTER
  6. CONVERSION_BIN_ELSO_BYTE:
  7.         ANDWF   SZAMLALO_INFO_ELSO, W
  8.         BTFSS   STATUS, Z
  9.         GOTO    EZ_A_BIT_NEM_1
  10.         CALL    KIIR_EGY
  11.         GOTO    CIKLUSTESZT
  12. EZ_A_BIT_NEM_1:
  13.         CALL    KIIR_NULLA
  14. CIKLUSTESZT:
  15.         RRNCF   SZAMLALO_COUNTER, F
  16.         BTFSC   STATUS, Z
  17.         GOTO    CONVERSION_BIN_VEGE
  18.         MOVF    SZAMLALO_COUNTER, W
  19.         GOTO    CONVERSION_BIN_ELSO_BYTE
  20. CONVERSION_BIN_VEGE:
  21.         RETURN

ÉS-kapcsolattal, egy bitet jobbra tologatva teszteli a megadott bináris számot. Adatlap híján nem tudom, hogy a 18F1320-ban van-e RRNCF utasítás, ha nincs, olyat kell keresni, ami jobbra forgat CARRY nélkül (vagy törölgetni a CARRY-t forgatás előtt).
(#) zenetom válasza kobold hozzászólására (») Ápr 2, 2010 /
 
Köszi Neked is, közben írtam egy sokkal hosszabb, de jól működő eljárást.

Mégegy kérdés:
  1. movf    ADAT,0  ;W = ADAT
  2.         addwf   PCL,1   ;közvetett programmemória-címzés
  3.         goto    NULLA   ;itt folytatódik, ha ADAT = 0
  4.         goto    EGY     ;itt folytatódik, ha ADAT = 1
  5.         goto    KETTO   ;itt folytatódik, ha ADAT = 2
  6.         goto    HAROM   ;itt folytatódik, ha ADAT = 3
  7.         goto    NEGY    ;itt folytatódik, ha ADAT = 4

Az ugrás után rendesen megy tovább?
(#) zenetom válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Illetve ennyi van még róla mint leírás:
Idézet:
„A fenti programrészletben a GOTO utasítások száma tetszőlegesen növelhető egészen 255-ig, de ügyelni kell arra, hogy az összes GOTO utasítás ugyan azon a 256 szavas memórialapon legyen. Ha ez nem megoldható, akkor a közvetett címzés szabályainak megfelelően a PC programszámláló felső bájtját is be kell állítani.”
(#) trudnai válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
A 0 es 1 helyett hasznaldd a W es F definiciokat! A masik, hogy amit kesobb irtal, ugyelni kell a laphatarokra is, kulonben elmegy a program szal. Errol a temarol persze lehetne meg beszelni, mert van meg mit.

De amugy mit is szeretnel csinalni?
(#) zenetom válasza trudnai hozzászólására (») Ápr 2, 2010 /
 
Case utasítást asm-ben...
Tehát ha egy változó értéke pl. 5, akkor egy nullával teli másik változó 5. bitét beállítja 1-re.
(#) zenetom válasza zenetom hozzászólására (») Ápr 2, 2010 /
 
Találtam egy másikat az működik Bővebben: Link
(#) trudnai válasza zenetom hozzászólására (») Ápr 3, 2010 /
 
Es miert nem csinalsz valami ilyesmit inkabb:
  1. INCF    Valtozo,W
  2.     CLRF    temp
  3.     BSF     STATUS,C
  4. Shift
  5.     RLF     temp,F
  6.     DECFSZ  WREG,W
  7.     GOTO    Shift
(#) Hp41C válasza zenetom hozzászólására (») Ápr 3, 2010 / 1
 
Szia!

Néhány dolgot nem vettél figyelembe - 18F-en dolgozol

1 - A goto 4 (a bra csak 2) bájt, az adatot a 2. sor után az ugrások méretére kell igazítani
2 - A PCLATU és PCLATH regisztereket fel kell tölteni a 3. sor előtt. (A legegyszerűbb a movf PCL,w utasítással...)
3 - A táblázat a memória kapacitásáig növelhető, ha az átvitelt is kezeled...

Még mindig nem vetted figyelembe az ASCII kódtábla tulajdonságát:

Legyen a szamjegy változó értéke 0..9 közötti érték, ekkor a következő két sor a hozzá tartozó ASCII kódot adja:
movf szamjegy,w
addlw '0'

Tehát:
  1. CONVERSION_BIN
  2.       CALL    LCD_TORLES
  3.       CALL    HOSSZU_DELAY
  4.       MOVLW   0x08
  5.       MOVWF   SZAMLALO_COUNTER
  6. CONVERSION_BIN_ELSO_BYTE:
  7.       MOVLW   '0'
  8.       BTFSS   SZAMLALO_INFO_ELSO, 7
  9.       ADDLW   0x01
  10.       RCALL    KIIR_ASCII
  11.       RLNCF   SZAMLALO_INFO_ELSO,F
  12.       DECFSZ    SZAMLALO_COUNTER, F
  13.       BRA     CONVERSION_BIN_ELSO_BYTE
  14.       RETURN


Szia
(#) zenetom válasza trudnai hozzászólására (») Ápr 3, 2010 /
 
Ezt nemigazán értem
A "temp" telilesz nullákkal, akkor a forgatással hogyan kerül bele 1 ?

Hp41C: az RCALL utasítást azért írtad mert csak 1 byte-ot foglal, szemben a sima CALL-al, ami 2 byte-os?
Ja és a BTFSS helyett BTFSC kéne nem?
(#) trudnai válasza zenetom hozzászólására (») Ápr 3, 2010 /
 
Idézet:
„A "temp" telilesz nullákkal, akkor a forgatással hogyan kerül bele 1 ?”


Carry-n keresztul... De most latom RLF-et irtam RLCF helyett (nem is nagyon ertem miert kellett nekik megvaltoztatni a 18F-eknel az utasitas nevet, mindenesetre engem rendszeresen sikerul megzavarniuk veluk )

Idézet:
„az RCALL utasítást azért írtad mert csak 1 byte-ot foglal, szemben a sima CALL-al, ami 2 byte-os?”


Nyilvanvaloan igy tudsz program memoriat sporolni... Azonban az RCALL 1 szavas (2 byte), mig a CALL 2 szavas (4 byte)... Ugyanigy BRA 1 szavas, GOTO 2 szavas... Ha ugro tablakat raksz ossze 18F-en, akkor ezt is figyelembe kell venni, hogy a program memoria byte-os cimzessel rendelkezik (18F-en). Tehat az index erteket nem eleg hozza adni a PCL-hez, azt fel is kell szorozni BRA eseteben 2-vel, GOTO eseteben pedig 4-el. Ez az egy lapon tarolhato ugro tabla meretet erosen befolyasolja, hiszen BRA-bol max 128 lehet, mig GOTO-bol 64...
(#) Hp41C válasza zenetom hozzászólására (») Ápr 3, 2010 /
 
Szia!

- A bra ill. a rcall 2 byte-ot foglal, a goto és a call 4-et.
- Igazad van, btfsc kell....


Szia
(#) zenetom válasza trudnai hozzászólására (») Ápr 3, 2010 /
 
Akárhogyis nézem, én ezt nemértem hogyan működik
(#) trudnai válasza zenetom hozzászólására (») Ápr 3, 2010 /
 
  1. INCF    Valtozo,W   ; beteszi a valtozo+1 erteket W-be
  2.     CLRF    temp        ; kitorli temp-et
  3.     BSF     STATUS,C    ; Carry flag-et beallitja 1-be
  4. Shift
  5.     RLCF    temp,F      ; Carry-n keresztul shift-el (1 bekerul 0. poziciora
  6.     DECFSZ  WREG,W      ; --W; ha W 0 lett akkor atugorja GOTO-t
  7.     GOTO    Shift       ; csinalja tovabb a ciklus

Tehat ha Valtozoban 5 volt, akkor az 5. bit nel lesz a magas...
(#) csabino hozzászólása Ápr 21, 2010 /
 
Hali!

Tudna nekem valaki segíteni a következő rövid kis progi megírásában?

16F877-es procihoz

Van egy belső időzítő, ami elszámol egy bizonyos összegig, mondjuk 3 másodpercig, akkor kér egy megszakítást és fellvillant egy LED-et, majd folytatódik tovább a program.

Köszi előre is a segítségeteket!
(#) watt válasza csabino hozzászólására (») Ápr 21, 2010 /
 
Mi a kérdés?
(#) icserny válasza csabino hozzászólására (») Ápr 21, 2010 /
 
Itt találsz angol nyelvű leírást és mintaprogramot a timerek használatához.
(#) Bell válasza csabino hozzászólására (») Ápr 21, 2010 / 1
 
A megszakítás beállításához ezek kellenek, ha timer1-et használsz:
BANKSEL PIE1
BSF PIE1, TMR1IE ; Enable Timer1 interrupt
BANKSEL PIR1
BCF PIR1, TMR1IF
bsf INTCON,GIE
bsf INTCON,PEIE
A megszakításban:
regiszterek mentése...
clrf TMR1L
MOVLW felso ; Value to load into TMR1H
MOVWF TMR1H ; Write High byte
MOVLW also ; Value to load into TMR1L
MOVWF TMR1L ; Write Low byte
bsf LED
nop
nop
nop
bcf LED
bcf PIR1,TMR1IF
regiszterek vissza..
retfie
(#) csabino válasza Bell hozzászólására (») Ápr 22, 2010 /
 
köszönöm szépen!
(#) samson111 hozzászólása Ápr 22, 2010 /
 
Sziasztok!

Felturbóztam az öntözőrendszerem agyát (PIC18F452), minden ok is lenne, de nem tudom lementeni a beállításokat a saját EEPROM-jába. 60 byteról van szó, sem írni, sem olvasni nem tudom az EEPROM-ot. Olvasásnál 0-t kapok, írásnál a ciklusban a WR/EEIF bitre vágyakozik hiába. Mi lehet az oka?! Előre is köszönöm a segítségeteket!

eeprom_olvasas
...
movlw .60
movwf lepesszam
clrf eeadr
bcf eecon1, eepgd
bcf eecon1, cfgs
bsf eecon1, rd

eeprom_olvasas_1
movff eedata, postinc0
incf eeadr
decf lepesszam
bnz eeprom_olvasas_1
return

;----------------------------------------------------------
eeprom_iras

...
movlw .60
clrf eeadr
bcf eecon1, eepgd ; EEPROM kiválasztása
bcf eecon1, cfgs ; EEPROM kiválasztása
; bcf intcon, gie ; interruptok tiltása

eeprom_iras_1
movff indf0, eedata
bsf eecon1, wren ; az írás engedélyezése
bcf intcon, gie ; interruptok tiltása
;-----------------------------------------------------------------
movlw 55h
movwf eecon2 ; write 55h
movlw 0AAh
movwf eecon2 ; write AAh
bsf eecon1, wr ; BR bit engedélyezése, az írás megkezdése
;-----------------------------------------------------------------
bsf intcon, gie ; interruptok engedélyezése
; btfsc eecon1, wr ; hurok, vár amíg az írás kész és WR=0
; bra $-2
btfss pir2, eeif ; hurok, vár amíg az írás kész és EEIF=1
bra $-2
bcf pir2, eeif
bcf eecon1, wren ; az írás tiltása mert kész.
;-----------------------------------------------------------------

bsf eecon1, rd
movf eedata, .0
cpfseq postinc0 ; ellenőrzésre visszaolvasás
return ; itt hiányzik még a hibakezelés

eeprom_iras_tovabb
incf eeadr
decf lepesszam
bnz eeprom_iras_1

; bsf intcon, gie ; interruptok engedélyezése
return
(#) vilmosd válasza samson111 hozzászólására (») Ápr 22, 2010 /
 
Hali
Mi van ha WR bitet figyeled. Szerintem annak mukodni kell
  1. ; btfsc eecon1, wr ; hurok, vár amíg az írás kész és WR=0
  2. ; bra $-2
  3. btfss pir2, eeif ; hurok, vár amíg az írás kész és EEIF=1
  4. bra $-2

helyett:
  1. btfsc eecon1, wr ; hurok, vár amíg az írás kész és WR=0
  2.  bra $-2
  3. ;btfss pir2, eeif ; hurok, vár amíg az írás kész és EEIF=1
  4. ;bra $-2

Udv Vili
(#) samson111 válasza vilmosd hozzászólására (») Ápr 22, 2010 /
 
sajnos ugyanaz az eredmény, mindkettőt próbáltam...
(#) brato válasza samson111 hozzászólására (») Ápr 22, 2010 /
 
Üdv!

Nem tudom ez segít -e rajtad 16F628 és 16F877 -en működik hibátlanul az alábbi kód.
  1. eepromolvasas
  2.         MOVF    EEADR_TMP, W    ;Write address
  3.         BANKSEL EEADR
  4.         MOVWF   EEADR                   ;W-b§l EEADR-be
  5.         BANKSEL EECON1
  6.         BCF     EECON1, EEPGD   ;Adatmemˇria kivßlasztßsa
  7.         BSF     EECON1, RD              ;Olvasßs engedÚly
  8.         BANKSEL EEDATA
  9.         MOVF    EEDATA,W                ;Eeprombˇl W-be
  10.         BANKSEL EEADR_TMP
  11.         MOVWF   EEDATA_TMP              ;W-b§l EEDATA_TMP-be
  12.         RETURN
  13.  
  14. eepromiras
  15.         BANKSEL EECON1
  16.         BTFSC   EECON1, WR
  17.         GOTO    $-1
  18.         BANKSEL EEADR_TMP
  19.         MOVF    EEADR_TMP, W
  20.         BANKSEL EEADR
  21.         MOVWF   EEADR
  22.         BANKSEL EEDATA_TMP
  23.         MOVF    EEDATA_TMP, W
  24.         BANKSEL EEDATA
  25.         MOVWF   EEDATA
  26.         BANKSEL EECON1
  27.         BCF     EECON1, EEPGD
  28.         BSF     EECON1, WREN
  29.         MOVLW   0x55
  30.         MOVWF   EECON2
  31.         MOVLW   0xAA
  32.         MOVWF   EECON2
  33.         BSF     EECON1, WR
  34.         BCF     EECON1, WREN
  35.         BANKSEL PORTB
  36.         return
(#) pgabor2 válasza samson111 hozzászólására (») Ápr 22, 2010 /
 
Szia!


Minden olyan utasítás elé tegyél BANKSEL-t, ahol az előző utasítás más bankban levő változóra vonatkozik.
(#) samson111 válasza pgabor2 hozzászólására (») Ápr 22, 2010 /
 
Köszönöm a banksel tippeket, de vmi más lesz a hiba. Pont azért használtam movff-t, hogy ne kelljen bankolni. Azért kipróbáltam, de semmi változás. A debugger szerint minden regiszterben a korrekt érték van, csak semmi válasz nem jön az EEPROM-tól. Már azon gondolkodom, hogy hibás lenne?! Eddig még nem használtam. Mivel lehetne az EEPROM-ot tesztelésként teleírni, hogy egyáltalán írható-e?
(#) pgabor2 válasza samson111 hozzászólására (») Ápr 22, 2010 /
 
Az alábbi rutinok működnek 452 esetén:

EepromRead
movlb 15
movff Eeprom_addr,EEADR ; Cím másolása
bcf EECON1,EEPGD,1 ; Konfigurálás
bcf EECON1,CFGS,1
bsf EECON1,RD,1
nop
movff EEDATA,Eeprom_data ; Adat kiolvasás
return

EepromWrite
movff Eeprom_addr,EEADR ; Cím másolása
movff Eeprom_data,EEDATA ; Adat beírás
movlb 15
bcf EECON1,EEPGD,1 ; Konfigurálás
bcf EECON1,CFGS,1
bsf EECON1,WREN,1 ; írás engedélyezés
movlw 0x55 ; írásvédelem feloldása
movwf EECON2,1
movlw 0xAA
movwf EECON2,1
bsf EECON1,WR,1 ; írás engedélyezés
btfsc EECON1,WR,1 ; írás megtörtént?
bra $-2
bcf EECON1,WREN,1 ; írás tiltás
return


A "movlb 15" a 15. bankot választja ki, ebben van minden, a Microchip által dekralált változó. Ha 128-nál kevesebb saját változód van, akkor úgy is programozhatsz, hogy ne kelljen a BANKSEL-lel kínlódnod. Az utasításkészlet lehetőséget ad erre, ha az utasítás "a" operandusa "0", akkor a gyárilag deklarált változók a 128-255 byte pozíciókból érhetők el. Ha nincs megadva az "a" értéke, akkor az utolsó bank kiválasztás érvényes.
(#) samson111 válasza pgabor2 hozzászólására (») Ápr 22, 2010 /
 
Sajnos nálam nem megy... néztem, hogy még code protect mellett is el kellene érnie az EEPROM-ot. Vsz a program memoriába kell elmentenem http://www.hobbielektronika.hu/forum/wtopic.php?topic_id=305&ppid=6...pop=1#

Azért ha van még vmi ötletetek ill. tanácsotok, hogyan lehetne meggyőződni, hogy működik egyáltalán az EEPROM, írjátok meg. És köszönöm a segítséget!
(#) Hp41C válasza samson111 hozzászólására (») Ápr 22, 2010 /
 
Szia!

- Minden megszakítást le kell tiltani, míg az írási szekvenciát elküldöd.
  1. DATAEEWR:
  2.         movwf   EEDATA          ; Store data
  3.         bcf             INTCON,GIEH     ; Disable interrupts
  4.         bcf             INTCON,GIEL
  5.         bsf             EECON1,WREN
  6.         movlw   0x55                    ; Write unlock sequence
  7.         movwf   EECON2 
  8.         movlw   0xAA
  9.         movwf   EECON2
  10.         bsf             EECON1,WR
  11.         bsf             INTCON,GIEH     ; Enable interrupts
  12.         bsf             INTCON,GIEL
  13. WRE2:
  14.         btfsc           EECON1,WR       ; Wait end of write
  15.         bra             WRE2
  16.         bcf             EECON1,WREN
  17.         return
  18.  
  19. DATAEERD:
  20.         bcf             EECON1,EEPGD; Point to EEDATA
  21.         bcf             EECON1,CFGS
  22.         bsf             EECON1,RD       ; Get data
  23.         nop
  24.         movf            EEDATA,w
  25.         return

- Nem kell a BANKSEL-lel vesződni: A fordító a speciális célú regiszterek elérésénél az ACCESS bankot használja, ami a 0. lap alsó (0x00..0x7F) 128 ram rekeszéből és a 15. lap felső 128 speciális célú regiszteréből áll.
Egyébként a pic18F sorozatnál az utasítások zöménél egy harmadik paraméter is van a memória elérési mód megadására. A default értéke az 'A' azaz ACCESS. A másik értéke a BANKED.
pl.:
  1. movf PORT,w,A ;  az ACCESS bankot használja
  2.      bsf INTCON,GIE ;  az ACCESS bankot használja
  3.      movwf TAROL,A ; az ACCESS bankot használja
  4.      clrf  COUNTER,BANKED ; az aktuális bankot használja
Következő: »»   23 / 66
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