вот окно настоек 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)
Последний раз редактировалось FUZZY_ Вс фев 25, 2018 19:07:29, всего редактировалось 1 раз.
|