Код: Выделить всё
TCCR0B = TCCR0B|(1<<CS01)|(0<<CS00);//установка прескалера таймера = 1/8частоте.(т.к. на авывод надо 2 такта.. нам этого хватит)У Евстифеева немного не внятно про сие таинство описано, а на басурманском и подавно.
Код: Выделить всё
TCCR0B = TCCR0B|(1<<CS01)|(0<<CS00);//установка прескалера таймера = 1/8частоте.(т.к. на авывод надо 2 такта.. нам этого хватит)Код: Выделить всё
.include "tn2313def.inc"
.list
.cseg
.org 0
rjmp RESET ; Reset Handler
.org OVF0addr
rjmp OVF0Handler ; TIMER0 overflow
;
OVF0Handler:
cli
inc r23
cpi r23,19
brne ExitInt
sbis PinB,5
rjmp ExitInt
ldi r21,0b00100100
in r20, PORTB
eor r20, r21 ;
out PORTB,r20
nop
nop
ExitInt: sei
reti
RESET:
ldi r16, low(RAMEND); Main program start
out SPL,r16 ; Set Stack Pointer to top of RAM
ldi r16, 0b00001000 ; set up ports
out DDRD,r16
nop
ldi r16, 0b01110111
out PORTD,r16 ; PULL
nop
ldi r16, 0b11111111 ;
out DDRB,r16
nop
ldi r16, 0b00000100
out PORTB,r16
nop
; TIMER0 INIT
ldi r16, 0b00001101 ; PRESCALER
out TCCR0B,r16
ldi r16, 0b00000000
ldi r16, 0b11111111
out TIMSK,r16
sei
clr r20
clr r21
clr r22
clr r23
main_cycle:
sbic PinD,4
rjmp main_cycle
rcall Delay
sbic PinD,4
rcall Togg8
rjmp main_cycle
Togg8:
clr r23
out TCNT0,r23
ldi r21,0b00100100
in r20, PORTB
eor r20, r21
out PORTB,r20
nop
nop
rjmp main_cycle
Delay:
; ----------
ldi r17,0
ldi r18,100
ldi r19,1
Loop: dec r17
brne Loop
dec r18
brne Loop
dec r19
brne Loop
; ----------
ldi r17,0
ldi r18,200
ldi r19,1
Loop1: dec r17
brne Loop1
dec r18
brne Loop1
dec r19
brne Loop1
ret
amd9800 писал(а):Какие это дает преимущества.
ICR1 - в этот регистр записывается текущее состояние счётчика при появлении активного входного сигнала на выводе ICP (бит 0 порта B)
amd9800 писал(а):И не могу понять логику - почему так происходит?
Код: Выделить всё
DDRB = CE_3V | CE_5V | PWM_5V; // pwm_5v - нога на ШИМ. настроена как выход
...........
while(1)
{
//toggle_pin(2);
// настраиваем таймер и начинаем выдавать ШИМ
TCCR0A |= (1 << COM0A1) | (1 << COM0A0) | (1 << WGM01) | (1 << WGM00);
TCCR0B |= (1 << CS02) | (1 << WGM02);
OCR0A = 20; // не больше 25
OCR0B = 20;
//TCNT0 = 0;
}Код: Выделить всё
while(1)
{
...
}