#include #include #include //Player+Handycap BTN analog 5 #define PLAYER_SIG_PORTC B00100000 //INPUT PINS digital 2-7 PIND #define PIND_MASK B11111100 //INPUT PINS digitat 8-12 PINB #define PINB_MASK B00011111 //INPUT PINS analog 0-4 PINC #define PINC_MASK B00011111 #define INPUT_SIG_PORTD B11000000 #define INPUT_SIG_PORTB B00011111 #define INPUT_SIG_PORTC B00010000 #define OUTPUT_SIG_PORTB ( PINB_MASK & ~INPUT_SIG_PORTB ) // B00011111 & ! B00011111 = 0 #define OUTPUT_SIG_PORTC ( PINC_MASK & ~INPUT_SIG_PORTC ) // B00011111 & ! B00010000 = B00001111 #define OUTPUT_SIG_PORTD ( PIND_MASK & ~INPUT_SIG_PORTD ) // B11111100 & ! B11000000 = 00111100 union union16 { byte uint8[2]; uint16_t uint16; }; uint8_t zahlen[] = {115,110,46,78,51,83,82,68,99,105,41,73,35,67,50,36,113,108,44,76,49,81,114,100,98,101,37,69,34,66,102,109,111,116,52,84,47,79,57,89,106,97,33,65,42,74,38,45,112,104,40,72,48,80,0,0,103,107,43,75,39,71,70,77} ; union union32 { byte uint8[4]; uint16_t uint16[2]; uint32_t uint32; }; typedef unsigned char byte; void start_timer() { // timer 1: 2 ms TCCR1A = 0; // prescaler 1:8, WGM = 4 (CTC) TCCR1B = 1< 0.08ms @ 16 MHz -> 1*alpha // OCR1A = 207; // (1+207)*8 = 1664 -> 0.104ms @ 16 MHz -> 1*alpha TCNT1 = 0; // reseting timer TIMSK1 = 1<>=1) value++; value<<=3; while(output>>=1) value++; uint8_t zahl = zahlen[value]; uint8_t multi = zahl >> 5; uint8_t base = zahl & B11111; Serial.print(0+multi); Serial.print("\t"); Serial.println(0+base); } static void send_btn(byte btn) { uint8_t value=0; while(btn>>=1) value++; Serial.print("btn\t"); Serial.println(0+value); } static void PCint() { byte PINB_COPY = PINB; byte PINC_COPY = PINC; byte PIND_COPY = PIND; byte output = ( OUTPUT_SIG_PORTC & ~ PINC_COPY ) | (( OUTPUT_SIG_PORTD & ~ PIND_COPY ) <<2 ); // no output on B byte input = ( INPUT_SIG_PORTB & ~ PINB_COPY ) | ( ( INPUT_SIG_PORTC & ~ PINC_COPY ) <<1 ) |( INPUT_SIG_PORTD & ~ PIND_COPY ); byte btn = ( PLAYER_SIG_PORTC & ~ PINC_COPY ); if ( input && output) send_dart(input,output); else if (btn) send_btn(btn); else return; //Timeout verhindert zu schnelle Wiederholungen PCICR&= ~ B111; // Disable Interrupt start_timer(); } SIGNAL(PCINT0_vect) { PCint(); } SIGNAL(PCINT1_vect) { PCint(); } SIGNAL(PCINT2_vect) { PCint(); } void setup() { // pinMode(RF433_PIN, INPUT); // set pin to input // digitalWrite(RF433_PIN, LOW); // turn of pullup resistors //Set Port as input DDRB=0; // disable pull up PORTB=0; DDRD = DDRD & 3; PORTD= PORTD & 3; DDRC=0; PORTC=0; Serial.begin(57600); PCMSK0=PINB_MASK & INPUT_SIG_PORTB; PCMSK1=(PINC_MASK & INPUT_SIG_PORTC) | PLAYER_SIG_PORTC; PCMSK2=PIND_MASK & INPUT_SIG_PORTD; PCICR|= B111; } void loop() { }