Přerušení od TMR0

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
markoni
Příspěvky: 2312
Registrován: 30 říj 2006, 00:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

Přerušení od TMR0

#1 Příspěvek od markoni »

Zdravím
Pořád nemohu pochopit jak napsat program který by při přetečení po 1 sekundě registru TMRO skočil na podprogram mám tady ukázku který jsem opsal s Chipona1

Kód: Vybrat vše

call START
  ORG 4

 INTR MOVWF MEM_W
    SWAPF STATUS,W
     MOVWF MEM_S
     BCF STATUS,RP0
     NOP
     NOP
     NOP
     NOP
     NOP
     MOVLW 100
     MOVWF TMR0
     INCF TMR,F
     MOVFW TMR
     XORLW 100
     BTFSS STATUS,Z
     GOTO CAS_1
     CLRF TMR
     INCF SEC,F
     MOVFW SEC
     XORLW 60
     BTFSS STATUS,Z
     goto CAS
     CLRF SEC
     INCF MIN,F
     MOVFW MIN
     XORLW 60
     BTFSS STATUS,Z
     GOTO CAS
     CLRF MIN
     INCF HOD,F
     MOVFW HOD
     XORLW 24
      BTFSC STATUS,Z
      CLRF HOD
      goto CAS_1
 CAS     MOVLW 132
      ;CALL Z_CAS
  CAS_1
      BCF INTCON,T0IF
      SWAPF MEM_S,W
      MOVWF STATUS
      SWAPF MEM_W,F
      SWAPF MEM_W,W
     RETFIE
START
  BSF STATUS,RP0
  MOVLW B'00110001'
  MOVWF TRISB
  MOVLW B'11000001'
  MOVWF OPTION_REG
  BCF STATUS,RP0
MOVLW B'10100000'
 MOVWF INTCON
s nop
 goto s
end
 

co je na tom špatně? díky
MiloPs3

#2 Příspěvek od MiloPs3 »

CAU, me to v simulatoru funguje ale nesedi cas, jakej mas krystal ci osc. ?
pri 4Mhz mi to skoci na obsluhu SEC za 63mS,skus jinak nastavit preddelicku :idea:
Přílohy
Untitled.asm
(1.22 KiB) Staženo 236 x
Uživatelský avatar
relatko
Příspěvky: 85
Registrován: 08 úno 2009, 00:00

#3 Příspěvek od relatko »

Nazdar.
V prílohe je môj program na časovač ktorý po štarte nahodí na displej 8:00:00 a odpočítava až na 0:00:00.(Koľko času ešte budem trčať v práci)Má chybu 1sekundu za osem hodín.
Kryštál 4Mhz na "na sebe" dva 22p kondíky.Predelička je nastavená na delenie 32-timi,a počas prerušenia sa dekrementuje hodnota v registri:cislo až kým nie je rovná nule.Potom sa ešte vykoná rutinka:
vypočeta, a nasleduje samotný podprogram ktorý sa má vykonať 1x za sekundu.
Snáď Ti to pomôže.
Přílohy
casovac.asm
(8.53 KiB) Staženo 240 x
Uživatelský avatar
markoni
Příspěvky: 2312
Registrován: 30 říj 2006, 00:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#4 Příspěvek od markoni »

Pořád nemohu pochopit jak při 4MHz krystalu nastavit přerušení každou 1 sekundu prosím vás hodně podrobně mi to někdo vysvětlete řekneme na PIC16F628A abych to pochopil taky já :oops:díky
Uživatelský avatar
jankop
Příspěvky: 679
Registrován: 04 dub 2007, 00:00
Kontaktovat uživatele:

#5 Příspěvek od jankop »

Je to velmi jednoduché. Přerušení TMR0 s periodou 1s nejde s krystalem 4Mhz udělat.
Uživatelský avatar
relatko
Příspěvky: 85
Registrován: 08 úno 2009, 00:00

#6 Příspěvek od relatko »

markoni píše:Pořád nemohu pochopit jak při 4MHz krystalu nastavit přerušení každou 1 sekundu prosím vás hodně podrobně mi to někdo vysvětlete řekneme na PIC16F628A abych to pochopil taky já :oops:díky


Takže.
-načítaš do reg. OPTION_REG hodnotu B'00000011'
čím nastavíš TMR0 ako čítač setovaný vnútorným oscilátorom a priradíš pred neho preddeličku/32-timi.
-načítaš do reg INTCON hodnotu B'10100000' čím umožníš pretušenie len od pretečenia TMR0.
-Ako náhle dôjde k tomuto prerušeniu ,dekrementujem hodnotu v reg.cislo a kontrolujem či nie je náhodou rovná nule.-Ak nie je rovná nule ,vrátime sa z prerušenia a pokračujeme v hlavnom programe.V mojom prípade k zobrazovaniu hodnôt na displeji.
Keď ale hodnota v reg.cislo bude nula ,skočí na kratučkú zpožďovaciu rutinku vypočeta (kde sa trošku zdrží program)a po jej skončení program skáče na podprogram vypočet .V momente začiatku podprogramu výpočet uplinula 1 sekunda .
Pracujem PIC-mi asi 5 mesiacov a toto je môj prvý "veľký" výtvor.
Odporúčam školu na pandatrone,datasheety k picom,učebnicu prog.pic1 a 2.Z pandatronu mám niektoré časti tohoto programu.(Preručenie,inicializáciu MCU).
Relays.
Uživatelský avatar
markoni
Příspěvky: 2312
Registrován: 30 říj 2006, 00:00
Bydliště: Poblíž Zlína
Kontaktovat uživatele:

#7 Příspěvek od markoni »

Odporúčam školu na pandatrone,datasheety k picom,učebnicu prog.pic1 a 2.Z pandatronu mám niektoré časti tohoto programu.(Preručenie,inicializáciu MCU).

potřeboval přesný link na tu školu díky
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#8 Příspěvek od Andrea »

relatko píše:Keď ale hodnota v reg.cislo bude nula ,skočí na kratučkú zpožďovaciu rutinku vypočeta (kde sa trošku zdrží program)

A k čemu tam to zpoždění je?
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#9 Příspěvek od Atlan »

lebo to je PIC nie AVR tj 8bit delic vs. 16bit delič
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#10 Příspěvek od Andrea »

Atlan píše:lebo to je PIC nie AVR tj 8bit delic vs. 16bit delič

Cože? 8O
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#11 Příspěvek od Atlan »

aha... tak asi na nejake casove doladenie aby to malo 1s to prerusenie. uvidime ked napise....

PIC ma 8 bit TMR0 a tym padom treba nieco sof osetrit napr prerusenie kazdych 10ms tych krat 100 aby bola 1s
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#12 Příspěvek od Andrea »

10ms s 8bit čítačem neuděláš, pokud to umí předděličku jen 32. Ale nějak mi ty počty nesedí, 4MHz / 32 / 256 / 244 = 2Hz, není ta předdělička 64?
To zpoždění je asi korekce 36 tiků časovače, aby vyšla přesně sekunda. Ale čistější by asi bylo počkat, až čítač dočítá do 36 a vynulovat ho.

Edit: Navíc koukám, že PIC16F628A má hned tři timery a tudíž spoustu možností jak generovat 1s bez nutnosti strkat někam zpožďovací smyčky.
Edit2: Tak předdělička je 16, ne 32 jak se tu píše a základní hodiny pro čítače jsou CLK/4. To mi ty počty mají vycházet, když se tu takhle mystifikuje. Pak ovšem nechápu, proč je zrovna 16, proč není víc, ušetřila by se spousta zbytečných přerušení.
Uživatelský avatar
relatko
Příspěvky: 85
Registrován: 08 úno 2009, 00:00

#13 Příspěvek od relatko »

Andrea píše:10ms s 8bit čítačem neuděláš, pokud to umí předděličku jen 32. Ale nějak mi ty počty nesedí, 4MHz / 32 / 256 / 244 = 2Hz, není ta předdělička 64?
To zpoždění je asi korekce 36 tiků časovače, aby vyšla přesně sekunda. Ale čistější by asi bylo počkat, až čítač dočítá do 36 a vynulovat ho.

Edit: Navíc koukám, že PIC16F628A má hned tři timery a tudíž spoustu možností jak generovat 1s bez nutnosti strkat někam zpožďovací smyčky.
Edit2: Tak předdělička je 16, ne 32 jak se tu píše a základní hodiny pro čítače jsou CLK/4. To mi ty počty mají vycházet, když se tu takhle mystifikuje. Pak ovšem nechápu, proč je zrovna 16, proč není víc, ušetřila by se spousta zbytečných přerušení.

Zdravím.
Tá preddelička je naozaj 16-timy,ospravedlňujem sa.
Šlo by to deliť aj 32 aj 64-mi,no počas písania programu som to skúšal najprv bez zpožďovacej rutinky kde mi výhodnejšie vychádzal menší deliaci pomer preddeličky a väčšie číslo ktoré s počas prerušenia dekrementuje.Nakoniec son aj tak musel použiť spomínaciu rutinku na mierne (jemné) doladenie 1sekundy.
Relatko.
Odpovědět

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