Добрый день уважаемые форумчане. У меня некое устройство, управляется двумя способами на выбор, управление реализовано с помощью аналоговой клавиатуры и помощью SoftSerial с андроида. Так то все работает но плохо реагирует на управление. Скажите возможно ли сделать прерывание на такое управление? И если можно то помогите разобраться как? С прерыванием по пину я разобрался как работает. А здесь я так думаю нужно реализовать по событию Но не знаю как это сделать. Код (C++): #include <SoftwareSerial.h> SoftwareSerial softSerial(3, 2); // Создаём объект softSerial указывая выводы RX, TX byte key() { if (softSerial.available()) { int valserial = softSerial.read(); if (valserial == 'W') { return 3; } else if ( valserial == 'S') { return 4; } else if ( valserial == 'A') { return 2; } else if ( valserial == 'D') { return 5; } else if ( valserial == 'B') { return 1; } else return 0; } else { int val = analogRead(6); if (val < 50) return 5; else if (val < 150) return 4; else if (val < 350) return 2; else if (val < 510) return 1; else if (val < 800) return 3; else return 0; } } void setup() { // put your setup code here, to run once: softSerial.begin(38400); } void loop() { // put your main code here, to run repeatedly: byte KEY = key(); }
в этих МК нет никаких событий. События есть в atxmega и в тиньках от них. Softserial выкинуть и заменить аппаратным. Там же и прерывания будут доступны. С АЦП ни к чему с такой частотой бомбить. Достаточно 10 раз в секунду.
код вообще неправильный - пока МК сидит в функции аналогрид (а сидит он там долго, ибо МК останавливается и ни на какие прерывания не реагирует), данные, которые приходят на пин softserial исчезают в небытие.
конфигурируешь АЦП на старт от блока сравнения одного из таймеров (OCRnA или OCRnB, где n - номер таймера). Далее конфигурируешь выбранный таймер таким образом, чтобы его блок сравнения (OCRnA или OCRnB) срабатывал нужное количество раз в секунду. Разрешаешь прерывания от АЦП и от выбранного блока сравнения. Все. АЦП полностью работает параллельно нашей программе. Нам только в прерывание от АЦП забрать из его регистра данные.
а он там и не нужен. Можешь на асме все сделать. Ах, да. За абдурину зачем взялся? Она вся на С++. Всё ну очень просто http://forum.amperka.ru/threads/Сложные-арифметические-выражения.16719/page-2#post-189284