filter for raspberry pi
This commit is contained in:
parent
3a1c91b9cc
commit
b79c868668
261
pre_filter/pre_filter.ino
Normal file
261
pre_filter/pre_filter.ino
Normal file
@ -0,0 +1,261 @@
|
||||
/* attiny45 - 433 MHz prefilter - V 3.0 - written by mercuri0 & CurlyMo */
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <avr/power.h>
|
||||
#include <avr/wdt.h>
|
||||
|
||||
#define bool _Bool
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
||||
#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
|
||||
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
|
||||
|
||||
#define SET(a,b) a |= _BV(b)
|
||||
#define CLEAR(a,b) a &= ~_BV(b)
|
||||
#define HIGH(a,b) SET(a,b)
|
||||
#define LOW(a,b) CLEAR(a,b)
|
||||
#define GET(a,b) a & _BV(b)
|
||||
#define TOGGLE(a,b) a ^= _BV(b)
|
||||
|
||||
#define SET_OUTPUT(a,b) a |= _BV(b)
|
||||
#define SET_INPUT(a,b) a &= ~_BV(b)
|
||||
|
||||
#define D_PORT DDRB
|
||||
#define D_PIN(a) PRIMITIVE_CAT(DDB,a)
|
||||
|
||||
#define V_PORT PORTB
|
||||
#define V_PIN(a) PRIMITIVE_CAT(PORTB,a)
|
||||
|
||||
#define REC_OUT 4
|
||||
#define PI_IN 3
|
||||
|
||||
#define MIN_PULSELENGTH 8 //tested to work down to 30us pulsewidth (=2)
|
||||
#define MAX_PULSELENGTH 1600
|
||||
#define PLSLEN 183
|
||||
#define REPEATS 2
|
||||
#define VERSION 3
|
||||
|
||||
volatile uint16_t ten_us_counter = 0;
|
||||
volatile unsigned long ten_us_counter1 = 0;
|
||||
volatile uint8_t valid_buffer = 0x00;
|
||||
volatile uint8_t checksum = 0;
|
||||
|
||||
volatile uint16_t bit = 0;
|
||||
volatile uint8_t state = 0;
|
||||
volatile uint8_t lsb = 0;
|
||||
volatile uint8_t nrrepeat = 0;
|
||||
|
||||
volatile uint16_t _version = 0;
|
||||
volatile uint16_t _minplslen = 0;
|
||||
volatile uint16_t _maxplslen = 0;
|
||||
volatile uint8_t _chksum = 0;
|
||||
|
||||
void get_mcusr(void) __attribute__((naked)) __attribute__((section(".init3")));
|
||||
void get_mcusr(void) {
|
||||
MCUSR = 0;
|
||||
wdt_disable();
|
||||
}
|
||||
|
||||
void init_system(void){
|
||||
cli();
|
||||
|
||||
SET(TCCR1, CS12);
|
||||
SET(TCCR1, CTC1);
|
||||
OCR1A = OCR1C = 0x14;
|
||||
SET(TIMSK, OCIE1A);
|
||||
|
||||
SET(PCMSK, PCINT4);
|
||||
SET(MCUCR, ISC00);
|
||||
SET(GIMSK, PCIE);
|
||||
|
||||
SET_OUTPUT(D_PORT, D_PIN(PI_IN));
|
||||
CLEAR(V_PORT, V_PIN(PI_IN));
|
||||
|
||||
sei();
|
||||
|
||||
power_adc_disable();
|
||||
power_usi_disable();
|
||||
power_timer0_disable();
|
||||
|
||||
wdt_enable(WDTO_4S);
|
||||
|
||||
int hpf = MAX_PULSELENGTH;
|
||||
int lpf = MIN_PULSELENGTH;
|
||||
int ver = VERSION;
|
||||
while(hpf > 10) hpf /= 10;
|
||||
while(lpf > 10) lpf /= 10;
|
||||
while(ver > 10) ver /= 10;
|
||||
checksum = ((ver&0xf)+(lpf&0xf)+(hpf&0xf))&0xf;
|
||||
_chksum = checksum;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
init_system();
|
||||
|
||||
while(1) {
|
||||
asm volatile("NOP");
|
||||
}
|
||||
}
|
||||
|
||||
void send() {
|
||||
TOGGLE(V_PORT, V_PIN(PI_IN));
|
||||
ten_us_counter1 = 0;
|
||||
state ^= 1;
|
||||
}
|
||||
|
||||
void send1(int len) {
|
||||
if(ten_us_counter1 > len) {
|
||||
send();
|
||||
bit++;
|
||||
}
|
||||
}
|
||||
|
||||
void send2(int len) {
|
||||
if(ten_us_counter1 > len) {
|
||||
send();
|
||||
lsb++;
|
||||
}
|
||||
}
|
||||
|
||||
void shift(int a) {
|
||||
lsb = 0;
|
||||
bit++;
|
||||
switch(a) {
|
||||
case 1:
|
||||
_version >>= 1;
|
||||
break;
|
||||
case 2:
|
||||
_minplslen >>= 1;
|
||||
break;
|
||||
case 3:
|
||||
_maxplslen >>= 1;
|
||||
break;
|
||||
case 4:
|
||||
_chksum >>= 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void reset() {
|
||||
_version = VERSION;
|
||||
_minplslen = MIN_PULSELENGTH;
|
||||
_maxplslen = MAX_PULSELENGTH;
|
||||
_chksum = checksum;
|
||||
bit = 0;
|
||||
ten_us_counter1 = 0;
|
||||
lsb = 0;
|
||||
}
|
||||
|
||||
void sendHigh() {
|
||||
if(lsb == 1) {
|
||||
send2((PLSLEN*3)/10);
|
||||
} else {
|
||||
send2(PLSLEN/10);
|
||||
}
|
||||
}
|
||||
|
||||
void sendLow() {
|
||||
if(lsb == 3) {
|
||||
send2((PLSLEN*3)/10);
|
||||
} else {
|
||||
send2(PLSLEN/10);
|
||||
}
|
||||
}
|
||||
|
||||
ISR(TIMER1_COMPA_vect){
|
||||
wdt_reset();
|
||||
ten_us_counter++;
|
||||
ten_us_counter1++;
|
||||
if(nrrepeat >= REPEATS && ten_us_counter1 >= 6000000) {
|
||||
reset();
|
||||
if(state == 1) {
|
||||
send();
|
||||
}
|
||||
nrrepeat = 0;
|
||||
}
|
||||
if(nrrepeat < REPEATS) {
|
||||
cli();
|
||||
if(bit < 56) {
|
||||
if(bit < 2) {
|
||||
if(state == 0) {
|
||||
send1(PLSLEN/10);
|
||||
} else {
|
||||
send1((PLSLEN*6)/10);
|
||||
}
|
||||
} else if(bit < 18) {
|
||||
if((_version&0x0000000000000001) == 1) {
|
||||
sendHigh();
|
||||
} else {
|
||||
sendLow();
|
||||
}
|
||||
if(lsb == 4) {
|
||||
shift(1);
|
||||
}
|
||||
} else if(bit < 34) {
|
||||
if((_minplslen&0x0000000000000001) == 1) {
|
||||
sendHigh();
|
||||
} else {
|
||||
sendLow();
|
||||
}
|
||||
if(lsb == 4) {
|
||||
shift(2);
|
||||
}
|
||||
} else if(bit < 50) {
|
||||
if((_maxplslen&0x0000000000000001) == 1) {
|
||||
sendHigh();
|
||||
} else {
|
||||
sendLow();
|
||||
}
|
||||
if(lsb == 4) {
|
||||
shift(3);
|
||||
}
|
||||
} else if(bit < 54) {
|
||||
if((_chksum&0x0001) == 1) {
|
||||
sendHigh();
|
||||
} else {
|
||||
sendLow();
|
||||
}
|
||||
if(lsb == 4) {
|
||||
shift(4);
|
||||
}
|
||||
} else {
|
||||
if(state == 0) {
|
||||
send1(PLSLEN/10);
|
||||
} else {
|
||||
send1((PLSLEN*34)/10);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
nrrepeat++;
|
||||
reset();
|
||||
if(state == 1) {
|
||||
send();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sei();
|
||||
}
|
||||
}
|
||||
|
||||
ISR(PCINT0_vect){
|
||||
cli();
|
||||
valid_buffer <<= 1;
|
||||
if(ten_us_counter > MIN_PULSELENGTH)
|
||||
{
|
||||
if(ten_us_counter < MAX_PULSELENGTH)
|
||||
{
|
||||
valid_buffer |= 0x01;
|
||||
if (valid_buffer == 0xFF)
|
||||
{
|
||||
state ^= 1;
|
||||
TOGGLE(V_PORT, V_PIN(PI_IN));
|
||||
}
|
||||
}
|
||||
}
|
||||
ten_us_counter = 0;
|
||||
TCNT1 = 0;
|
||||
sei();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user