Fórum témák
» Több friss téma |
Fórum » PIC programozás
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.
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
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?
Ha nem gépeltem el nagyon, ez is működhet:
É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).
Köszi Neked is, közben írtam egy sokkal hosszabb, de jól működő eljárást.
Mégegy kérdés:
Az ugrás után rendesen megy tovább?
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.”
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?
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.
Találtam egy másikat az működik Bővebben: Link
Es miert nem csinalsz valami ilyesmit inkabb:
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:
Szia
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? 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...
Szia!
- A bra ill. a rcall 2 byte-ot foglal, a goto és a call 4-et. - Igazad van, btfsc kell.... Szia
Akárhogyis nézem, én ezt nemértem hogyan működik
Tehat ha Valtozoban 5 volt, akkor az 5. bit nel lesz a magas...
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!
Itt találsz angol nyelvű leírást és mintaprogramot a timerek használatához.
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
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
Hali
Mi van ha WR bitet figyeled. Szerintem annak mukodni kell
helyett:
Udv Vili
sajnos ugyanaz az eredmény, mindkettőt próbáltam...
Üdv!
Nem tudom ez segít -e rajtad 16F628 és 16F877 -en működik hibátlanul az alábbi kód.
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.
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?
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.
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!
Szia!
- Minden megszakítást le kell tiltani, míg az írási szekvenciát elküldöd.
- 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.:
|
Bejelentkezés
Hirdetés |