Привет, помогите разобраться с программой.
В программе 16-ти битный таймер микроконтроллера при переполнении увеличивает значение переменной. Если это значение превысит допустимое то мк должен "простаивать" пока не будет получен сигнал лог1 на определенную ногу.
Имеется датчик, который время от времени посылает сигнал лог1. В Atmel Studio все работает правильно. Но когда закидываю в микросхему то происходит не так как при отладке. А именно ведёт себя так, будто никакого таймера нет и счёт не начинался, соответственно устройсво не "уходит в сон".
Раздел: AVR
В программе 16-ти битный таймер микроконтроллера при переполнении увеличивает значение переменной. Если это значение превысит допустимое то мк должен "простаивать" пока не будет получен сигнал лог1 на определенную ногу.
Имеется датчик, который время от времени посылает сигнал лог1. В Atmel Studio все работает правильно. Но когда закидываю в микросхему то происходит не так как при отладке. А именно ведёт себя так, будто никакого таймера нет и счёт не начинался, соответственно устройсво не "уходит в сон".
/*
* Led_control.cpp
*
* Created: 26.07.2014 17:40:33
* Author: World-12
*/
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int Delay1;
//unsigned short int LedNum;
void init ()//Загрузка портов
{
sei(); //Разрешение глобальных прерываний , флаг I
DDRD = 0b00111111;//Port D and A to output
DDRA = 0b01111111;
PORTD = 0b00000001;
PORTA = 0b00000001;
//PORTB = 0b00000100;//Подтягивающий резистор на PORTB.2
//INT2
GICR = 0b00100000;//Разрешение прерывания по INT0 - INT2.
MCUCSR = 0b01000000;// Прерывание по rising
//GIFR Это флаги возникших прерываний INTF0 - INTF2. При входе в вектор прерывания они сбрасываются.
//MCUCSR = 0b01000000; // Формировать прерывание при смене с лог1 на лог0.]
//TIMER
TCCR1B = 0b00000101;// Предделитель 1024
TIMSK = 0b00000100;// Разрешить прерывание для OverFlow Timer 1
}
ISR(TIMER1_OVF_vect)
{
/* 65535 Циклов у 16-ти битного счетчика, c предделителем 67107840
8,38848 с можно получить за один цикл с предделителем 1024*/
Delay1 ++;
_delay_us(10);
//Пример округления. float round (float x);
}
ISR (INT2_vect)
{
Delay1 = 0;
PORTA = 0b00000001;
PORTD = 0b00000001;
}
void working()
{
PORTD <<= 1;
if( PORTD & 0b01000000 )
{ PORTA <<= 1;
PORTD = 0b00000001; }
if(PORTA & 0b10000000)
{ PORTA = 0b00000001; }
}
int main()
{
init();//Один раз инициализируемся
while(1) {
while(Delay1 < 2)
{ working();
_delay_us(111);
}
PORTA = 0x00;
PORTD = 0x00;
_delay_ms(1000);
}
}
Раздел: AVR