Дуня - Freeduino Nano одноимённого изготовителя (
Задача была вполне понятная - организовать на Arduino приём кодов с этого пульта по прерыванию (как и у выше упомянутых роботов). Было перепробовано 4 варианта:
1. Тупо переписанная с PIC-а тамошняя процедура (тоже на Си) приёма кодов:
- Код: Выделить всё
// Это ужЕ на Wiring-е
const int TSOPpin=2; //(Почему фсе используют #define ???)
volatile byte buf_c=0;
void Rx()
{
noInterrupts();
byte buf;
byte data=0;
delayMicroseconds(1250); // Propusk start-bita i poloviny intervala
for(byte i=0;i<8;++i)
{
buf=digitalRead(TSOPpin)<<i;
data=data|buf;
delayMicroseconds(833);
}
buf_c=data;
interrupts();
}
2. Аналогичная процедура, но переписанная по собственному разумению:
- Код: Выделить всё
void receiveTSOP()
{
noInterrupts();
boolean buf1;
delayMicroseconds(416); // Propusk poloviny intervala
for(byte i=0;i<8;i++)
{
delayMicroseconds(833); // Propusk intervala
buf_c=buf_c>>1;
buf1=digitalRead(TSOPpin);
if(buf1==1)
buf_c=buf_c | 0x80;
}
delayMicroseconds(833);
interrupts();
}
3. Использование библиотеки SoftwareSerial (исходник не сохранился, но в-общем, он будет похож на следующий).
Все эти варианты ПРЕКРАСНО РАБОТАЛИ в ПРОТЕУСЕ!!!! И нифига не работали на живом железе!!!
4. Работающий вариант (библиотека NewSoftSerial):
- Код: Выделить всё
#include <NewSoftSerial.h>
const int TSOPpin=2;
const int dummipin=5; // Dummi pin
volatile byte buf_c=0;
NewSoftSerial TSOP(TSOPpin,dummipin);
void setup()
{
//...
TSOP.begin(1200);
//...
}
void SoftserTSOP()
{
noInterrupts();
buf_c=TSOP.read();
interrupts();
}
4-й вариант тоже заработал только после указания типа byte для переменной buf_c. Ни int, ни unsigned char не помогали.
В-общем, если кому-нибудь понадобится, то вот.
Да, забыл функцию setup() для 4-го варианта. Поправил.