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

 
 
 
Reply to this topicStart new topic
> mega644P-прерывание по совпадению таймер2
ILNUR
сообщение May 21 2010, 05:59
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 21-05-10
Из: Казань
Пользователь №: 57 414



mega644P
Происходит бесконечно долгий опрос вывода PD6, если 1 то инкрементируетя counter1, иначе counter0. Подтяжка на PD6 есть. Каждые 2 сек значение выводится через usart.
Даже если все время на PD6 стоит 1 значение counter1 периодически меняется сильно (в старших разрядах), в чем может быть проблема?

Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define check_num_pin (1<<PIND6)
#define check_pin PIND

unsigned long counter1;
unsigned long counter0;

void USART_Init()   // Initializing USART
{
    UBRR0 = 0x33;
    /* Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 1stop bit */
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}
void USART_Transmit( char data )
{
    /* Wait for empty transmit buffer */
    while ( !(UCSR0A & (1<<UDRE0)) );
    /* Put data into buffer, sends the data */
    UDR0 = data;
}
void TIMER2_Init()  // Initializing TIMER1
{
    ASSR=(1<<AS2);
    TCCR2A=(1<<WGM21);
    TCCR2B=(1<<CS22)|(1<<CS21)|(1<<CS20);
    OCR2A=0x40;
    TIMSK2=(1<<OCIE2A);  
}

int main()
{  
    counter1=0;
    counter0=0;
    TIMER2_Init();
    USART_Init();
    PORTD=(1<<PORTD6);
    sei();
    while(1)
    {
      if (check_num_pin & check_pin)
      {
        counter1++;
        
      }
      else
      {
        counter0++;
        
      }
   }
}
ISR(TIMER2_COMPA_vect)
{  
    TCCR2B=0;
    USART_Transmit(counter1);
    USART_Transmit(counter1>>8);
    USART_Transmit(counter1>>16);
    USART_Transmit(counter1>>24);
    counter1=0;
    counter0=0;
    TCCR2B=(1<<CS22)|(1<<CS21)|(1<<CS20);
}


Сообщение отредактировал rezident - May 21 2010, 14:40
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 21 2010, 06:29
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(ILNUR @ May 21 2010, 11:59) *
Даже если все время на PD6 стоит 1 значение counter1 периодически меняется сильно (в старших разрядах), в чем может быть проблема?


Проблем две.
Первая - опрос происходит не по таймеру, поэтому за две секунды может произойти разное количество опросов (из-за прерываний).
Вторая - counter1++; и counter1--; надо выполнять при запрещённых прерываниях. Иначе прерывание может произойти посередине изменения переменной, и значение будет неверным.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ILNUR
сообщение May 21 2010, 10:11
Сообщение #3





Группа: Участник
Сообщений: 13
Регистрация: 21-05-10
Из: Казань
Пользователь №: 57 414



Переписал код на ассемблере работает корректно. Что неправильно написал на С?
Go to the top of the page
 
+Quote Post
sigmaN
сообщение May 21 2010, 18:15
Сообщение #4


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



а ещё volatile на каунтеры.
Ну и всё остальное уже сказал АНТОХА.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jul 16 2010, 07:18
Сообщение #5


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(ILNUR @ May 21 2010, 09:59) *
Каждые 2 сек значение выводится через usart.
Даже если все время на PD6 стоит 1 значение counter1 периодически меняется сильно (в старших разрядах), в чем может быть проблема?

Если PD6 постоянно в единице, то сколько вышеприведенный фрагмент кода можно на следующий
Код
while(1) counter1++;


Сколько за две секунды насчитает counter1 ?

Сообщение отредактировал rezident - Jul 16 2010, 15:00
Причина редактирования: Излишнее цитирование.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

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

 


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


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