Ср дек 01, 2021 11:41:22
да почему не нравятся? каждому овощу своё время! нужно - я и буферы делаю, и автоматы и все прочее. только чаще всего это не нужно. мне не нужно. и я подозреваю, многим другим тоже.COKPOWEHEU писал(а):не знаю чем вам так не нравятся прерывания и буферы
Ср дек 01, 2021 18:41:00
Ср дек 01, 2021 19:49:18
Ср дек 01, 2021 20:20:30
Так ведь кольцевые буферы на то и кольцевые чтобы не иметь фиксированного начала. С одной стороны добавляем, с другой вынимаем.COKPOWEHEU, на счет кольцевых буферов, а где у него начало и где конец, как определять?
Точно? Разве не по концу строки сообщения разделяются?Допустим такие модули, как GPS NEO-Mx имеют только идентификатор начала сообщения, конца не имеют.
Из тех, с которыми я работал - ни один. Но, кстати, на AVR добавление флага обнаружения символа не сильно замедлит - все равно там каждый байт вручную считывать приходится.Не все МК имеют прерывание по определенному символу.
Да, мне тоже. Есть у меня в планах реализовать кое-что именно с подобным функционалом, но пока других предварительных задач хватает.Хотелось бы увидеть реализацию на кольцевых буферах командной оболочки? Не просто a b c, а к примеру, asd fgh, да еще и с передаваемым параметром.
Ср дек 01, 2021 20:44:16
Возможно, не помню, надо смотреть, я парсер делал по началу сообщения, а там специальный символ шел.COKPOWEHEU писал(а):Точно? Разве не по концу строки сообщения разделяются?
Если рассматривать в моем примере:asd fgh, то мы можем только конец строки определить.COKPOWEHEU писал(а):Но, кстати, на AVR добавление флага обнаружения символа не сильно замедлит - все равно там каждый байт вручную считывать приходится.
Значит пока ни кому не удалось это реализовать.COKPOWEHEU писал(а):Да, мне тоже.
Ср дек 01, 2021 22:41:59
Не знаю, специально я не искал.Значит пока ни кому не удалось это реализовать.
Ср дек 01, 2021 23:08:05
sprintf(buf, "\x80 \r\n ");
uart_send_string(buf);
Ср дек 01, 2021 23:33:24
Чт дек 02, 2021 00:32:42
Пт авг 05, 2022 11:49:59
#define F_CPU 8000000UL // Укажем компилятору частоту ЦПУ (8 MGHz)
#include <avr/io.h> // Подключим файл io.h обработка ввода-вывода
#include <util/delay.h> // Подключим файл delay.h обработка задержек по времени
#include <avr/interrupt.h> // Подключим файл interrupt.h обработка прерываний
// -- установим параметры --
static uint8_t Cur_key_status = 0x00;
static uint8_t New_key_status = 0x00;
static uint8_t Key_change = 0x00;
ISR(TIMER0_OVF_vect)
{
// -- Прерывание для опроса кнопок --
asm("wdr"); // Сбрасываем собаку.
// Опрашиваем кнопки;
New_key_status &= 0x00; // Обнуляем флаги кнопок
if( PIND & (1 << PD7) ) New_key_status |= (1 << 0); // Чтение состояния кнопки.
if( PIND & (1 << PD6) ) New_key_status |= (1 << 1); // Чтение состояния кнопки.
if( PIND & (1 << PD5) ) New_key_status |= (1 << 2); // Чтение состояния кнопки.
if( PIND & (1 << PD4) ) New_key_status |= (1 << 3); // Чтение состояния кнопки.
if( PIND & (1 << PD1) ) New_key_status |= (1 << 4); // Чтение состояния кнопки.
// Развешиваем флаги;
New_key_status |= (1 << 7); // Ставим статус кнопки прочитаны.
PORTC ^= (1<<PC5); // Пока просто мигаем светодиодом.
TCNT0 = 61; // Инициализируем таймер 0 для следующего опроса.
// Установили счетчик таймера на 61 из 256. Должно получаться 25 миллисекунд. Точнее 24,96 мс.
}
void Set_LED (void){
// PORTC ^= (1<<PC0);
PORTC &= 0x00;
if(Cur_key_status & (1 << 0)) PORTC |= (1 << PC0);
if(Cur_key_status & (1 << 1)) PORTC |= (1 << PC1);
if(Cur_key_status & (1 << 2)) PORTC |= (1 << PC2);
if(Cur_key_status & (1 << 3)) PORTC |= (1 << PC3);
}
void main(void) { // начало программы
WDTCR=0x1F; // Инициализация Сторожевой Собаки.
WDTCR=0x0F; // Прескалер собаки ставим на максимум. Примерно 2,1 секунды.
GICR |= 0x00; // Разрешение на внешние прерывания int. (0x00 - запрет прерываний. 0xC0 - разрешение прерываний для int0 и int1)
MCUCR |= 0x0a; // Условия прерываний int. (Нисходящий фронт)
TIMSK = 0x19; // Таймеры. Разрешение прерываний. 0x01 - таймер0. 0x19 - оба таймера.
TCCR0 = 0x05; // Прескалер для таймера 0. (1:1024)
TCNT0 = 0x9e; // Счетный регистр таймера 0. (158 для 4 MHz)
TCCR1A = 0x00; // Настройки для таймера 1
TCCR1B = 0x05; // Прескалер для таймера 1 (1:1024)
TCNT1 = 0x0000; // Счетный регистр таймера 1.
OCR1A = 0xffff; // Регистр сравнения A таймера 1.
OCR1B = 0xffff; // Регистр сравнения B таймера 1.
TIFR = 0x00; // Сброс всех флагов прерываний таймера.
asm("sei"); // Глобальное разрешаем прерывания.
// -- Конец блока инициализации контроллера --
DDRC |= (1 << PC0); // пин PC0 порта DDRC на вывод левый вверх
DDRC |= (1 << PC1); // пин PC1 порта DDRC на вывод левый вниз
DDRC |= (1 << PC2); // пин PC2 порта DDRC на вывод правый вверх
DDRC |= (1 << PC3); // пин PC3 порта DDRC на вывод правый вниз
DDRD |= (0 << PD4); // пин PD4 порта DDRD на вход левый вверх
DDRD |= (0 << PD5); // пин PD5 порта DDRD на вход левый вниз
DDRD |= (0 << PD6); // пин PD6 порта DDRD на вход правый вверх
DDRD |= (0 << PD7); // пин PD7 порта DDRD на вход правый вниз
DDRD |= (0 << PD1); // пин PD0 порта DDRD на вход дополнительная
DDRD |= (0 << PD2); // пин PD2 порта DDRD на вход.
DDRD |= (0 << PD3); // пин PD3 порта DDRD на вход.
PORTD |= (1 << PD2); // Включаем подтягивающий (Pull-UP) резистор для пина PD2.
PORTD |= (1 << PD3); // Включаем подтягивающий (Pull-UP) резистор для пина PD3.
GICR |= (1<<INT0); //разрешаем внешнее прерывание на int0 левая сторона.
GICR |= (1<<INT1); //разрешаем внешнее прерывание на int1 правая сторона.
// -- основной цикл программы --
while (1) { // реализация бесконечного цикла
_delay_ms(0);
if( New_key_status & (1 << 7) ) // Если кнопки не перечитаны нечего дальше делать.
{
New_key_status &= ~(1 << 7); // Скидываем флаг
Key_change = Cur_key_status ^ New_key_status;
Cur_key_status = New_key_status;
if (Key_change) Set_LED ();
}
}
Пт авг 05, 2022 12:02:01
Пт авг 05, 2022 12:14:50
Пт авг 05, 2022 15:34:58
Сб авг 06, 2022 10:43:57
Сб авг 06, 2022 12:05:00
Вс авг 07, 2022 00:42:21
Пт авг 12, 2022 00:57:28
Пт авг 12, 2022 07:16:33
Пт авг 12, 2022 09:46:09
Чт сен 29, 2022 21:18:19