Написал небольшую программу, и сталкнулся с такой проблемой нужно по прерыванию от внешего входа INT1 отправить пакет по rs232 в комп. Однако вместо одного пакета программа зацикливается на прерывании INT1 и шлет заданный пакет постоянно. Хотя даже прерывание по входу и небыло.
Если кто может зашейте данную программу в контроллер и проверьте, может быть контроллер с глюком, потому что прерывание по внешнему входу использовал много раз и все было нормально.
Ниже приведена часть моей программы из нее удалено все лишнее.
Код
#include <mega8535.h>
// частота кристалла [Гц]
#define xtal 16000000
// глобальные переменные
unsigned char dd1, mm, tm, hh, date, transmit, F1;
void main(void)
{
DDRB=0x00; //порт B как вход
PORTB=0xff;
MCUCR|=0x3C; // прерывание INT1 по переднему фронту
// инициализация UART
UBRRL=0x67; //скорость 9600 бит/с
UCSRB|=0x98; //разреш прерыв по приему и прием и передачу.
UCSRC|=0x86; // 8-ми битовый кадр
#asm("sei"); // разрешение глобальных прерываний (установка бита 07 SREG)
GIFR=0x00;
GICR=0x80; //прерывание по внешнему входу INT0
dd1=0xCF;
mm=0xD1;
tm=0xD2;
hh=0xD3;
while (1);
}
interrupt [EXT_INT1] void INT1(void)
{
UCSRB|=0x20; //разреш прерыв по опустош UDR
transmit=-1;
date=PINB; //читаю данне с порта
UDR=0xCC; // отпровляю синхрослово - начало пакета
}
interrupt [USART_DRE] void DRE(void)
{
transmit++;
if (transmit==0) UDR=dd1;
if (transmit==1) UDR=mm;
if (transmit==2) UDR=tm;
if (transmit==3) UDR=hh;
if (transmit==4) { UDR=date; // отпровляю байт данных
transmit=-1; // сбрасываю счетчик байт
UCSRB&=0xdf;} // запрещаю прерывание по опустошению UDR
}
// частота кристалла [Гц]
#define xtal 16000000
// глобальные переменные
unsigned char dd1, mm, tm, hh, date, transmit, F1;
void main(void)
{
DDRB=0x00; //порт B как вход
PORTB=0xff;
MCUCR|=0x3C; // прерывание INT1 по переднему фронту
// инициализация UART
UBRRL=0x67; //скорость 9600 бит/с
UCSRB|=0x98; //разреш прерыв по приему и прием и передачу.
UCSRC|=0x86; // 8-ми битовый кадр
#asm("sei"); // разрешение глобальных прерываний (установка бита 07 SREG)
GIFR=0x00;
GICR=0x80; //прерывание по внешнему входу INT0
dd1=0xCF;
mm=0xD1;
tm=0xD2;
hh=0xD3;
while (1);
}
interrupt [EXT_INT1] void INT1(void)
{
UCSRB|=0x20; //разреш прерыв по опустош UDR
transmit=-1;
date=PINB; //читаю данне с порта
UDR=0xCC; // отпровляю синхрослово - начало пакета
}
interrupt [USART_DRE] void DRE(void)
{
transmit++;
if (transmit==0) UDR=dd1;
if (transmit==1) UDR=mm;
if (transmit==2) UDR=tm;
if (transmit==3) UDR=hh;
if (transmit==4) { UDR=date; // отпровляю байт данных
transmit=-1; // сбрасываю счетчик байт
UCSRB&=0xdf;} // запрещаю прерывание по опустошению UDR
}
Вот такой пакет должен получится :"CC CF D1 D2 D3 FC"