 |
|
|
|
| Автор |
Сообщение |
MIDAS Знатный посетитель (>20)

Зарегистрирован: 02.04.2007 Сообщения: 40 Откуда: Україна
|
Добавлено: 09 Апр 2007, 16:44 Заголовок сообщения: Проблемы с таймером в ATMega8... |
|
|
Всем привет!
Вот решил поработать с таймером, взял пример простой программы которая моргает светодиодом черз каждую секунду и решил в ньом разобратся. Пока печатал код всё понял, почти без затруднений. Но от как только дело дошло до SHIFT+F9 сразу у меня выскочила ошибка мол в месте где написано "INTERRUPT(SIG_OVERFLOW1)" синтаксическая ошибка, не пойму в чем дело , подскажите.
Работаю я на компиляторе CodeVisionAVR, в опциях выбрал ATMega8, ниже привожу исходник:
| Код: |
#include<MEGA8.h>
#define MASK 0x01
#define Freq 4000000 //частота системной синхронизации в Гц
INTERRUPT(SIG_OVERFLOW1)
{
TCNT1=0x10000-(Freq/1024);
PORTB^=MASK;
}
void main(void)
{
DDRB=0x01;
TCCR1A=0;
TCCR1B=5;
TCNT1=0x10000-(Freq/1024);
TIFR=0;
TIMSK-0x80;
GIMSK=0;
sei();
while(1);
}
|  _________________ WRTC
/*With Respect To C*/ |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 10 Апр 2007, 11:27 Заголовок сообщения: |
|
|
В CVAVR есть генератор кода ... Вам предалагают им воспользоваться при создании нового проекта ... так Вы можете увидеть правильный синтаксис процедур обработки прерываний. Если отличаетесь любознательностью, то можете открыть справку - в этом компиляторе она хоршо структурирована - найдете ответ без проблем.
Еще можете посмотреть примеры исходников в соседней ветке http://www.remexpert.com/forum/viewtopic.php?p=3463#3463
Ну и было бы здорово, если бы сюда написали результат своих проб. _________________ AndryG |
|
| Вернуться к началу |
|
 |
MIDAS Знатный посетитель (>20)

Зарегистрирован: 02.04.2007 Сообщения: 40 Откуда: Україна
|
Добавлено: 10 Апр 2007, 17:53 Заголовок сообщения: |
|
|
Вот что у меня вышло
| Код: |
#include <mega8.h>
#define MASK 0x01
interrupt [TIM1_OVF] void timer1_ovf_isr(void)/*Функция обработкы прерывания по переполнению счетчика Т\С1*/
{
TCNT1=0xFCBD; /*инициилизируем счетный регистр значением 64701 отсчитывается 65535-64701=834 такта*/
PORTB^=MASK; //Меняем горящий на негорящий и наоборот
}
void main(void)
{
DDRB=0x01; //Порт В-выход
PORTB = 0xFF; //На этом месте Светодиод загорается
TCCR1A=0x80; /*Что означает эта строка???тут Светодиод почемуту гаснит? ПОясните почему??!!!!*/
TCCR1B=5; /*Коеффициэнт деления частоты системной синхронизации=1024! ПОЧЕМУ??????? 1024 не понял*/
TCNT1=0xFCBD; /*инициилизируем счетный регистр значением 64701 отсчитывается 65535-64701=834 такта*/
TIFR=0; //Сбрасываем все флаги прерываний от Т\С1
TIMSK=0x80; //Разрешаем прерывания при переполнении от Т\С1
#asm("sei") //Общее разрешение прерываний
while(1); //Ожидаем прерывание от Т\С1
}
|
Код по моему нормальный, а вот при отладки в VMLAВ светодиод блымнул только один раз (я в коментариях указал где), ПОЧЕМУ!!!
Проект VMLAВ
| Код: |
.MICRO "ATmega8"
.TOOLCHAIN "GENERIC"
.TARGET "SH.hex"
.COFF "SH.cof"
.SOURCE "sh__.c"
.TRACE
.POWER VDD=5 VSS=0
.CLOCK 1meg
.STORE 250m
D1 VDD SVTD
R1 SVTD PB0 470
.PLOT V(PB0)
|
_________________ WRTC
/*With Respect To C*/
Последний раз редактировалось: MIDAS (12 Апр 2007, 14:50), всего редактировалось 2 раз(а) |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 13 Апр 2007, 15:28 Заголовок сообщения: |
|
|
В таких случаях обычно задачу делят на несколько частей ... сперва нужно убедится, что счетчик таймер считает (мониторим регистр TNCT1) ... потом проверяем сработку прерывания (поставив точку останова в процедуре обработки прерывании) ... потом смотрим на инвентирование бита .. правильно или как.
Но самым первым делом! Мы проверяем настройку переферии контроллера ... в вашем случае таймера ...
TIMSK=0x04 .... я не помню настроек MEGA8 и не смотрел их ... но генератор кода ... для MEGA8 для сработки прерывания по переполнению указал именно 2-й бит регистра.
Седьмой же бит используется в 90S2313 ... вроде.
После такой "доработки" пошло... и еще ... TCCR1A=0x80; -- сами написали и справшиваете. что это.
____
P.S.
Возможно где-то и не прав - поправьте ... просто времени нет по справочникам лазить. а напамять тонкости такие не помню - редко занимаюсь писательством. _________________ AndryG
Последний раз редактировалось: AndryG (16 Апр 2007, 12:25), всего редактировалось 1 раз |
|
| Вернуться к началу |
|
 |
dimonbest Частый гость (>5)

Зарегистрирован: 12.04.2007 Сообщения: 14
|
Добавлено: 15 Апр 2007, 12:48 Заголовок сообщения: |
|
|
Попробую так обьяснить...
TCCR1A=0x80; /*Что означает эта строка???тут Светодиод почемуту гаснит? ПОясните почему??!!!!*/
Лучше присвоить этому регистру значение 0, хотя у меня тут светоиод не гаснет. Отлаживал в AvrStudio
TIMSK=0x80; //Разрешаем прерывания при переполнении от Т\С1
Это Вы разрешили прерывания при переполнении тамера счетчика 2 а не 1 . Надо исправить на
TIMSK=4;
И заработает
Если не получится могу выслать проект в CVAVR и AVRSTUDIO
Удачи |
|
| Вернуться к началу |
|
 |
MIDAS Знатный посетитель (>20)

Зарегистрирован: 02.04.2007 Сообщения: 40 Откуда: Україна
|
Добавлено: 15 Апр 2007, 13:36 Заголовок сообщения: |
|
|
dimonbest ОГРОМНОЕ ТЕБЕ ЧЕЛОВЕЧЕСКОЕ С-П-А-С-И-Б-О А то я с этой фигнёй уже вторую неделю парюсь
Но всё таки не пойму одного! Вот код
| Код: |
include <mega8.h>
#define MASK 0x01
interrupt [TIM1_OVF] void timer1_ovf_isr(void)/*Функция обработкы прерывания по переполнению счетчика Т\С1*/
{
TCNT1 = 0xFFFC;
PORTB^=MASK; //Меняем горящий на негорящий и наоборот
}
void main(void)
{
DDRB=0x01; //Порт В-выход
PORTB = 0xFF; //На этом месте Светодиод загорается
TCCR1A = 0; //єту строку впринципе можно не писать ЧТО ОНА ЗНАЧит????????????
TCCR1B=0x03; /*Коеффициэнт деления частоты системной синхронизации*/
TCNT1 = 0xFFFC;
TIMSK=4; //Разрешаем прерывания при переполнении от Т\С1
#asm("sei") //Общее разрешение прерываний
while(1); //Ожидаем прерывание от Т\С1
}
|
Почему строка TIMSK=4; работаэт а не TIMSK=0x80; 0x80 вдфоисной системе числения равно 0b10000000 тоесть устанавлеваэм лиш 8 бит он називается
TOIE1 - Timer/Counter1 Overflow Interrupt Enable - разрешение прерывания по переполнению 1-го таймера а 4 это 00000100 то есть устанвливаем лиш 3 бит
он зарезервирован и ничего не значит почему так или я чтото не так понял  _________________ WRTC
/*With Respect To C*/ |
|
| Вернуться к началу |
|
 |
dimonbest Частый гость (>5)

Зарегистрирован: 12.04.2007 Сообщения: 14
|
Добавлено: 15 Апр 2007, 13:45 Заголовок сообщения: |
|
|
Вы наверное перепутали DATASHEETы
Bit 7 – OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
Bit 2 – TOIE1: Timer/Counter1, Overflow Interrupt Enable - именно этот бит разрешает прерывания при переполнении таймера счетчика 1 в ATMega8
Даташиты можно скачать с их официального сайта: www.atmel.com |
|
| Вернуться к началу |
|
 |
MIDAS Знатный посетитель (>20)

Зарегистрирован: 02.04.2007 Сообщения: 40 Откуда: Україна
|
Добавлено: 15 Апр 2007, 17:00 Заголовок сообщения: |
|
|
А есть в инэте даташиты на руском  _________________ WRTC
/*With Respect To C*/ |
|
| Вернуться к началу |
|
 |
dimonbest Частый гость (>5)

Зарегистрирован: 12.04.2007 Сообщения: 14
|
|
| Вернуться к началу |
|
 |
MIDAS Знатный посетитель (>20)

Зарегистрирован: 02.04.2007 Сообщения: 40 Откуда: Україна
|
Добавлено: 15 Апр 2007, 18:15 Заголовок сообщения: |
|
|
А архитектура ATmega128 похожа на ATmega8, а то что бы опять таких приколов как с таймером не было  _________________ WRTC
/*With Respect To C*/ |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|