Обсуждаем контроллеры компании Atmel.
Ответить

Вызов прерывание по совпадению AVR ATTINY10

Сб фев 24, 2018 10:33:06

Не эмулируется вызов прерывание на атмел студио 6 :

TIM0_COMPA_VECT:
in tmp, SREG
LED1_ON
out SREG,tmp
reti


;Настройка таймера:

; Timer/Counter0 Control Register A
ldi tmp,0
out TCCR0A,tmp

; Timer/Counter0 Control Register B 0,001024 Cek 1 TIK
ldi tmp,0x05|(1<<WGM02) ; режим счета импульсов (OCR0A) (сброс при совпадении)
out TCCR0B,tmp

; Timer/Counter0 Control Register C
ldi tmp,0
out TCCR0C,tmp

; Timer/Counter Interrupt Mask Register 0
ldi tmp, (1<<OCIE0A) ;OCIE0A
out TIMSK0,tmp

ldi tmp,0
out TCNT0L,tmp
out TCNT0H,tmp

ldi tmp,50
out OCR0BL,tmp
out OCR0BH,tmp

sei
loop: rjmp loop

Re: Вызов прерывание по совпадению AVR ATTINY10

Сб фев 24, 2018 14:08:22

Проверить ограничения применяемой версии симулятора относительно возможностей работы с данной микросхемой.
Подгруппа ATtiny10-20-40 весьма специфична. Так что вчычитываем хелп симулятора...
:(

Re: Вызов прерывание по совпадению AVR ATTINY10

Сб фев 24, 2018 14:14:30

Поставте паузу и поглядите значение регистров таймера 0. Вы все увидите, что настроили. Увидите что нет флага сравнения, а сам таймер ничего не насчитал.

Вы не задали источник тактирования таймера.

Re: Вызов прерывание по совпадению AVR ATTINY10

Сб фев 24, 2018 20:10:00

вот окно настоек TIMER_COUNTER_0 видно что таймер считает

Всем спасибо !!!
Вот полностью рабочий код

;Sat Feb 17 2018 181152
;Code generation for Atmel Assembler language Attiny10.
;
;.include "tn10def.inc"
;
; Hазначение выводов ATTINY 10
;
; _____
; 1 ---|. |---- 6
; GND ----2 ---| |---- 5 --- VCC
; 3 ---|____|---- 4
;
;----------+
; 1 - (PCINT0/TPIDATA/OC0A/ADC0/AIN0) PB0 - вход ADC с резистора
; 2 - GND
; 3 - (PCINT1/TPICLK/CLKI/ICP0/OC0B/ADC1/AIN1) PB1 -выход на светодиод 1
; 4 - PB2 (T0/CLKO/PCINT2/INT0/ADC2) -выход на светодиод 2
; 5 - VCC
; 6 - PB3 (RESET/PCINT3/ADC3) через резистор 10 к на VCC
;----------+
;Global register variable
.def tmp = R16 ;temporarily register
.def tADCL = R17 ;temporarily register
.def tADCH = R18 ;temporarily register
.def tTCNT0L = R19 ;temporarily register
.def tTCNT0H = R20 ;temporarily register
.def flag = R21 ;temporarily register

.equ DL1 = 900
.equ DL2 = DL1/2
.equ K=(0xFFFF-DL1)/0xFF


;----------
;----------
.macro LED1_ON
sbi PORTB,PB1
.endm
;----------
;----------
.macro LED1_OFF
cbi PORTB,PB1
.endm
;----------
;----------
.macro LED2_ON
sbi PORTB,PB2
.endm
;----------
;----------
.macro LED2_OFF
cbi PORTB,PB2
.endm
;----------
;----------
.macro COMPARE
; ldi R17, high(u1)
; ldi R18, low(u1)
; cp zh, R17
; cpc zl, R18
; brsh blue_ON

ldi R17, high(u1)
ldi R18, low(u1)
cp zh, R17
cpc zl, R18
brsh blue_ON

.endm
;----------
;----------
.macro MOV16

;Set Stack Pointer
ldi tmp, high(@1); Main program start
out @0H,tmp ; Set Stack Pointer

ldi tmp, low(@1) ; to top of RAM
out @0l,tmp


.endm
;----------
;----------
.CSEG
.ORG 0
;Interupt vectors

rjmp RESET_VECT ; Reset Handler Vector at: 0x00
reti ; Vector at: 0x01
reti ; Vector at: 0x02
reti ; Vector at: 0x03
reti ; Vector at: 0x04
rjmp TIM0_COMPA_VECT ; Timer0 Compare A Handler 0x05
reti ; Vector at: 0x06
reti ; Vector at: 0x07
reti ; Vector at: 0x08
reti ; Vector at: 0x09
rjmp ADC_VECT ; ADC Conversion Handler

;End vector header
;----------
;----------
;----------
; Timer 0 output compare A interrupt service routine
;----------
;----------
TIM0_COMPA_VECT:

in tmp, SREG

LED1_ON
LED2_OFF
com flag
out SREG,tmp

reti
;----------
;----------
ADC_VECT:

in tmp, SREG

in tADCL, ADCL
ldi tTCNT0L,K
;----------;
rcall mul08u ;
;----------;
; Result:var1[1:0] = 16bit result of var10 * var20

subi var10,LOW(-DL1)
sbci var11,HIGH(-DL1)

out OCR0AH,var11
out OCR0AL,var10

out SREG,tmp

reti;
;----------;
;----------;
WDT_off: ;
wdr ;
; Clear WDRF in RSTFLR ;
in r16, RSTFLR ;
andi r16, ~(1<<WDRF) ;
out RSTFLR, r16 ;
; Write signature for change enable of protected I/O register ;
ldi r16, 0xD8 ;
out CCP, r16 ;
; Within four instruction cycles, turn off WDT ;
ldi r16, (0<<WDE) ;
out WDTCSR, r16 ;
ret ;
;----------;
RESET_VECT: ; Reset Handler

;Set Stack Pointer
; ldi r16, high(RAMEND); Main program start
; out SPH,r16 ; Set Stack Pointer

; ldi r16, low(RAMEND) ; to top of RAM
; out SPL,r16
;----------;
MOV16 SP,RAMEND

rcall WDT_off
clr flag

ldi tADCL, 0x00
ldi tADCH, 0x00

; out TCNT0L,tADCL
; out TCNT0H,tADCL


subi tADCL,LOW(-DL1)
sbci tADCH,HIGH(-DL1)

lsl tADCL
rol tADCH

lsl tADCL
rol tADCH

out OCR0AH,tADCH
out OCR0AL,tADCL


; External Interrupt Mask Register
ldi tmp,0x00
out EIMSK,tmp

; Pin Change Mask Register
ldi tmp,0x00
out PCMSK,tmp

; Pin Change Interrupt Control Register
ldi tmp,0x00
out PCICR,tmp

;Set Stack Pointer
; ldi r16, high(RAMEND); Main program start
; out SPH,r16 ; Set Stack Pointer

; ldi r16, low(RAMEND) ; to top of RAM
; out SPL,r16

;----------;

;---------- ;
; Port directional ;
ldi tmp,0x06 ;
out DDRB,tmp ;

; Port pull up
ldi tmp,0x00
out PUEB,tmp

; Port out
ldi tmp,0x00
out PORTB,tmp; Write signature for change enable of protected I/O register
;----------;
ldi tmp,0xD8;
out CCP,tmp;
;----------;
; Clock Main Settings Register
ldi tmp,0x00
out CLKMSR,tmp; Write signature for change enable of protected I/O register
;----------;
ldi tmp,0xD8;
out CCP,tmp;
;----------
; Clock prescaler
; Set CPU speed by setting clock prescalar:
; CCP register must first be written with the correct signature - 0xD8
ldi tmp,0x03 ; fosc/8 =1Mhz
out CLKPSR,tmp
;----------
; ADC Multiplexer Selection Register
ldi tmp,0x00
out ADMUX,tmp ; ADC0
;----------
; ADC Control and Status Register A
ldi tmp,0xEF
out ADCSRA,tmp
;----------
; ADC Control and Status Register B
ldi tmp,0x00
out ADCSRB,tmp
;----------
; Digital Input disable
ldi tmp,0x01
out DIDR0,tmp
;----------
; Timer/Counter0 Control Register A
ldi tmp,0
out TCCR0A,tmp
;----------
; Timer/Counter0 Control Register B 0,001024 Cek 1 TIK
ldi tmp,0x05|(1<<WGM02) ; режим счета импульсов (OCR0A) (сброс при совпадении)
out TCCR0B,tmp
;----------
; Timer/Counter0 Control Register C

; ldi tmp,0
; out TCCR0C,tmp
;----------
; Timer/Counter Interrupt Mask Register 0
ldi tmp, (1<<OCIE0A) ;OCIE0A
out TIMSK0,tmp
;

;----------

sei ; // Enable Global Interrupts
Loop:

cpi flag,0
breq Loop

in ZL,TCNT0L
in ZH,TCNT0H


ldi tTCNT0H, HIGH(DL2)
ldi tTCNT0L, LOW(DL2)



cp zh, tTCNT0H
cpc zl, tTCNT0L ; сравниваем TCNT0 i 1800

brlo loop ; если TCNT0 < 1800 - переход к обработчику ошибки


;cpi T0,Ch1 ; сравниваем T0 и Ch1
; brlo OpE ; если T0 < Ch1 - переход к обработчику ошибки
; cpi T0,(Chk+1) ; сравниваем T0 и Chk+1
; brsh OpE ; если T0 > или = Chk+1 - переход к обработчику ошибки

; tTCNT0H<HIGH(DL2)

LED1_OFF
LED2_ON
clr flag

; LED2_OFF
rjmp Loop
;----------

;----------:
; 8bit x 8bit unsigned multiply
;
; Register variables:
; Call: var10 = 8bit multiplicand
; var11 = <don't care>
; var20 = 8bit multiplier
; lc = <don't care> (high register must be allocated)
;
; Result:var1[1:0] = 16bit result of var10 * var20
; var20 = <not changed>
; lc = 0
;
; Size = 9 words
; Clock = 64 cycles (+ret)
; Stack = 0 byte


;.def tmp = R16 ;temporarily register
;.def tADCL = R17 ;temporarily register
;.def tADCH = R18 ;temporarily register
;.def tTCNT0L = R19 ;temporarily register
;.def tTCNT0H = R20 ;temporarily register
;.def flag = R21 ;temporarily register

;----------
.undef tADCL ; var10
.undef tADCH ; var11
.undef tTCNT0L ; var20
.undef tTCNT0H ; lc

;----------


.def var10 = r17 ; tADCL
.def var11 = r18 ; tADCH
.def var20 = r19 ; tTCNT0L
.def lc = r20 ; tTCNT0H



mul08u:
sub var11,var11 ;initialize variables
ldi lc,9 ; lc = 9;
brcc PC+2 ;---- calcurating loop
add var11,var20 ;
ror var11 ;
ror var10 ;
dec lc ;if (--lc > 0)
brne PC-5 ; continue loop;
ret
;----------


Биты WGM03 (4) , WGM02 (3) регистра TCCR0B и биты WGM01 (1) , WGM00 (0) регистра TCCR0A устанавливают режим работы таймера/счетчика T0:
• 0000 - обычный режим
• 0001 - коррекция фазы PWM, 8-бит
• 0010 - коррекция фазы PWM, 9-бит
• 0011 - коррекция фазы PWM, 10-бит
• 0100 - режим счета импульсов (OCR0A) (сброс при совпадении)
• 0101 - PWM, 8-бит
• 0110 - PWM, 9-бит
• 0111 - PWM, 10-бит
• 1000 - коррекция фазы и частоты PWM (ICR0)
• 1001 - коррекция фазы и частоты PWM (OCR0A)
• 1010 - коррекция фазы PWM (ICR0)
• 1011 - коррекция фазы и частоты PWM (OCR0A)
• 1100 - режим счета импульсов (ICR0) (сброс при совпадении) <--вызов прерывания
• 1101 - резерв
• 1110 - PWM (ICR0)
• 1111 - PWM (OCR0A)
Вложения
attiny10_01.jpg
(41.93 KiB) Скачиваний: 479
Последний раз редактировалось FUZZY_ Вс фев 25, 2018 19:07:29, всего редактировалось 1 раз.

Re: Вызов прерывание по совпадению AVR ATTINY10

Вс фев 25, 2018 08:10:46

FUZZY_ писал(а):вот окно настоек TIMER_COUNTER_0 видно что таймер считает
Такая запись плохо читабельная, не заметил 0x05
Код:
ldi tmp,0x05|(1<<WGM03)
Ответить