|
Есть код для 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, 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] Вызывать задержки из прерывания, да и еще такой длительности Ваша программа только и делает что сидит в прерывании и пикает
|
|
|
|
Сообщений в этой теме
-=Женек=- Есть код для CodeVision. Хочу его адаптировать под WinAVR Sep 18 2006, 09:44 _Bill Цитата(-=Женек=- @ Sep 18 2006, 12... Sep 18 2006, 10:33 -=Женек=- мне бы примерчик прерывания по таймеру каждую секу... Sep 18 2006, 11:14 singlskv Цитата(-=Женек=- @ Sep 18 2006, 15... Sep 18 2006, 11:19 aesok Цитата(-=Женек=- @ Sep 18 2006, 15... Sep 18 2006, 11:25 -=Женек=- В Вашем коде таймер не срабатывает.
Кстати при ко... Sep 18 2006, 11:35 singlskv Цитата(-=Женек=- @ Sep 18 2006, 15... Sep 18 2006, 11:51 aesok Цитата(-=Женек=- @ Sep 18 2006, 15... Sep 18 2006, 14:42 -=Женек=- Хочу вам сказать, что с _delay_ms у меня явно какф... Sep 18 2006, 12:41 singlskv Цитата(-=Женек=- @ Sep 18 2006, 16... Sep 18 2006, 12:50 -=Женек=- ЦитатаСудя по всему у Вас постоянно происходит рес... Sep 18 2006, 12:55 singlskv Цитата(-=Женек=- @ Sep 18 2006, 16... Sep 18 2006, 13:04 -=Женек=- Я привел вам код.
Неужели из него не ясно в каком... Sep 18 2006, 13:06 singlskv Цитата(-=Женек=- @ Sep 18 2006, 17... Sep 18 2006, 13:20 SpiritDance delay_ms() у Вас скорее всего съел оптимизатор.
w... Sep 18 2006, 13:16 -=Женек=- ПРочел. биты 0 и 1 равны единице.
А вот мои фьюзы... Sep 18 2006, 13:27 singlskv Цитата(-=Женек=- @ Sep 18 2006, 17... Sep 18 2006, 13:41 -=Женек=- к разъему для программирования. У меня Altera byte... Sep 18 2006, 14:17 singlskv Цитата(-=Женек=- @ Sep 18 2006, 18... Sep 18 2006, 15:55 -=Женек=- У меня WinAVR-20050214
в interrupt.h нет не SIGNA... Sep 18 2006, 15:14 aesok Цитата(-=Женек=- @ Sep 18 2006, 19... Sep 18 2006, 15:18 aesok Цитата(-=Женек=- @ Sep 18 2006, 19... Sep 18 2006, 15:32 viael Цитата(-=Женек=- @ Sep 18 2006, 19... Sep 18 2006, 16:54 -=Женек=- УУУААААУУУУУУУ!!!!
Заработало... Sep 18 2006, 16:39 singlskv ЦитатаУ меня WinAVR-20050214
в interrupt.h нет не... Sep 18 2006, 17:20 singlskv Цитата(-=Женек=- @ Sep 18 2006, 20... Sep 18 2006, 19:11 -=Женек=- ... Sep 18 2006, 16:52 -=Женек=- Так... выплыла проблемка.... С заданием времени.
Д... Sep 18 2006, 17:08 -=Женек=- А функция _delay_ms() из delay.h как должна испльз... Sep 18 2006, 17:25 singlskv Цитата(-=Женек=- @ Sep 18 2006, 21... Sep 18 2006, 17:59 aesok Цитата(-=Женек=- @ Sep 18 2006, 21... Sep 18 2006, 18:35 Shurmas ИМХО оптимальный вариант из проги востановить алго... Sep 18 2006, 18:20 -=Женек=- Я уже сделал, как мне советовали.
КодTCNT1H=TCNT1... Sep 18 2006, 19:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|