Stránka 1 z 2

TMR0 16f84a

Napsal: 25 srp 2007, 19:06
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

Napsal: 25 srp 2007, 20:14
od caven
Možná by bylo dobrý kdyby jsi sem hodil zdroják

Napsal: 25 srp 2007, 21:05
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.

Napsal: 26 srp 2007, 15:11
od caven
a kde máš zapsán vektor přerušení ???

Napsal: 26 srp 2007, 15:17
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.

Napsal: 26 srp 2007, 20:36
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ý?

Napsal: 27 srp 2007, 08:12
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.

Napsal: 27 srp 2007, 22:41
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???

Napsal: 28 srp 2007, 08:00
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?

Napsal: 28 srp 2007, 11:16
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.

Napsal: 28 srp 2007, 11:25
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.

Napsal: 28 srp 2007, 13:38
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.

Napsal: 28 srp 2007, 14:08
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.

Napsal: 29 srp 2007, 22:21
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é.

Napsal: 30 srp 2007, 08:22
od Piitr
Za málo. To je bezva, že to šlape.