Stránka 1 z 1

PIC16F874 Nejde nastavit PORTD jako výstupní

Napsal: 11 srp 2010, 22:55
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?

Napsal: 11 srp 2010, 23:21
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 .

Heuréka

Napsal: 12 srp 2010, 00:16
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 :-)

Napsal: 12 srp 2010, 08:15
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 .

Napsal: 12 srp 2010, 10:32
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.

Napsal: 13 srp 2010, 20:46
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.

Napsal: 13 srp 2010, 21:22
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.

Napsal: 14 srp 2010, 00:06
od Burajko
Pre toto pri vacsich softoch pouzivam c.99% pripadov padu softov bol bank...
A kaslem na cely microchip.

Napsal: 16 srp 2010, 20:46
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

Načtení registru do W

Napsal: 25 srp 2010, 02:00
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.

Napsal: 25 srp 2010, 06:10
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á .

Napsal: 25 srp 2010, 06:53
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

Napsal: 25 srp 2010, 07:23
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.

Napsal: 26 srp 2010, 01:19
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.

Napsal: 26 srp 2010, 20:24
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/