Страница 1 из 1

Программирование T0 в atmega на СИ и АСМ

Добавлено: Пт фев 26, 2010 21:30:13
ВитГо
Уважаемые Усатые, помогите новичку!

написал программку по краткому курсу АВР переключающую светодиоды. это задание 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);   
  }
}
программа работает так как описано, таймер делает паузу в 65 мс..
Изображение

потом написал подобное на ассемблере

Код: Выделить всё

.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         ; выполняем цикл
и при симуляции таймер дает задержку всего на 8 с мелочью мс...

Изображение

подскажите где я ошибся...
вроде программировал таймер идентично!? или нет?

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

Добавлено: Пт фев 26, 2010 22:10:48
ВитГо
вопрос снят!!!

сам разобрался!

не правильно указывал тип контроллера в файле проекта vmlab!!!

и бит TOV0 - у меги16 - нулевой в TIFR и первый в mega8515...

теперь буду разбираться как сделать прерывание по счетчику...

Добавлено: Сб фев 27, 2010 07:30:27
ARV
позвольте дать вам пару советов.
1. в Си не принято организовывать синтаксические конструкции, разделенные пробелами, как у вас:

Код: Выделить всё

TIFR SET_B(0);
. рекомендую видоизменить макрос (если уж вам так он нравится), чтобы запись действия соответствовала общепринятому для языка Си, хотя традиционная запись

Код: Выделить всё

TIFR = 1; 
и так понятна без слов любому программисту.
2. не смотря на то, что CVAVR всеми силами прививает дурной стиль программирования, все-таки советую отказаться от записей типа SET_B(0) и вместо нулей и других чисел использовать их символьные эквиваленты. например, если вы хотите сбросить флажок запроса прерывания по переполнению таймера 0, то используйте константу TOVF вместо соответствующего числа:

Код: Выделить всё

TIFR = 1<<TOVF;
или, если вам так по душе макросы, так:

Код: Выделить всё

SET_B(TOVF);
согласитесь, что этот вариант сразу сам за себя говорит, в то время как нолик лишь сообщает, что какой-то бит устанавливается, но что этот битик означает - умалчивает.

Добавлено: Вс фев 28, 2010 00:05:13
ВитГо
Да, я уже прочувствовал Вашу правоту... особенно когда выяснилось что в меге 16 tov0 это нулевой бит а в 8515 - первый...

сделай я так как написали вы сразу - то все работало бы с любым контроллером!!!

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

а на СИ вообще никогда не писал :-(( интересует только асм... просто в курсе 123avr примеры на СИ - сначала делаю их и пытаюсь понять что и как и потом переписываю на асме разбираясь в его инструкциях... эххх.. ностальгия по z80 - там была одна команда пересыдки ld на все случаи жизни... тут же модель асма intel8080 - непосредственная адресация одна команда, косвенная другая и т.д. - все понятно.. но пока приходиться часто заглядывать во всякие хелпы... привыкнуть нужно...

Добавлено: Вс фев 28, 2010 00:06:45
ВитГо
Да, я уже прочувствовал Вашу правоту... особенно когда выяснилось что в меге 16 tov0 это нулевой бит а в 8515 - первый...

сделай я так как написали вы сразу - то все работало бы с любым контроллером!!!

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

а на СИ вообще никогда не писал :-(( интересует только асм... просто в курсе 123avr примеры на СИ - сначала делаю их и пытаюсь понять что и как и потом переписываю на асме разбираясь в его инструкциях... эххх.. ностальгия по z80 - там была одна команда пересыдки ld на все случаи жизни... тут же модель асма intel8080 - непосредственная адресация одна команда, косвенная другая и т.д. - все понятно.. но пока приходиться часто заглядывать во всякие хелпы... привыкнуть нужно...