ATTiny - přerušení od čítače/časovače 0

Zdravím, nějak se nemohu vyrovnat s nastavením č/č 0, režim CTC, přerušení voláno při schodě TCT0=OCR0A. Výcuc asm:

ldi reg,0b00000010 ;CC0 - režim CTC, volá přerušení při schodě
out tccr0,reg ;
ldi reg,200 ;přednastavení na čítání do 200 než dojde ke
out tcnt0,reg ;schodě a volá se přerušení na .org14
ldi reg,0b0000001 ;schoda - A
out timsk,reg ;povol přerušení CC0 při schodě
ldi reg,250 ;TCNT0 počítá do 250,
out ocr0a,reg ;a při schodě je voláno přerušení
sei ;povol globální přerušení v SREG

Když dám v AVR studiu F7, tak mi napíše chybu - undefined symbol ocr0a. Proč? Má čítač/časovač 0 OCR0A a OCR0B? Je chyba v zápisu asm? Přerušení následně ošetřím na adrese 14 (jmp někam). Podle Block Diagram jo. Bohužel jsem neobjevil žádný popis MCU 2313 v češtině. Stačí mě nasměrovat a já se už budu prát, ale jen v asm. Díky za každou pomoc.

Zdar.

Očividně jsi plně nepochopil funkci čítače.
Pro plné pochopení ti doporučuji prostudovat knihu:
Práce s mikrokontroléry ATMEL AVR.

Pokud se mrkneš na uložto.cz, tak ji tam jistě najdeš.
V knize je perfetní překlad funkcí timerů.

V každém datašítu je tabulka “Register sumary”, kde je seznam všech IO registrů.

Typuju, že jsi použil soubor “2313def.inc”, který je pro AT90S2313.
Pro Attiny2313 použij “tn2313def.inc”.

Toto přerušení je na adrese 13. Raději používej jména přerušení, najdeš je v souboru “tn2313def.inc”.

Timer0 normálně počítá do 255, pak přeteče do nuly.
V módu CTC počítá do shody s OC0A, pak se vynuluje (a počítá dál). Tak vlastně zkrátíme cyklus timeru na jakoukoliv hodnotu 0-255.

ldi reg,200 ;přednastavení na čítání do 200 než dojde ke out tcnt0,reg ;schodě a volá se přerušení na .org14
Toto je co?
Nic nepřednastavuj, interval je určený hodnotou OCR0A.

Následující kód vyvolá přerušení každých 250 kroků čítače.

[code].include “tn2313def.inc” ;for ATiny2313

.def reg = r16

.cseg
.org 0 ;reset vector in flash memory
rjmp start

.org OC0Aaddr ;0x0d
rjmp OC0A_isr

start:
ldi r16, low(ramend) ;load with end of sram value
out spl, r16 ;set stack pointer to top of sram

  ldi   reg,0b00000010 ;režim CTC
  out   tccr0,reg 
  
  ldi   reg,0b0000001 
  out   timsk,reg      ;povol přerušení TIMER0 COMPA
  
  ldi   reg,249        ;TCNT0 počítá do 250 (počítá se i nula) 
  out   ocr0a,reg      ;a při schodě je voláno přerušení
  
  ldi   reg,1
  out   tccr0b,reg     ;spusť čítač 0, předdělič 1 
  
  sei                  ;povol globální přerušení 

;------------------ MAIN -----------------------------------------------

main:

rjmp main

;------------------ END MAIN -------------------------------------------

OC0A_isr:

reti
[/code]

Já řeším tabulku skoků pro přerušení tím, že si ji defacto zkopíruju z datasheetu od danýho mcu. Beru to od rjmp RESET až po nastavení SP včetně. K tomu přidávám inicializaci RAM a všech registrů před prvním použitím. Za to hodím seznam všech návěští a nakonec všech návěští dám jeden RETI. A vůbec - radši Ti přiložím ukázku.

#include <tn2313Adef.inc>

;------------------------------------------------------------------------------
; Definice registrových proměnných

.def Temp=R16				; Pomocná proměnná

;------------------------------------------------------------------------------
; Tabulka skoků

.org 0
            rjmp RESET          ; Reset Handler
            rjmp INT0_INT       ; External Interrupt0 Handler
            rjmp INT1_INT       ; External Interrupt1 Handler
            rjmp TIM1_CAPT      ; Timer1 Capture Handler
            rjmp TIM1_COMPA     ; Timer1 CompareA Handler
            rjmp TIM1_OVF       ; Timer1 Overflow Handler
            rjmp TIM0_OVF       ; Timer0 Overflow Handler
            rjmp USART0_RXC     ; USART0 RX Complete Handler
            rjmp USART0_DRE     ; USART0,UDR Empty Handler
            rjmp USART0_TXC     ; USART0 TX Complete Handler
            rjmp ANA_COMP       ; Analog Comparator Handler
            rjmp PCINT0_INT     ; PCINT0 Handler
            rjmp TIMER1_COMPB   ; Timer1 Compare B Handler
            rjmp TIMER0_COMPA   ; Timer0 Compare A Handler
            rjmp TIMER0_COMPB   ; Timer0 Compare B Handler
            rjmp USI_START      ; USI Start Handler
            rjmp USI_OVERFLOW   ; USI Overflow Handler
            rjmp EE_READY       ; EEPROM Ready Handler
            rjmp WDT_OVERFLOW   ; Watchdog Overflow Handler
            rjmp PCINT1_INT     ; PCINT1 Handler
            rjmp PCINT2_INT     ; PCINT2 Handler

;------------------------------------------------------------------------------
; Rutiny obsluhy přerušení

INT0_INT:                   ; External Interrupt0 Handler
INT1_INT:                   ; External Interrupt1 Handler
TIM1_CAPT:                  ; Timer1 Capture Handler
TIM1_COMPA:                 ; Timer1 CompareA Handler
TIM1_OVF:                   ; Timer1 Overflow Handler
TIM0_OVF:                   ; Timer0 Overflow Handler
USART0_RXC:                 ; USART0 RX Complete Handler
USART0_DRE:                 ; USART0,UDR Empty Handler
USART0_TXC:                 ; USART0 TX Complete Handler
ANA_COMP:                   ; Analog Comparator Handler
PCINT0_INT:                 ; PCINT0 Handler
TIMER1_COMPB:               ; Timer1 Compare B Handler
TIMER0_COMPA:               ; Timer0 Compare A Handler
TIMER0_COMPB:               ; Timer0 Compare B Handler
USI_START:                  ; USI Start Handler
USI_OVERFLOW:               ; USI Overflow Handler
EE_READY:                   ; EEPROM Ready Handler
WDT_OVERFLOW:               ; Watchdog Overflow Handler
PCINT1_INT:                 ; PCINT1 Handler
PCINT2_INT:                 ; PCINT2 Handler
            reti

;------------------------------------------------------------------------------
; Hlavní program - inicializace

RESET:  
            ldi temp,low(RAMEND)
            out SPL,temp

            ldi XH, high(SRAM_SIZE)
            ldi XL, low(SRAM_SIZE)
            ldi YH, high(SRAM_START)
            ldi YL, low(SRAM_START)
            clr temp
Init_RAM:
            st Y+, temp
            sbiw XL, 1
            brne Init_RAM

	        clr r0
	        clr r1
	        clr r2
	        clr r3
	        clr r4
	        clr r5
	        clr r6
	        clr r7
	        clr r8
	        clr r9
	        clr r10
	        clr r11
	        clr r12
	        clr r13
	        clr r14
	        clr r15
	        clr r16
	        clr r17
	        clr r18
	        clr r19
	        clr r20
	        clr r21
	        clr r22
	        clr r23
	        clr r24
	        clr r25
	        clr r26
	        clr r27
	        clr r28
	        clr r29
	        clr r30
	        clr r31
            out SREG, r0

;------------------------------------------------------------------------------
; Hlavní program

Hlavni_Smycka:

    		rjmp Hlavni_Smycka

Můžeš samozřejmě dát RETI ke každému návěští, ale je to zbytečný. Jen nesmíš zapomenout každou obsluhu přerušení, kterou napíšeš ukončit vlastním RETI, ale to snad asi ani nemusím psát, ne ?

Díky všem za cenné rady a příklady. Už mi to maká jak má, ale prokousat se datašítem v nečeštině, teda pánové, to je něco. Tak já zase příjdu někdy s nějakým špekem, ještě jednou moc dík.