PIC16F874 Nejde nastavit PORTD jako výstupní
Moderátor: Moderátoři
PIC16F874 Nejde nastavit PORTD jako výstupní
Programuju zrovna výše zmíněný procesor a nejdou zapsat nuly do TRISD.
Zkoušel jsem tyto příkazy:
---------------------------
movlw 0x00
tris PORTD (Tohle vyhodí chybu už při kompilaci v MPLAB IDE)
--------------------------
movlw 0x00
movwf TRISD (MPLAB chybu nevyhodí, ale nefunguje to)
--------------------------
Nefunguje ani příkaz BCF
Zkoušel jsem i poslat nuly přímo na adresu, kde je TRISD, ale také bez úspěchu.
Podle datasheetu lze port D použít pro paralelní přenos, nebo jako I/O port. Implicitně je funkce portu D jako paralelního vypnutá. Před rokem jsem programoval PIC18F452 a u něho nebyl problém a taky má port D jako I/O, nebo paralelní.
Nevíte někdo, kde může být chyba?
Heuréka
Kód: Vybrat vše
LIST P=16F874, R=DEC
INCLUDE<P16F874.INC>R=DEC nahraď podle vkusu , já většinou v základu používám desítkovou soustavu , v případě že potřebuju binární číslo , používám zavedenou formu " B'ooooooo' " .
Nezaměnil si náhodou revizi procesoru ? (to áčko za názvem)
Ještě k tomu tris - odnauč se jej používat. Je to zastaralý příkaz z dob 16F84ky , u nových bývá funkční jen z důvodu zpětné kompatibility , sám výrobce však používání již nedoporučuje . Třeba u 16F887 by ti tris neprošel .
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Kód: Vybrat vše
banksel REGISTRTohle se přeloží jako instrukce bcf nebo bsf příslušných RPx bitů ve Status. Pozor ale na jednu chybu v MPLABu. Když napíšeš makro hned na návěští, vyhodí to chybu "Illegal label":
Kód: Vybrat vše
org 0
goto Start
(...)
Start banksel 0 ;- takhle ne!
movlw xx
movwf TRISA
Pro nepřímé adresování se dá používat makro "bankisel". U některých procesorů ale vůbec není potřeba.
V INC souboru jsem sice našel přímo nadefinovanou "proměnnou?" RP0 na přepínání banky, ale když když sem chtěl použít BSF, tak MPLABu chyběla hodnota
např. BSF STATUS,RP0 a musí to fungovat pokud máš dobře zaveden soubor XXX.INC.
Pseudo inštrukcia banksel vygeneruje dve inštrukcie
Kód: Vybrat vše
bsf/bcf STATUS, RP0
bsf/bcf STATUS, RP1
Ja si to zjednodušujem
Kód: Vybrat vše
#define _RP0_C bcf STATUS,RP0
#define _RP0_S bsf STATUS,RP0
#define _RP1_C bcf STATUS,RP1
#define _RP1_S bsf STATUS,RP1
; a v programe píšem
_PR0_S
....
....
_RP0_C
Ak je v bankoch zmätok, robí to psie kusy.
V stránkovaní programu tiež je dobé používať nejaký systém.
Viděl jsem prima fintu, která zpřehlední program v .asm, je hned jasné kde, která banka je. Samozřejmě přepínání i zde zůstává na programátorovi.
BANK1 EQU 0x80 ; Reduce assembler whining
...
př.
banksel OSCCAL
movwf OSCCAL ^ BANK1
Načtení registru do W
Načtu do registru, jehož adresu jsem si nadefinoval v inicializaci nějakou hodnotu (Je to přijatý bajt z dálkového ovladače), např b'10101010'
Hodnotu toho bajtu chci vzít do W registru a pak ji poslat podprogramu, který ji vypíše na displej. Všechno funguje až na to, že hodnota toho bajtu co se vypíše na displej je vždy stejná i když by neměla.
Stalo se mi to už jednou, když jsem nastavil do registru hodnotu a pak na ni použil DECF a poté ji načetl do W registru a vypsal na displej. Tohle jsem dělal ve smyčce, takže by měli být hodnoty na displeji pokaždé o jedničku menší, ale nestalo se tak... hodnoty byly pořád stejné (byl to přesně tenhle bajt: 00100111 ), který se pořád vypisoval. Můžete někdo prosím poradit čím to je?
Zkoušel jsem ten program i v PIC simulátoru a tam to dělalo to samé, takže je zřejmě něco co musím do programu dopsat, jen nevím co.
Ač to dobře vím , stejně se mi to u rozsáhlejších projektů někdy z únavy či blbosti stane a to je potom nadělení to najít
Pokud máš svůj registr nadefinovaný na adrese 27x0Fh , je diagnoza jasná .
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Kód: Vybrat vše
TESTx EQU 1 ; 1..test, 0...neprekladaj
..
..
if TESTx == 1 THEN
; test program
..
..
.
endif
po odladení prepíšem iba jeden riadok.
frpr666 píše:Banky jsou nutné zlo u těchto jednočipů. Při ruce je dobré mít vytištěný plánek registrů/bank z datasheetu.
Viděl jsem prima fintu, která zpřehlední program v .asm, je hned jasné kde, která banka je. Samozřejmě přepínání i zde zůstává na programátorovi.
BANK1 EQU 0x80 ; Reduce assembler whining
...
př.
banksel OSCCAL
movwf OSCCAL ^ BANK1
Ked volas prerusenia a niekde sa to zamota(prep bank reg.) mas co robit.Ked taka eventualita pride len raz za den...a + ked ma ten soft 5kB (v asm)a po zbernici canbus ovlada 2 dalsie uP....
Uz jednoznacne len C.Dnes nie je problem z vykonom uP(a cenou ide) ako pred 10r.
. OK souhlasím, že C je velký přínos. O .asm versus .C na 8-bitech už bylo popsáno hodně diskuzí. Podle mě nikomu neuškodí:1/ když se podívá do datasheetu na podporované instrukce a 2/ když se občas podívá do disassembly .lstRe: ...Uz jednoznacne len C...
Na druhou stranu v .asm lze dělat neuvěřitelné kousky. Tohle to dokázal borec na atmega88!!!
http://en.kendincos.net/video-hprnprhj-craft-by-lft.html
http://www.linusakesson.net/scene/craft/