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

 
 
> Таймеры, Опять они родимые=))
dvs85
сообщение May 19 2008, 04:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Всем здрасте!
Продолжаю разбираться с таймерами..
Сейчас делаю такое простейшее задание - секундомер.
То бишь через каждую секунду наступает прерывание и светодиод на STK500 моргает.
Написал такую программу
Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//----------------------------------
ISR (TIMER1_COMPA_vect)
{
        PORTA = 0x00;
        _delay_ms(500);
        PORTA = 0xff;
}

//----------------------------------
int main (void)
{
    DDRA = 0xff;
    TIMSK  = (1<<OCIE1A);
    TCCR1B = (1<<CS12)|(1<<WGM13);
    OCR1A   = 15624;
    sei();
     for(;;)
      {
      asm("nop");
      asm("nop");
      }
}


Но она работает не так как я хотел)). Наступает одно прерывание и все.. Дальше никаких действий не происходит..
МК - Атмега16, пишу в АВР Студио.
Подскажите, что не так?



Сори, нашел ошибку.. Прошу прощения

Сообщение отредактировал dvs85 - May 19 2008, 04:17
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dvs85
сообщение Jun 17 2008, 00:36
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 86
Регистрация: 24-03-08
Из: Владивосток
Пользователь №: 36 170



Код
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
//-------------------------
unsigned char i,b;
//-------------------------
const float k = 0.1;
//-------------------------
//Прерывание по переполнени     таймера
ISR(TIMER1_OVF_vect)          //Если возникает прерывание по переполнению таймера,
{
    i++;               //то увеличить значение счетчика переполнений
}
//-------------------------
//Программа для передачи через СОМ порт
void USART_Transmit (unsigned char data)  
{
    while (!(UCSRA&(1<<UDRE)));                //Пока UDRE 0, делать ->
    UDR=data;
}
//-------------------------
int Sec_USART (unsigned char *p  )
{
    float sec;
    unsigned int valsec = *p;
    sec = valsec;                    //в sec - значение valsec
    sec = sec * k;    
    char s[5];                    //умножить sec на к=0,0048 и результат записать в себя
    dtostrf (sec, 5, 1, s);        /Преобразовать значение секунд типа double в строку символов
    USART_Transmit (s[0]);
    USART_Transmit (s[1]);
    USART_Transmit (s[2]);    
    USART_Transmit (s[3]);
    USART_Transmit (s[4]);    
    return 0;
}
//-------------------------
ISR (TIMER1_COMPA_vect)
{
    b ++;                //Значение счетчика
    Sec_USART (&b );
}
//------------------------
ISR (ANA_COMP_vect)         //Прерывание от компаратора
    if (ACSR & (1 << ACO))
     {
      TCCR1B = TCCR1B|((1<<CS10)|(1<<CS12)); //Коэф. предделителя = 1024
     }    
    else
     {
      TCCR1B =TCCR1B & 0b11111010;                
     }                            
}
//--------------------------

//-------------------------
int main()
{
    ACSR|= (1<<ACIE)|(1<<ACBG);            //Инициализация компаратора
    TCCR1B =TCCR1B| (1<<WGM12);
    TIMSK =TIMSK| (1<<OCIE1A);
    OCR1A = 39062;                    //В регистре сравнения 39062
            sei();
    for(;;)
     {
      asm ("nop");
      asm ("nop");
     }
}


Почему то в симуляторе он через сом порт передает первое значение 0,1 с, а затем зависает в функции USART_Transmit. Почему так и как это исправить?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dvs85   Таймеры   May 19 2008, 04:17
- - dvs85   Решил дописать программу помоднее=)) Чтобы контрол...   May 21 2008, 05:02
|- - Палыч   Цитата(dvs85 @ May 21 2008, 08:02) Может ...   May 21 2008, 05:30
- - dvs85   Убрал. Все равно стопорится. На этой записи Кодvoi...   May 21 2008, 05:37
|- - Палыч   Цитата(dvs85 @ May 21 2008, 08:37) Убрал....   May 21 2008, 05:54
- - dvs85   Действительно.. Ха. Теперь он до трех считает))   May 21 2008, 05:56
- - Палыч   Цитата(dvs85 @ May 21 2008, 08:56) Ха. Те...   May 21 2008, 06:55
- - dvs85   ЦитатаХорошо, что до трёх! Посмотрите на своё ...   May 21 2008, 22:03
|- - Палыч   Цитата(dvs85 @ May 22 2008, 01:03) Кстати...   May 22 2008, 06:11
- - mdmitry   В документации по avr-libc все подробно сказано пр...   May 22 2008, 08:48
- - dvs85   А я даже и не знаю. Изначально в примерах так было...   May 23 2008, 02:49
- - dvs85   Подскажите, в чем ошибка алгоритма этой программы?...   May 28 2008, 01:43
|- - Палыч   Цитата(dvs85 @ May 28 2008, 04:43) Сказал...   May 28 2008, 14:40
- - dvs85   Примерно то же мне сказали другие люди. Также они ...   May 28 2008, 23:31
- - dvs85   И еще вопрос.. Какую функцию выполняет бит АСО? Ко...   May 29 2008, 00:48
- - dvs85   Никак не могу придумать эту программу. Ну включил...   May 29 2008, 03:49
- - dvs85   Подскажите!!!! Сделал следу...   Jun 16 2008, 00:44
- - Lepeksiy   Включаешь прерывание по изменению компаратора (ACI...   Jun 16 2008, 06:19
- - dvs85   Спасибо. А то уже замучился.   Jun 16 2008, 22:23


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 16:11
Рейтинг@Mail.ru


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