#include <avr/io.h>
#include <avr/interrupt.h>
class MySerial{
public:
volatile uint8_t *dataPort;
volatile uint8_t *dataPin;
volatile uint8_t *dataDDR;
volatile uint8_t *clockPort;
volatile uint8_t *clockPin;
volatile uint8_t *clockDDR;
uint8_t dataPinMask, clockPinMask;
uint8_t rBit,
lastState, // (dataPin << 1) | clockPin
inData;
// MySerial ms(&PORTD, &PIND, &DDRD, 2, &PORTD, &PIND, &DDRD, 3);
MySerial(
volatile uint8_t *_dataPort,
volatile uint8_t *_dataPin,
volatile uint8_t *_dataDDR,
uint8_t _dataPinN,
volatile uint8_t *_clockPort,
volatile uint8_t *_clockPin,
volatile uint8_t *_clockDDR,
uint8_t _clockPinN
){
rBit = 255;
lastState = 3;
inData = 0;
dataPort = _dataPort;
dataPin = _dataPin;
dataDDR = _dataDDR;
dataPinMask = (1 << _dataPinN);
clockPort = _clockPort;
clockPin = _clockPin;
clockDDR = _clockDDR;
clockPinMask = (1 << _clockPinN);
}
void dataZero() {
*dataPort &= ~dataPinMask; //digitalWrite(pinData, 0);
*dataDDR |= dataPinMask; //pinMode(pinData, OUTPUT);
}
void dataRelease() {
*dataDDR &= ~dataPinMask; //pinMode(pinData, INPUT);
*dataPort |= dataPinMask; //digitalWrite(pinData, 1);
}
void clockZero() {
*clockPort &= ~clockPinMask; //digitalWrite(pinClock, 0);
*clockDDR |= clockPinMask; //pinMode(pinClock, OUTPUT);
}
void clockRelease() {
*clockDDR &= ~clockPinMask; //pinMode(pinClock, INPUT);
*clockPort |= clockPinMask; //digitalWrite(pinClock, 1);
}
void pause() {
//delay(v * 1);
//unsigned long time = micros();
//while(v-- > 0)
for(uint16_t i = 0; i < 250; i++)
__asm__ __volatile__(
"nop"
);
//time = micros() - time;
//LOG("Paused "); LOG(time); LOGLN("us");
}
void sendByte(uint8_t data){
//LOG("Sending byte: "); LOGLN(data);
// data clock = 1:
dataRelease();
clockRelease();
pause();
dataZero();
pause();
//LOGLN("Going to loop...");
for(uint8_t i = 0; i < 8; i++){
clockZero();
pause();
if( 0 == (data & (1 << 7)) )
dataZero();
else
dataRelease();
//LOG("Sending bit "); LOGLN((data & (1 << 7)));
pause();
clockRelease();
pause();
data = data << 1;
}
// data clock = 1:
dataZero();
pause();
dataRelease();
pause();
}
void tick(){
//uint8_t curState = (digitalRead(pinData) << 1) | digitalRead(pinClock);
dataRelease();
clockRelease();
uint8_t curState = 0;
if(0 != (*dataPin & dataPinMask))
curState |= 2;
if(0 != (*clockPin & clockPinMask))
curState |= 1;
//LOGLN(curState);
if((3 == lastState) && (1 == curState)) //
rBit = 7;
if(255 != rBit)
if( (0 == (lastState & 1)) && (1 == (curState & 1)) ) { // clock
//LOG("Getted bit "); LOGLN((curState >> 1));
if( 0 == (curState >> 1) )
inData &= ~(1 << rBit);
else
inData |= (1 << rBit);
rBit--;
}
if( (1 == lastState) && (3 == curState) ){ //
//LOG("Recieved byte: "); LOGLN(inData);
rBit = 255;
//delay(5000);
}
lastState = curState;
}
};