roboforum.ruТехнический форум по робототехнике. |
|
|
в таких ситуациях нужно использовать следующий подход:Korbofos писал(а):Ещё небольшой вопрос. Что будет если в основном цикле изменяем значение переменной или регистра, и в этот момент попытаемся изменить значение этой переменной в прерывании?
char regularVar; // рядовая переменная типа char
volatile char interruptableVar; // переменная типа char, которая "ненадёжна" для компилятора
volatile int interruptableVar; // переменная типа int
// не защищённый вариант
interruptableVar = 24;
// защищённый вариант
cli(); // запрет прерываний
interruptableVar = 24;
sei(); // разрешение прерываний
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
if(rx_count < SIZE_BUF)
{
rx_buf[rx_in++] = UDR1;
if(rx_in == SIZE_BUF)rx_in = 0;
rx_count++;
}
}
unsigned char read (void)
{
unsigned char data;
while(!rx_count);bin
data=rx_buf[rx_out++];
rx_count--;
if(rx_out == SIZE_BUF) rx_out=0;
//------Debag----------
Led(rx,ON);
led_rx_count=1;
//---------------------
return data;
}
Korbofos писал(а):Или надо отменить ещё прерывания? Когда читаю данные из буфера?
volatile unsigned char wait=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(wait)wait--; // таймер ожидания прихода байта
if(!wait)TCCR0=0x00;
}
bool read_byte(unsigned char byte)
{
unsigned char i=0;
if(!TCCR0)TCCR0=0x04;
wait = wait_time * byte; //Добавить сюда запрет прерывания?
while(rx_count < byte) // ожидание прихода нужного количества байт
{
if(!wait)
{
Led(lost_byte,ON);
led_wait_count=250;
#asm("cli")
rx_count=0; //очищаем буфер если пришло нужное количество байт
#asm("sei")
return 0;
}
}
for(;byte>1;byte--)data[i++]=read();
wait=0;
if(read()==checksum)return 1; //проверка контрольной суммы в конце пакета
return 0;
}
Нет, т.к. char - один байт, доступ в AVR-ке к одному байту происходит "за один присест".Korbofos писал(а):Стоит ли отключать прерывания, когда присваивается значение переменной wait в основном цикле?
- Код: Выделить всё • Развернуть
volatile unsigned char wait=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(wait)wait--; // таймер ожидания прихода байта
if(!wait)TCCR0=0x00;
}
...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6