steckdosen.c


1
/******************************************************************************
2
 Steckdosen Ansteuerung Hilfsroutinen                           intern
3
 *****************************************************************************/
4
#define delay   31      //18 - 44 Grenzen  
5
6
void tx_ein(unsigned char anzahl)           // Sender einschalten
7
{
8
    RFM12_trans(0x8220);
9
    while (anzahl--)  delay_10us(delay);
10
}
11
void tx_aus(unsigned char anzahl)           // Sender auschalten
12
{
13
    RFM12_trans(0x8200);
14
    while (anzahl--)  delay_10us(delay);
15
}
16
void tx_null(void)
17
{                                   // Null ausgeben -___-___  1000 1000
18
    tx_ein(1); tx_aus(3); tx_ein(1); tx_aus(3);
19
}
20
void tx_eins(void)                  // Floatzeichen  -___---_  1000 1110
21
{
22
    tx_ein(1); tx_aus(3); tx_ein(3); tx_aus(1);
23
}
24
void tx_sync(void)                  //   -______________________   1:31
25
{
26
    tx_ein(1); tx_aus(31);
27
}
28
/******************************************************************************
29
 Funksteckdosen "ELRO" ansteuern                                    extern
30
31
    steckdose(0x18,'D',1);
32
    5stelliger Syscode "11000" = 0x18
33
    A-D wird in 5stelligen Einzelcode übersetzt
34
35
 *****************************************************************************/
36
void steckdose(unsigned char syscode, unsigned char funk_nr, unsigned char on_off)
37
{
38
    unsigned char i,j,n;
39
    unsigned int code, temp;
40
41
    if (on_off == 0) on_off = 0b00000010;    // |= 0b00000010  aus "F0"
42
    else             on_off = 0b00000001;    // |= 0b00000001  ein "0F"
43
  
44
    switch (funk_nr)
45
    {
46
        case 'A': funk_nr = 0b00001111; break;
47
        case 'B': funk_nr = 0b00010111; break;
48
        case 'C': funk_nr = 0b00011011; break;
49
        case 'D': funk_nr = 0b00011101; break;        
50
        default: return;
51
    }
52
53
    //   8421 8421 8421 8421
54
    //        SSSS SFFF FFxx
55
    code = (unsigned int) syscode<<7 | funk_nr<<2 | on_off; // 12 Bit zusammensetzen
56
57
    for (n=0;n<3;n++)       // x Wiederholungen
58
    {
59
        delay_ms(10);
60
        for (i=0;i<2;i++)   // x  Wiederholungen
61
        {
62
            temp = code;            // nur mit temp. Variablen arbeiten
63
            for (j=0;j<12;j++)
64
            {
65
                if (temp & 0x0800)  // Bit 12 gesetzt ?
66
                    tx_eins();
67
                else
68
                    tx_null();
69
70
                temp<<=1;           // ein Bit weiterschieben
71
            }
72
            tx_sync();              // Sync Impuls
73
         }
74
     }
75
76
}