реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Есть код для CodeVision. Хочу его адаптировать под WinAVR
-=Женек=-
сообщение Sep 18 2006, 09:44
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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().

Помогите, плз.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Sep 18 2006, 10:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(-=Женек=- @ Sep 18 2006, 12:44) *
Посмотрел я в хидеры - в CodeVision TIM1_COMPA равняется 8. В WinAVR восьмерке соответствует SIG_OUTPUT_COMPARE1B. По моему что-то не то...

В общем программка должна каждую секунду что-нибудь делать а точнее, запускать get_time().

Помогите, плз.

В WinAVR процедуры обработки пррываний, насколько мне известно, имеют квалификатор SIGNAL. А, а общем, смотрите руководство по компилятору. Там должно быть все написано.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 11:14
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



мне бы примерчик прерывания по таймеру каждую секунду
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 11:19
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 18 2006, 11:25
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(-=Женек=- @ Sep 18 2006, 15:14) *
мне бы примерчик прерывания по таймеру каждую секунду


Пример работы с прерываниями таймера в WinAVR у вас на диску уже есть уже:
X:\WinAVR\examples\demo\demo.c
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 11:35
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



В Вашем коде таймер не срабатывает.
Кстати при компиляции выдается warning "unused parameter TIMER1_COMPA_vect"

И еще - на PD2 у меня подключена пишалка. В теле программы пока нет функции синтеза для нее звука, но при запуске вашей программы она стала жужать. )))

У меня контроллер ATMEGA32
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 11:51
Сообщение #7


дятел
*****

Группа: Свой
Сообщений: 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", странно, это ведь номер прерывания.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 12:14
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 12:34
Сообщение #9


дятел
*****

Группа: Свой
Сообщений: 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]
Вызывать задержки из прерывания, да и еще такой длительности cranky.gif
Ваша программа только и делает что сидит в прерывании и пикает smile.gif
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 12:41
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Хочу вам сказать, что с _delay_ms у меня явно какф-то фигня...
Вообще, блин.. начинаю ненавидеть WinAVR. В CodeVision все было как говорится "what you see is what you get". Все что я делал получалось с первого или почти с первого раза. Тут же - проблема на проблеме...

Так вот... delay_ms генерирует задежрку раз этак в 10 меньше чем указываешь. Так что там не 0,6 сек.

Цитата
Вызывать задержки из прерывания, да и еще такой длительности
Ваша программа только и делает что сидит в прерывании и пикает


Да дело не в этом - beep в обработчике прерывания вообще не вызывается. А работает beep тот, который ЕДИНОЖДЫ встречается в главном цикле.

Вы невнимательно читали мой код.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 12:50
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(-=Женек=- @ Sep 18 2006, 16:41) *
Да дело не в этом - beep в обработчике прерывания вообще не вызывается. А работает beep тот, который ЕДИНОЖДЫ встречается в главном цикле.

А "собака" у Вас выключена?
Судя по всему у Вас постоянно происходит ресет.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 12:55
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Цитата
Судя по всему у Вас постоянно происходит ресет.



Хорошая мысль, ибо установка с помощью CSx делителя не влияет на характер звука.

Что за собака? Объясните.

См. выше пост №8- я привел код таким, какой он есть сейчас. Пикалка молчит.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 18 2006, 13:04
Сообщение #13


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(-=Женек=- @ Sep 18 2006, 16:55) *
Цитата
Судя по всему у Вас постоянно происходит ресет.



Хорошая мысль, ибо установка с помощью CSx делителя не влияет на характер звука.

Что за собака? Объясните.

См. выше пост №8- я привел код таким, какой он есть сейчас. Пикалка молчит.


собака = Watchdog Timer
если включить, выполняет ресет через опред. время (подробнее в Datasheet)

Ищите почему у Вас происходит Reset.
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Sep 18 2006, 13:06
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Я привел вам код.
Неужели из него не ясно в каком остоянии находится собака?
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Sep 18 2006, 13:16
Сообщение #15


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



delay_ms() у Вас скорее всего съел оптимизатор.
watchdog может быть включен через фьюзы, убедитесь что это не так.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016