LED-Lauflicht C

Gast #4581418
Lesenswert?

Grüß Gott,

wir haben gerade in der Uni mit C angefangen und müssen ein kleines 
Lauflicht programmieren.

Wir benutzen Qt Creator mit einem vom Prof. bereitgestellten 
Userinterface.

Die Aufgabe:

temp = (1 << 5) | (1 << 4); // temp mit dem Bitmuster 0x0030
                                // initialisieren bei dem nur Bit 5
                                // und Bit 4 gesetzt (1) sind

    temp = ~temp;    // Alle Bits von temp negieren
                                // temp enthält nun das
                                // Bitmuster 0xFFCF

    io_out16 (DIR1, ( io_in16(DIR1) & temp) ); // Nur Bit 5 und 4 den
                                            // Wert 0 ( Lesen ) geben 
und
                                            // alle anderen Bits 
unverändert
                                            // lassen.

    temp = (1 << 12 | 1 << 11 | 1 << 10) | (1 << 9);
    io_out16 (DIR1, ( io_in16(DIR1) |  temp) ); // Nur Bit 10 und 9
                                            // auf 1 (Schreiben) setzen. 
Alle
                                            // anderen Bits unverändert
                                            // lassen.

1
    while(1) {
2

3
        SYNC_SIM;
4

5
        temp = io_in16(IN1);  // Einlesen von Port 1
6

7
        temp = temp >> 4; // So oft nach rechts shiften
8
                            // bis das Bit 4 an der Bitstelle 0 steht.
9

10
        T1 = temp & 0x01; // Zur Sicherheit alle Bits,
11
                            // bis auf Bit0 auf 0 setzen
12
                            // und das Ergebnis T1 zuweisen.
13
        /* Das Bit für den Taster T1 ist nun eingelesen und
14
        die Variablen T1 hat genau den logischen Wert dieses
15
        Bits, d.h.
16
        T1 = 0 wenn Bit 4 = 0 , also wenn Taster T1 betätigt.
17
        T1 = 1 wenn Bit 4 = 1 , also wenn Taster T1 nicht betätigt.
18
       
19
        temp = in(IN1);  // Einlesen von Port 1
20

21
        temp = temp >> 5; // So oft nach rechts shiften
22
                            // bis das Bit 5 an der Bitstelle 0 steht.
23

24
        T2 = temp & 0x01; // Alle Bits, bis auf Bit0 auf 0 setzen
25
                            // und das Ergebnis T2 zuweisen.
26

27
        if(T1 == 1) {
28
            /*temp = 1 << 9; // Berechnung des Bitmusters 0x0200
29
                            // bei dem nur das Bit 9 gesetzt ist.
30

31
            // Bit 9 an Port 1 auf '1' setzen.
32
            help = io_in16(OUT1);    // Aktuellen Ausgabewert einlesen ...
33
            help = help |  temp;   // ... mit temp "verodern"...
34
            io_out16(OUT1, ( help | temp) );  // ... und wieder ausgeben.
35

36
            
37
            help = io_in16(OUT1);
38
            if(help == 0x200){
39
                temp = 1 << 12;
40
                io_out16 (OUT1, temp );
41
            }else if(help == 0x400){
42
                temp = 1 << 9;
43
                io_out16 (OUT1, temp );
44
            }
45
            else if(help == 0x800){
46
                temp = 1 << 10;
47
                io_out16 (OUT1, temp );
48
            }
49
            else{
50
                temp = 1 << 11;
51
                io_out16 (OUT1, temp );
52
            }
53
        }
54

55

56

57
        if(T2 == 1) {
58
            /*temp = 1 << 10;
59
            io_out16 (OUT1, ( io_in16(OUT1) |  temp) );
60
            */
61
            help = io_in16(OUT1);
62
            if(help == 0x200){
63
                temp = 1 << 10;
64
                io_out16 (OUT1, temp );
65
            }else if(help == 0x400){
66
                temp = 1 << 11;
67
                io_out16 (OUT1, temp );
68
            }
69
            else if(help == 0x800){
70
                temp = 1 << 12;
71
                io_out16 (OUT1, temp );
72
            }
73
            else{
74
                temp = 1 << 9;
75
                io_out16 (OUT1, temp );
76
            }
77
        }
78

79
    }

Wenn T4 auf 1 und T5 auf 0 läuft es genau wie andersum.
Wenn ich aber T4 und T5 auf 1 setzte habe ich einen Zappler zwischen 11 
und 12 bzw 0x400 und 0x800.

Kann jemand den Fehler sehen bzw ist es verständlich was ich meine?

Viele Grüße
#4581724
Lesenswert?

Ich denke nicht, daß die hier jemand helfen kann. Deine Umgebung scheint 
Funktionen zu stellen bzw. zu benutzen die niemand kennt (z.B. 
SYNC_SIM). Ausserdem sprichst du von T4 und T5, die aber nirgends in 
deinem code auftauchen. Hänge doch mal den kompletten code als Datei an, 
dann kann man dir evtl auch helfen.
Gast #5118138
Lesenswert?

----------------------------------------------------------------
while(1) {

        SYNC_SIM;

        temp = io_in16(IN1);  // Einlesen von Port 1

        temp = temp >> 4; // So oft nach rechts shiften
                            // bis das Bit 4 an der Bitstelle 0 steht.

        T1 = temp & 0x01; // Zur Sicherheit alle Bits,
                            // bis auf Bit0 auf 0 setzen
                            // und das Ergebnis T1 zuweisen.
        /* Das Bit für den Taster T1 ist nun eingelesen und
        die Variablen T1 hat genau den logischen Wert dieses
        Bits, d.h.
        T1 = 0 wenn Bit 4 = 0 , also wenn Taster T1 betätigt.
        T1 = 1 wenn Bit 4 = 1 , also wenn Taster T1 nicht betätigt.

        temp = in(IN1);  // Einlesen von Port 1

----------------------------------------------------------------

In der letzten Zeile beim zweiten einlesen von Port 1 fehlt ein IO vor 
dem in(IN1);
es muss heißen io_in(IN1);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren