Subversion Repositories Projects

Rev

Rev 723 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
535 form 1
// ********************************************************
2
// ** Spektrum DX7(se) Expander for 10 Channels at large **
3
// ********************************************************
4
// ** Target: Atmel ATtiny2313 with delivered standard   **
5
// ** Fuses (internal RC-Oscillator @ 1 MHz)             **
6
// ********************************************************
7
// ** It sends data from 4 additionally switches over    **
8
// ** the tripole "FLAP" channel which the FlightControl **
9
// ** can decode "on the fly" :)                         **
10
// ********************************************************
11
// ** (c) 2009-0xFFFF Stefan Pendsa                      **
12
// ** License: don't know - use it and have fun          **
13
// ********************************************************
14
 
15
 
16
#include <avr/io.h>
17
 
18
#define TX_High PORTA |= 1 << PORTA0                                            // Set TX-Pin High
19
#define TX_Low  PORTA &= ~(1 << PORTA0)                                         // Set TX-Pin Low
20
#define SYNC_High       PORTA |= 1 << PORTA1                                    // Set Sync-Pin High
21
#define SYNC_Low        PORTA &= ~(1 << PORTA1)                                 // Set Sync-Pin Low
22
 
23
 
24
 
25
void Send(char sync, char data)
26
{
27
        if (sync == 0) SYNC_High; else SYNC_Low;                                // Send Sync
28
        if (data == 0) TX_High; else TX_Low;                                    // Send Data
541 form 29
        while ( PIND & (1<<PD5) );                                                              // Wait for DX7-Sync goes low
30
        while ( !(PIND & (1 << PD5)) );                                                 // Wait for DX7-Sync goes high
31
}
535 form 32
 
33
 
34
 
35
int main(void)
36
{
37
        char i,Parity;                                                                                  // Bit-Counter and Parity Bit
743 form 38
        unsigned int timer=0;                                                                   // Timer for Battery-Remember-Beeping
723 form 39
        DDRA = 0b011;                                                                                   // PORT A INPUT: RESET; OUTPUT: Sync+Data
40
        DDRB = 0b00000000;                                                                              // PORT B INPUT: Jumper for Bypass
541 form 41
        DDRD = 0b0000000;                                                                               // PORT D INPUT: Switches + DX7-Sync
723 form 42
        PORTA = 0b111;                                                                                  // Pull-Up for /RESET, High for Sync+Data
43
        PORTB = 0b01000000;                                                                             // Pull-Up for Jumper
541 form 44
        PORTD = 0b0011111;                                                                              // Pull-Up for Switches
535 form 45
 
46
        while(1)                                                                                                // Main-Loop (Sending data all the time)
47
        {
723 form 48
                if (!(PINB & (1<<PINB6)))                                                       // By-Pass Mode
49
                {
50
                        if (PIND & (1<<PIND0)) PORTA |= 1 << PORTA1;    // A1=D0
51
                        else PORTA &= ~(1 << PORTA1);
535 form 52
 
723 form 53
                        if (PIND & (1<<PIND1)) PORTA |= 1 << PORTA0;    // A0=D1
54
                        else PORTA &= ~(1 << PORTA0);
55
                }
56
                else                                                                                            // Normal Mode
535 form 57
                {
723 form 58
                        Parity = 0;                                                                             // Reset Parity Bit
59
                        Send(1,0);                                                                              // Send SYNC Pulse
60
 
61
                        for (i=0;i<5;i++)                                                               // Encode the first five Port Pins
535 form 62
                        {
723 form 63
                                if (PIND & (1<<i))                                                      // Check Pin #i
64
                                {
65
                                        Send(0,0);                                                              // When High, Send Low (Switched to "0")
66
                                        Parity = ~Parity;                                               // and invert Parity Bit
67
                                }
68
                                else
69
                                {
70
                                        Send(0,1);                                                              // When Low, Send High (Switched to "1")
71
                                }
535 form 72
                        }
723 form 73
 
74
                        Send(0,Parity);                                                                 // Send Parity Bit
743 form 75
 
76
                        timer++;                                                                                // Timer increase for Battery-Remember-Beeping
77
                        if (timer == 6000) DDRB = 0b00000001;                   // 15 min 0.00 sec -> PB0 to GND
78
                        if (timer == 6001) DDRB = 0b00000000;                   // 15 min 0.15 sec -> PB0 input again
79
                        if (timer == 6002) DDRB = 0b00000010;                   // 15 min 0.30 sec -> PB1 to GND
80
                        if (timer == 6003) DDRB = 0b00000000;                   // 15 min 0.45 sec -> PB1 input again
81
                        if (timer == 6004) timer = 0;                                   // 15 min 0.60 sec -> Timer reset               (half delays on DX7se)
535 form 82
                }
83
        }
84
}