Stránka 1 z 1

Přerušení od TMR0

Napsal: 11 črc 2009, 11:26
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

Napsal: 11 črc 2009, 13:53
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:

Napsal: 11 črc 2009, 15:56
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.

Napsal: 12 črc 2009, 19:18
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

Napsal: 12 črc 2009, 20:28
od jankop
Je to velmi jednoduché. Přerušení TMR0 s periodou 1s nejde s krystalem 4Mhz udělat.

Napsal: 12 črc 2009, 21:00
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.

Napsal: 12 črc 2009, 21:27
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

Napsal: 12 črc 2009, 21:32
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?

Napsal: 12 črc 2009, 21:42
od Atlan
lebo to je PIC nie AVR tj 8bit delic vs. 16bit delič

Napsal: 12 črc 2009, 21:52
od Andrea
Atlan píše:lebo to je PIC nie AVR tj 8bit delic vs. 16bit delič

Cože? 8O

Napsal: 12 črc 2009, 22:14
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

Napsal: 12 črc 2009, 22:29
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í.

Napsal: 13 črc 2009, 06:28
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.