Заголовок сообщения: Пожалуйста помогите найти ошибку в программе для avr.
Добавлено: Пн май 28, 2012 12:08:53
Встал на лапы
Зарегистрирован: Чт мар 08, 2012 01:13:30 Сообщений: 103
Рейтинг сообщения:0
По идеи на $0006 программа должна перейти только один раз (по прерыванию), а на деле получается постоянно.
.include "m16def.inc"
.CSEG rjmp VECT_END .ORG $0006 ;адрес вектор прерывания по совпадению Т2 rjmp START ;прерывание по совпадению (TIMER2) VECT_END:
;***** инициализация стека
ldi r19,0x04 ;инициализация указателя стека out SPH,r19 ldi r19,0x5F out SPL,r19
;***** инициализация таймера
LDI R19,0b01000001 OUT TCCR2,R19 ; Т2, режим ШИМ, предделитель 1 LDI R20,50 out OCR2, r20 ;Число для сравнения LDI R21,0b10000000 OUT TIMSK, R21 ;разрешение прерывания по совпадению таймера Т2 sei ;разрешение глобальных прерываний
Заголовок сообщения: Re: Пожалуйста помогите найти ошибку в программе для avr.
Добавлено: Пн май 28, 2012 13:29:26
Друг Кота
Карма: 67
Рейтинг сообщений: 1071
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 20082 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
ППЦ. При наступлении прерывания МК прыгает на метку START, делает там LDI R16,10 и... продолжает идти дальше. А дальше у чистого МК находятся одни NOP'ы до конца флэша.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Заголовок сообщения: Re: Пожалуйста помогите найти ошибку в программе для avr.
Добавлено: Пн май 28, 2012 13:33:45
Встал на лапы
Зарегистрирован: Чт мар 08, 2012 01:13:30 Сообщений: 103
Рейтинг сообщения:0
Ну пусть будет так:
.include "m16def.inc"
.CSEG rjmp VECT_END .ORG $0006 ;адрес вектор прерывания по совпадению Т2 rjmp START ;прерывание по совпадению (TIMER2) VECT_END:
;***** инициализация стека
ldi r19,0x04 ;инициализация указателя стека out SPH,r19 ldi r19,0x5F out SPL,r19
;***** инициализация таймера
LDI R19,0b01000001 OUT TCCR2,R19 ; Т2, режим ШИМ, предделитель 1 LDI R20,50 out OCR2, r20 ;Число для сравнения LDI R21,0b10000000 OUT TIMSK, R21 ;разрешение прерывания по совпадению таймера Т2 sei ;разрешение глобальных прерываний
На AVR Studio 4 симулирую (DEBUG), TCNT1 доходит до значения в OCR и нечего не происходит.
Если код написан в соответствии с даташитом, но в симуляторе почему-то не работает очевидный кусок, значит кривой симулятор. Нужен либо другой симулятор, либо реальный контроллер. Связка 2х симуляторов позволяет отлавливать баги друг друга. Проверял в протеусе. Переход на RJMP SINOUT происходит раз в 256us (Fclk=1МГц).
astrgan писал(а):
(кажется иногда он даже перепрыгивает это число)
А в этом нет ничего удивительного, TCNT1 и должен в этом режиме считать по кругу 0-65535 и прерывание по совпадению будет всегда раз в 256мкс, независимо от значения OCR.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения