alina_krylova писал(а): ↑08 апр 2025, 18:54
Хочу передавать данные побайтно используя прерывания. Использую сразу оба регистра: S0TIC=0x0044; S0TBIC=0x0048; (на всякий случай так как не знаю какой при асинхронной передаче). Разрешаю прерывания IEN=1;.
Обработчик прерываний :
volatile int i=0;
void ASC0_Transmit(void) interrupt 0x2a
{
S0TIR=0;
S0TBIR=0;
i=1;
}
main()
{
i=0;
while(1)
{
if(i==0) S0TBUF=0xff;
if(i==1) i=0;
}
}
Инициалbзацию ASC0 не привожу, т.к. если использую не прерывания, а встроенный printf () то все работает. Напишите пжлст что делаю не так, как правильно работать с прерываниями по передаче.
Пример передачи по прерыванию последовательного порта массива символов.
Передача данных происходит в прерывании по опустошению буфера передатчика Asc0_TX_BUF_irc ().
static bit volatile transmit_finish;
static bit volatile recive_finish;
static char str[15]="Test Message\0";
static char nstr=0; //Номер текущего символа строки для передачи
void Asc0_Init (unsigned long freq, unsigned int baud) {
S0BG = (unsigned int)(freq / (32*(unsigned long) baud)) - 1; // baudrate reload
DP3 |= 0x0400; // Set TXD for output
DP3 &= 0xF7FF; // Set RXD for input
ALTSEL0P3 |= 0x0400; // Configure port pins for serial interface 0
P3 |= 0x0400; // Set TXD high
S0CON = 0x8011;
S0RIC = 0x0044; // Enable serial receive interrupt
S0TIC = 0x0044; // Enable serial transmit interrupt
transmit_finish = 1;
}
void Asc0_TX_irq (void) interrupt S0TINT = 42 {
transmit_finish = 1;
}
void Asc0_TX_BUF_irc (void) interrupt S0TBINT = 71 {
empty_TBUF = 1;
S0TIR = 0;
S0TBIR = 0;
if(str[nstr]!=0){
S0TBUF = str[nstr];
if(nstr<sizeof(str))nstr++;
}
}
void Asc0_RX_irq (void) interrupt S0RINT = 43 {
recive_finish = 1;
}