roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 21:32

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Не понятный глюк
СообщениеДобавлено: 14 янв 2006, 23:47 
Не в сети

Зарегистрирован: 25 сен 2005, 20:26
Сообщения: 23
Вот кусок программы, микроконтроллер ATmega8, частота кварца 16 Мгц.

.include "m8def.inc"

;r31 - temp

rjmp init

.org $09
rjmp TIMER0_OVF

;конфигурирование
init:

;инициализация стека
ldi r31,HIGH(RAMEND)
out SPH,r31        
ldi r31,LOW(RAMEND)
out SPL,r31

;конфигурирование таймера 100 мс
ldi r31, (1<<TOIE0)  ;разрешение прерывание
out TIMSK, r31       ;по переполнению счетчика
ldi r31, $64     ;Устанавливаем переполнение
out TCNT0, r31   ;каждые 10 ms
ldi r31, (1<<CS02) | (1<<CS00) ; CK/1024 = 15625 Hz = 0,064 ms
out TCCR0, r31    

sei  ;разрешение глобальных прерываний

ldi r30, 10    ;количество переполнений

;основная часть
start:
rjmp label


TIMER_100ms:

nop

TIMER0_OVF:
dec r30
breq TIMER_100ms

ldi r31, 82        ;дополнительная задержка
TIMER0_OVF_1:
dec r31
brne TIMER0_OVF_1

;конфигурирование таймера 100 мс
ldi r31, (1<<TOIE0)  ;разрешение прерывание
out TIMSK, r31       ;по переполнению счетчика
ldi r31, $64     ;Устанавливаем переполнение
out TCNT0, r31   ;каждые 10 ms
ldi r31, (1<<CS02) | (1<<CS00) ; CK/1024 = 15625 Hz = 0,064 ms
out TCCR0, r31    

reti


На базе TIMER_COUNTER_0 выполнена задержка 100 мс, т.к. максимум переполнения счетчика могут

происходить через каждые 16 мс, время переполнения поставлено 10 мс, и переполнения

выполняются 10 раз.(TIMER_COUNTER_1 нужен для других целей, поставить частоту кварца меньше

нельзя).
Эмулирую все это дело на AVR STUDIO 4.12 (пробовал 4.11, 4.05, 3.56), первое переполнение

происходить как надо через 10 мс, а последующие через 9,98 мс.
Не знаю что это, глюк AVR STUDIO или моей программы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 15 янв 2006, 00:36 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
Я в ассемблере не силен, но вопрос такой:
Ты по прерыванию таймера сначала кладешь в него новое значение или сначала прибавляешь счетчик? Попробуй поменять эти операции местами...  :roll:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 15 янв 2006, 02:48 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
думаю это глюк впрограмме - отличается что-то при первом промежутке и последующих, нет единообразия - поищи.

ИМХО: лучше эмулировать в VMLAB а писать прогу и компилировать в CodeVisionAVR


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO