Zaslal: st srpen 11 2010, 21:55 Předmět: 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?
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
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
?
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
Pokud se ti nechce sledovat který registr je v které bance, doporučuji používat předdefinované makro "banksel".
kód:
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":
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
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.
Zaslal: st srpen 25 2010, 1:00 Předmět: 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.
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á . _________________ ________________________________
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Naposledy upravil kony2807 dne čt srpen 26 2010, 11:35, celkově upraveno 1 krát.
Založen: Jun 26, 2007 Příspěvky: 464 Bydliště: Vysočina
Zaslal: st srpen 25 2010, 5:53 Předmět:
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 ...
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.
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
. 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!!!
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.