Monday, June 1, 2015

Timer Time: Using Internal ATTiny13A Chip’s Timer, Automatic Mode, With Duty Cycle, and Phase Correction


The problem with the previous code is the phase, and it didn’t arise until we applied it on some ‘real’ hardware.

Some hardware, like motor DC, need a signal with fixed phase, even the frequency’s changed.

The previous code have the ‘center of wave’ that change according to OCR0A value. It’ll move forward on the small OCR0A value and vice versa. On application using LED, it’s enough, since the device ignore the phase.



Some hardware need a fixed center of wave.

We could do that by normally increasing TCNT0 counter, set the flag down when the value reached OCR0A value, counting up till 255, counting down with the flag still down till reached OCR0A value, set the flag up, continue to counting down to 0, counting up again… so on

Notice that one cycle need two step (count up, count down), naturally it has half speed time / or half frequency.

But the center of wave’s now fixed, in the beginning of the wave, :)

.include "../tn13Adef.inc"
.def a=r16
.org 0000
init:
sbi ddrb,0                  ; pin B0 as output
ldi a,0b10000001          ; Fast PWM mode 1 (Duty Cycle with Phase Correct Mode)
out TCCR0A,a
    
ldi a,0b00000101          ; pre-scaler /1024
out TCCR0B,a
    
    ldi a,8
    out OCR0A,a

loop:

rjmp loop






.