|
Есть код для CodeVision. Хочу его адаптировать под WinAVR |
|
|
|
Sep 18 2006, 09:44
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Вот простенькая программка, работающая в CodeVision: Код unsigned char h=0,m=0,sec=0;
void timer_init(void) { // timer TCNT1H=TCNT1L=0; TCCR1A=0; TCCR1B=12; // cl/256 1000000/256=15625 // 15625/5=3125 OCR1A=3125; TIMSK=16; asm("sei"); }
char get_time() { sec++;
if(sec==60) {sec=0;m++;} if(m==60) {m=0;h++;} if(h==23) {h=0;} }
interrupt[TIM1_COMPA] comp(void) {get_time();} // на эту строку ругается компилятор. Посмотрел я в хидеры - в CodeVision TIM1_COMPA равняется 8. В WinAVR восьмерке соответствует SIG_OUTPUT_COMPARE1B. По моему что-то не то... В общем программка должна каждую секунду что-нибудь делать а точнее, запускать get_time(). Помогите, плз.
|
|
|
|
|
Sep 18 2006, 10:33
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(-=Женек=- @ Sep 18 2006, 12:44)  Посмотрел я в хидеры - в CodeVision TIM1_COMPA равняется 8. В WinAVR восьмерке соответствует SIG_OUTPUT_COMPARE1B. По моему что-то не то...
В общем программка должна каждую секунду что-нибудь делать а точнее, запускать get_time().
Помогите, плз. В WinAVR процедуры обработки пррываний, насколько мне известно, имеют квалификатор SIGNAL. А, а общем, смотрите руководство по компилятору. Там должно быть все написано.
|
|
|
|
|
Sep 18 2006, 11:19
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(-=Женек=- @ Sep 18 2006, 15:14)  мне бы примерчик прерывания по таймеру каждую секунду Лови: Код #include <avr/interrupt.h> #include <avr\io.h> #include <avr\iotn2313.h>
unsigned char h=0,m=0,sec=0;
void timer_init(void) { TCNT1H=TCNT1L=0; OCR1A=15624; TCCR1A=0; TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10); //clk/64 TIMSK=(1<<OCIE1A); }
ISR (TIMER1_COMPA_vect) { if (sec!=59) { sec++; return; } sec=0; if (m!=59) { m++; return; } m=0;
if (h!=23) { m++; return; } h=0; }
int main(int argc, char* argv[]) { timer_init(); asm("sei");
while (1);
return 0; }
|
|
|
|
|
Sep 18 2006, 11:25
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(-=Женек=- @ Sep 18 2006, 15:14)  мне бы примерчик прерывания по таймеру каждую секунду Пример работы с прерываниями таймера в WinAVR у вас на диску уже есть уже: X:\WinAVR\examples\demo\demo.c
|
|
|
|
|
Sep 18 2006, 11:51
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(-=Женек=- @ Sep 18 2006, 15:35)  В Вашем коде таймер не срабатывает. Кстати при компиляции выдается warning "unused parameter TIMER1_COMPA_vect"
И еще - на PD2 у меня подключена пишалка. В теле программы пока нет функции синтеза для нее звука, но при запуске вашей программы она стала жужать. )))
У меня контроллер ATMEGA32 Незнаю в чем у Вас дело, но при замене Код #include <avr/interrupt.h> #include <avr\io.h> #include <avr\iotn2313.h> на Код #include <avr/interrupt.h> #include <avr\io.h> #include <avr\iom32.h> в AVR Studio все симулируется. "unused parameter TIMER1_COMPA_vect", странно, это ведь номер прерывания.
|
|
|
|
|
Sep 18 2006, 12:14
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Вот ваша программа - я добавил туда пикалку (функция beep()). Код #include <inttypes.h> #include <stdio.h> #include <avr/interrupt.h> #include <avr\io.h> #include <avr\delay.h> #include <avr\iom32.h>
unsigned char h=0,m=0,sec=0;
beep() { int i; for (i=0;i<300;i++) { PORTD |= _BV(PD2); _delay_ms(1); PORTD &= ~_BV(PD2); _delay_ms(1); } }
void tri_beep() { beep(); _delay_ms(100); beep(); _delay_ms(100); beep(); _delay_ms(100); }
void timer_init(void) { TCNT1H=TCNT1L=0; TCCR1A=0; TCCR1B=12; // cl/256 1000000/256=15625 // 15625/5=3125 OCR1A=3125; TIMSK=16;
}
ISR (TIMER1_COMPA_vect) { beep(); }
int main(int argc, char* argv[]) { DDRD =0xFF; timer_init(); asm("sei"); while (1); return 0; } обратите внимание на комментарии перед beep в главном цикле - если комментарий убрать - пикалка звучит постоянно
Сообщение отредактировал -=Женек=- - Sep 18 2006, 12:54
|
|
|
|
|
Sep 18 2006, 12:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Смотрите коментарии Код #include <inttypes.h> #include <stdio.h> #include <avr\interrupt.h> #include <avr/io.h> #include <avr\delay.h> #include <avr\iom32.h>
unsigned char h=0,m=0,sec=0;
beep() // <--------------------------Примерно 600ms - 0,6sek { int i; for (i=0;i<300;i++) { PORTA |= _BV(PA2); _delay_ms(1); PORTA &= ~_BV(PA2); _delay_ms(1); } }
void tri_beep() { beep(); _delay_ms(100); beep(); _delay_ms(100); beep(); _delay_ms(100); }
void timer_init(void) { TCNT1H=TCNT1L=0; OCR1A=15624; TCCR1A=0; TCCR1B=(1<<WGM12)|(1<<CS11)|(1<<CS10); //clk/64 TIMSK=(1<<OCIE1A); }
ISR (TIMER1_COMPA_vect) {
if (sec!=59) { beep(); //<--------- каждую сек beep - 0,6sek sec++; return; } sec=0; if (m!=59) { m++; return; } m=0;
if (h!=23) { m++; return; } h=0; }
int main(int argc, char* argv[]) { DDRA =0xFF; //beep();
timer_init(); asm("sei"); while (1); return 0; } обратите внимание на комментарии перед beep в главном цикле - если комментарий убрать - пикалка звучит постоянно [/quote] Вызывать задержки из прерывания, да и еще такой длительности Ваша программа только и делает что сидит в прерывании и пикает
|
|
|
|
|
Sep 18 2006, 12:41
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Хочу вам сказать, что с _delay_ms у меня явно какф-то фигня... Вообще, блин.. начинаю ненавидеть WinAVR. В CodeVision все было как говорится "what you see is what you get". Все что я делал получалось с первого или почти с первого раза. Тут же - проблема на проблеме... Так вот... delay_ms генерирует задежрку раз этак в 10 меньше чем указываешь. Так что там не 0,6 сек. Цитата Вызывать задержки из прерывания, да и еще такой длительности Ваша программа только и делает что сидит в прерывании и пикает Да дело не в этом - beep в обработчике прерывания вообще не вызывается. А работает beep тот, который ЕДИНОЖДЫ встречается в главном цикле. Вы невнимательно читали мой код.
|
|
|
|
|
Sep 18 2006, 12:55
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Цитата Судя по всему у Вас постоянно происходит ресет. Хорошая мысль, ибо установка с помощью CSx делителя не влияет на характер звука. Что за собака? Объясните. См. выше пост №8- я привел код таким, какой он есть сейчас. Пикалка молчит.
|
|
|
|
|
Sep 18 2006, 13:04
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(-=Женек=- @ Sep 18 2006, 16:55)  Цитата Судя по всему у Вас постоянно происходит ресет. Хорошая мысль, ибо установка с помощью CSx делителя не влияет на характер звука. Что за собака? Объясните. См. выше пост №8- я привел код таким, какой он есть сейчас. Пикалка молчит. собака = Watchdog Timer если включить, выполняет ресет через опред. время (подробнее в Datasheet) Ищите почему у Вас происходит Reset.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|