PIC16F874 Nejde nastavit PORTD jako výstupní

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Seiten
Příspěvky: 3
Registrován: 11 srp 2010, 02:00

PIC16F874 Nejde nastavit PORTD jako výstupní

#1 Příspěvek od Seiten »

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?

Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 02:00
Bydliště: Ostrava

#2 Příspěvek od kony2807 »

Zkus místo tris příkazu použít přepnutí banky na správnou stránku registrů ( BSF INTCON,...) a náslené movlw a movwf . Nezapomeň se po initu vrátit zase zpět do banky 0 .
________________________________
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek

Uživatelský avatar
Seiten
Příspěvky: 3
Registrován: 11 srp 2010, 02:00

Heuréka

#3 Příspěvek od Seiten »

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 :-)

Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 02:00
Bydliště: Ostrava

#4 Příspěvek od kony2807 »

Používáš na začátku

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

Uživatelský avatar
MartinOV
Příspěvky: 112
Registrován: 01 dub 2010, 02:00

#5 Příspěvek od MartinOV »

Pokud se ti nechce sledovat který registr je v které bance, doporučuji používat předdefinované makro "banksel".

Kód: Vybrat vše

banksel REGISTR
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":

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.

Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 02:00
Bydliště: Vysočina

#6 Příspěvek od Chenzee »

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.
Naposledy upravil(a) Chenzee dne 13 srp 2010, 21:52, celkem upraveno 1 x.
Žádnej učenej z nebe nespadl ...

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#7 Příspěvek od procesor »

Bez prepínania bank-ov sa ani nezaobídeš.
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.

Uživatelský avatar
Burajko
Příspěvky: 1803
Registrován: 21 srp 2009, 02:00

#8 Příspěvek od Burajko »

Pre toto pri vacsich softoch pouzivam c.99% pripadov padu softov bol bank...
A kaslem na cely microchip.
Už druhý krát strihám a furt je to krátke

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#9 Příspěvek od frpr666 »

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

Uživatelský avatar
Seiten
Příspěvky: 3
Registrován: 11 srp 2010, 02:00

Načtení registru do W

#10 Příspěvek od Seiten »

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.

Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 02:00
Bydliště: Ostrava

#11 Příspěvek od kony2807 »

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á .
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

Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 02:00
Bydliště: Vysočina

#12 Příspěvek od Chenzee »

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 :lol: ... někdy si to uvědomím hned, ale někdy na to koukám jak puk
Žádnej učenej z nebe nespadl ...

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#13 Příspěvek od procesor »

Chenzee: na to si definujem

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.

Uživatelský avatar
Burajko
Příspěvky: 1803
Registrován: 21 srp 2009, 02:00

#14 Příspěvek od Burajko »

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.
Už druhý krát strihám a furt je to krátke

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#15 Příspěvek od frpr666 »

Re: ...Uz jednoznacne len C...
. 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 .lst
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/

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“