PIC16F874 Nejde nastavit PORTD jako výstupní
Moderátor: Moderátoři
PIC16F874 Nejde nastavit PORTD jako výstupní
Zdravím.
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?
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
Tak konečně to funguje. Dík moc za radu! Přepínání mezi bankami teda není moc user friendly. Nejdřív jsem si musel nadefinovat adresu STATUS registru a až potom jsem mohl použít BSF. Nějak tomu ale nerozumím. 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. Jak mu může chybět hodnota, když chci nastavit jeden bit na jedničku to nechápu. A tak jsem se podíval do INC pozorněji a byly tam vypsány všechny položky status registru pod sebou a každá měla svoji adresu. Jestli je to nadlouho, tak to nemusíš vypisovat. Jen by mě to zajímalo proč to tak je
Používáš na začátku
?
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 .
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
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Pokud se ti nechce sledovat který registr je v které bance, doporučuji používat předdefinované makro "banksel".
Tohle 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":
Pro nepřímé adresování se dá používat makro "bankisel". U některých procesorů ale vůbec není potřeba.
Kód: Vybrat vše
banksel REGISTR
Kód: Vybrat vše
org 0
goto Start
(...)
Start banksel 0 ;- takhle ne!
movlw xx
movwf TRISA
např. BSF STATUS,RP0 a musí to fungovat pokud máš dobře zaveden soubor XXX.INC.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
Naposledy upravil(a) Chenzee dne 13 srp 2010, 21:52, celkem upraveno 1 x.
Žádnej učenej z nebe nespadl ...
Bez prepínania bank-ov sa ani nezaobídeš.
Pseudo inštrukcia banksel vygeneruje dve inštrukcie
Ja si to zjednodušujem
Ak je v bankoch zmätok, robí to psie kusy.
V stránkovaní programu tiež je dobé používať nejaký systém.
Pseudo inštrukcia banksel vygeneruje dve inštrukcie
Kód: Vybrat vše
bsf/bcf STATUS, RP0
bsf/bcf STATUS, RP1
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
V stránkovaní programu tiež je dobé používať nejaký systém.
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
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
Opět po dlouhé době zdravím. Potřebuju teď poradit s něčím jiným.
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.
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.
Nepoužil si náhodou omylem pro načtení do W místo MOVF Nazev_Registru,0 třeba MOWLV Nazev_Registru ? Častá chyba . Prnví ti skutečně zkopíruje hodnotu , kdežto druhý příkaz ti do W registru veme adresu tebou nadefinovaného registru !
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á .
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á .
Naposledy upravil(a) kony2807 dne 26 srp 2010, 12:35, celkem upraveno 1 x.
________________________________
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Co psal KONY je i můj případ. Pro přesnější pomoc bývá lepší sem dát program / část programu, kde ti to dělá neplechu ... ono se hned líp hledá. Dle tvého zadání je to spíše věštění ... důvodů může být XYZ. Např. mě se ještě stává, že si pro jednodužší simulaci programu do místa, kde se načítá nějaká hodnota "z venčí" zařadím movlw .xx a tím testuji ... no a po odladění ji někdy zapomenu odmazat ... někdy si to uvědomím hned, ale někdy na to koukám jak puk
Žádnej učenej z nebe nespadl ...
Chenzee: na to si definujem
po odladení prepíšem iba jeden riadok.
Kód: Vybrat vše
TESTx EQU 1 ; 1..test, 0...neprekladaj
..
..
if TESTx == 1 THEN
; test program
..
..
.
endif
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....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
Uz jednoznacne len C.Dnes nie je problem z vykonom uP(a cenou ide) ako pred 10r.
Už druhý krát strihám a furt je to krátke
. 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- ... y-lft.html
http://www.linusakesson.net/scene/craft/