Программирование T0 в atmega на СИ и АСМ
Добавлено: Пт фев 26, 2010 21:30:13
Уважаемые Усатые, помогите новичку!
написал программку по краткому курсу АВР переключающую светодиоды. это задание 2 курса
частота 4мгц
программа работает так как описано, таймер делает паузу в 65 мс..

потом написал подобное на ассемблере
и при симуляции таймер дает задержку всего на 8 с мелочью мс...

подскажите где я ошибся...
вроде программировал таймер идентично!? или нет?
p.s. правда на си - использовался atmega16 а на асме atmega 8515 - но у них же таймеры одинаково устроены?[/img]
написал программку по краткому курсу АВР переключающую светодиоды. это задание 2 курса
частота 4мгц
Код: Выделить всё
#include <mega16>
#define Conf_PA_Out DDRA=0xFF
#define SET_B(x) |= (1<<x)
#define CLR_B(x) &=~(1<<x)
#define INV_B(x) ^=(1<<x)
char temp=0;
// ++++ функция инициализации МК ++++
void mk_init(void){
Conf_PA_Out;//сделать PORTA выходом
TCCR0 = 0x05; /* таймер включить считать с частотой 1024 раз
меньше чем тактовая.*/
}
main (){ // главный цикл
mk_init();
while(1) {
PORTA=~temp;
temp++;
while (!(TIFR&0x01));
TIFR SET_B(0);
}
}

потом написал подобное на ассемблере
Код: Выделить всё
.include "m8515def.inc"
.def temp=r16 ; временный регистр
.def reg_led=r20 ; состояние регистра светодиодов
.org $000
rjmp INIT
; **** Инициализация ****
INIT:
ldi reg_led, 0x01 ; состояние светодиодов
ldi temp, 0xFF
out DDRA, temp ; конфигурируем порт А на вывод
ldi temp, 5
out TCCR0, temp ; Делитель таймера 1024
PRLOOP:
out PORTA, reg_led ; включим нужные светодиоды
inc reg_led ; увеличим значение счетчика
PAUSECOUNTER:
in temp, TIFR
sbrs temp, 1 ; ожидаем пока отработает счетчик
rjmp PAUSECOUNTER ; работаем...
out TIFR, temp ; сбросим счетчик
rjmp PRLOOP ; выполняем цикл

подскажите где я ошибся...
вроде программировал таймер идентично!? или нет?
p.s. правда на си - использовался atmega16 а на асме atmega 8515 - но у них же таймеры одинаково устроены?[/img]