TMR0 16f84a

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

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

TMR0 16f84a

#1 Příspěvek od ok1f »

Mám ještš jeden problém: nefunguje mi TMR0, mám ho nastavený, aby čítal impulsy na RA4, poté ho přesouvám do W a následně zobrazuji binárně na port B. a je v něm pořád 1, nic se neděje. Kde asi dělám chybu? Prosím poraďte. Díky

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#2 Příspěvek od caven »

Možná by bylo dobrý kdyby jsi sem hodil zdroják

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#3 Příspěvek od ok1f »

BSF STATUS,RP0
clrf trisb
BCF STATUS,RP0

movlw b'11101000'
option

Start movlw tmr0
movwf portb
goto Start

Je možný, že dělám nějakou chybu, za kterou bych se měl stydět. Budiž mi omluvou, že jsem začátečník, úplný samouk a starší ročník k tomu.

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#4 Příspěvek od caven »

a kde máš zapsán vektor přerušení ???

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#5 Příspěvek od caven »

Já bych to napsal tak
;***************************************
nějaká hlavička pprogramu, tzn. nadefinování proměných atd
;***************************************

poté

org h"00"
goto start_programu

org h"04"
goto preruseni

;***************************************
ted ta čás co jsi měl, nevím tet jestě jestli máš dobře nastený option registr ae snad jo


startprogramu BSF STATUS,RP0
clrf trisb
BCF STATUS,RP0

movlw b'11101000'
option

stop goto stop ;zde jakoby zastavíš procesor a čeká jenom na přerušení

proruseni movlw tmr0
movwf portb
goto Stop


Snad jsi to pochopil pokud ne tak dej vědět.

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#6 Příspěvek od ok1f »

Vektor přerušení nemám, to je věc, se kterou jsem zatím nepracoval. Totiž já jsem s pic začal ze zájmu, sice už to nějaký pátek je, ale vzhledem k tomu, že se jimi zabývám jen když mám možnost, prokousávám se dost pomalu kupředu. No a přerušení jsem tenkrát nějak jen naťukl a protože jsem ho nepotřeboval, tak jsem se zabýval jinými problémy. Nějaký program, který mi řídí bufíka v autě, už jsem stvořil, ale protože ho chci zdokonalit, potřebuji snímat hallovým snímačem otáčky ventilátoru a v závislosti na nich měnit jeho výkon (zp. vazba). Zkoušel jsem ty impilsy ze snímače čítat do registru, ale nastal problém se zpožděním proc. při měření. Prostě buď se čítaly impulsy, nebo regulovalo. Impulsy jsou relativně pomalé, měření muselo trvat poměrně dlouho... Prostě tudy cesta asi nevede. A tak mne napadlo použít TMR0, o kterém se domnívám, že by mohl čítat při každem cyklu, procesor by mohl stíhat regulaci a podle potřeby bych se jen ptal na stav TMR0 nebo ho nuloval. Je to reálný?

Piitr

#7 Příspěvek od Piitr »

Já myslím, že chceš kopírovat hodnotu registru tmr0 do portb.
Pak ale nesmíš použít "movlw tmr0", ale "movf tmr0, w".
To tvoje øešení naète do w pøímo uvedenou hodnotu, tj. v tomto pøípadì adresu registru tmr0.

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#8 Příspěvek od ok1f »

RADIX DEC
CONFIG 0x3FF9

CBLOCK 0x0C
ENDC

ORG 0

CLRF TMR0

BSF STATUS,RP0
MOVLW B'11111'
MOVWF TRISA

MOVLW B'00000000'
MOVWF TRISB

MOVLW B'00011111'
MOVWF OPTION_REG

MOVLW B'00011111'
MOVWF INTCON

BCF STATUS,RP0
ZPOMAL1 equ 12h
ZPOMAL2 equ 13h
ZPOMAL3 equ 14h
ZPOMAL4 equ 15h



START MOVF OPTION_REG,0

MOVWF PORTB


CALL cas0
GOTO START



cas0 movlw 1
movwf ZPOMAL4

NASTAV1 movlw 1
movwf ZPOMAL3

NASTAV2 movlw 20
movwf ZPOMAL2

NASTAV3 movlw 10
movwf ZPOMAL1

clrwdt

NASTAV4 decfsz ZPOMAL1,1
goto NASTAV4
decfsz ZPOMAL2,1
goto NASTAV3
decfsz ZPOMAL3,1
goto NASTAV2
decfsz ZPOMAL4.1
goto NASTAV1
return

Jasně, to jsem se upsal, dík. Ale v předchozích pokusech jsem to měl správně a stejně to nechodilo. V tom programu výše uvedeném se snažím zobrazit Option - výsledkem je celý portb na log. 1. Kde jen dělám tu zásadní chybu???

Piitr

#9 Příspěvek od Piitr »

Hmm, to je divný.
Chyby máš 2, ale asi by se mìly projevovat jinak.
1) Když èteš OPTION_REG, tak jsi zrovna v nulté stránce. Musíš dát pøed ètení BSF STATUS,RP0 a za ètení zase BCF STATUS,RP0. Takhle se ti neète OPTION_REG, ale TMR0, což je ale divný, protože pak by se ty hodnoty mìly mìnit a ne být trvale na 1.
2)Stejnou chybu máš hned na zaèátku, kde nuluješ TMR0, ale nepøepnul ses do nulté stránky. Takhle mùžeš nulovat i OPTION_REG. Ono se to asi neprojeví, protože bit RP0 je po inicializaci nastavenej na 0, ale není to hezké.

Takže nevím, proè to nejde. Kdyžtak to zkus oživovat postupnì. Nejdøív si vyzkoušej porty. Tøeba na ten B dávej konstantu a koukej, jestli tam je. Pak zkoušej složitìjší vìci. Taky ten PIC mùže být spálenej?

Piitr

#10 Příspěvek od Piitr »

Tøeba zkus jen toto:

org 0
bsf status, rp0
clrf trisb
bcf status, rp0
movlw 85
movwf portb
xxx goto xxx

Na portu b by mìly být nìkteré bity na 0 a nìkteré na 1.
Jestli ani tohle nejde, tak ti asi ten pic vùbec nenaskoèí.
Mùžou být špatnì hodiny nebo reset. To chce promìøit.

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#11 Příspěvek od ok1f »

Děkuji za informace, nemám teď možnost vše odzkoušet, snad večer. Pic je ok, když do něj nahraju jiný program, vše je v pohodě. Chyba je v programu. Ještě bych se chtel zeptat, jak by se měl zapojit, jestli to není problém, procesor na počítač, abych ho nemusel neustále přendávat z programátoru (Pony prog) do zkušební desky (doma dělaná, obsahuje pouze krystal, na PA tlačítka a na PB LED). To jsou už stovky vyndat/zandat...

A ještě jeden dotaz: když budu mít SW v pořádku, bude se v TMR0 zvyšovat stav s každým impulsem na RA 4? Nezávisle na pracovním kmitočtu procesoru? Ten je mnohonásobně vyšší, než pulsy na RA 4.

Piitr

#12 Příspěvek od Piitr »

Já jsem taky ten PIC poøád zandaval a vyndaval. Nìjak to ale zapojit jde, aby se programoval uvnitø zapojení. Je to popsáno v datasheetu. Já to ale nikdy nepoužil.

Ty máš v OPTION_REG hodnotu B'00011111'. Proto se ti bude TMR0 zvyšovat podle hodin PICu, každý takt o jednièku. RA4 to bude ignorovat.

Pokud chceš, aby TMR0 èítal impluzy na RA4, tak musíš zmìnit hodnotu v OPTION_REG na B'00101111' nebo B'00111111'. Ta první hodnota zpùsobí, že to reaguje na vzestupnou hranu, ta druhá na sestupnou.
Já to teda nikdy nepoužil, ale podle datasheetu to tak má být.

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#13 Příspěvek od ok1f »

No, až bude všechno makat jak má, tak třeba žačnu experimentovat s programováním v obvodu. Já jsem do datasheet koukal, je to tam. Ale jak vidíš, mám ted jiné problémy. Díky za rady, ozvu se, co je nového.

Uživatelský avatar
ok1f
Příspěvky: 239
Registrován: 11 zář 2006, 02:00

#14 Příspěvek od ok1f »

Teprve ted jsem se dostal zase k pracovnímu stolu, přepsal jsem v reg option jednu nulu na jedničku, nahrál do procesoru a ono to dělá, co má, t.j. čítá a zobrazuje impulsy. Několik dní se s tím po večerech trápím a popravdě řečeno, nechápu, kde jsem dělal tu chybu. Konkrétně tento registr byl nejsledovanější a myslím, že jindy jsem tam tuto chybu sice neměl, ale byla tam zase jiná. Např. nesprávná banka.

Fajn, mám radost. Děkuji za rady, dál zase pokročím sám a až zase narazím a nebudu si vědět rady, poprosím tě ještě o postrčení kupředu. Ještě jednou dík a pokud by se mi podařilo to programování v zapojení, ozvu se také.

Piitr

#15 Příspěvek od Piitr »

Za málo. To je bezva, že to šlape.

Odpovědět

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