Forum: Mikrocontroller und Digitale Elektronik PIC24F LED Ansteuerung


von Konstantin H. (nocheinstudent)


Angehängte Dateien:

Lesenswert?

Hallo!

Auf einem Explorer 16 Development Board unter Verwendung von dem 
PIC24FJ128GA010 musste ich die Knight Rider LED Schleife nachbauen, das 
habe ich auch ohne Probleme geschafft. Jedoch wollte ich ein paar 
weitere Muster ausprobieren. Es sind 8 LEDs und ich wollte, dass die 
Lichtkette an den beiden Enden startet und sich immer wieder kreuzt, 
dabei bin ich auf ein Problem gestoßen, was ich leider nicht lösen kann. 
Im Anhang habe ich den Quellcode von dem Knight Rider hinzugefügt. Ich 
habe ihn leicht verändert, dabei ist folgendes rausgekommen:
1
while(1) {               
2
3
    for(i=0;i<7;i++) {  
4
        x = x << 1;
5
        y = y >> 1;
6
        LATA = x;
7
        LATA = y;
8
        delay();
9
        }
10
11
    for(i=7;i<0;i--) {  
12
        x = x >> 1;
13
        y = y << 1;
14
        LATA = x;
15
        LATA = y;
16
        delay();
17
        }
18
    }

Dabei sind x = 0x01 und y = 0x80, bevor das Programm in die erste 
Schleife reinkommt. Ich kann es leider nicht hinkriegen, 2 LEDs 
gleichzeitig leuchten zu lassen und es gibt anscheinend ein 
Überlauffehler, jedoch kann ich den Grund nicht finden. Kann mir jmd 
weiterhelfen? Danke

MfG Konstantin

von Dominic A. (neo123)


Lesenswert?

LATA = x;
LATA = y;
Das geht so schnell das du wahrscheinlich nur y siehst. Jedoch willst du 
ja nicht nur eine der beiden Variablen anzeigen sondern beide 
gleichzeitig. Dies kannst du mit einer Oder Verknüpfung realisieren.

LATA = y | x;

von Konstantin H. (nocheinstudent)


Lesenswert?

Danke, Dominic! So hat es prima geklappt, aber es bleibt ein 
überlauffehler(nehme ich an), das Program läuft nur 1 mal hin und her. 
Ich habe es mit einem schlechten Schlechten Programmierstil gelöst:
1
while(1) {
2
    int x = 0x01,y = 0x80,i;
3
    LATA = x | y;
4
    delay();
5
6
    for(i=0;i<7;i++) {  
7
        x = x << 1;
8
        y = y >> 1;
9
        LATA = x | y;
10
        delay();
11
    }
12
13
    for(i=7;i<0;i--) {  
14
        x = x >> 1;
15
        y = y << 1;
16
        LATA = x | y;
17
         delay();
18
    }
19
}

Der Idee nach, sollten die Bits immer weiter verschoben werden. Also x: 
0x01, 0x02, 0x04 etc. und y 0x80, 0x40, 0x20 etc... Am Ende soll doch 
x=0x80 sein und y=0x01, jedoch läuft das Programm nur 1 mal hin und 
zurück. Weiß jmd, woran es liegen könnte?

von Dominic A. (neo123)


Lesenswert?

Der Fehler könnte die Zweite For Schlaufe sein. Da ist die Bedingung 
falsch. Du hast solange i kleiner als 0 ist. Und dies ist ja immer der 
Fall.

von Konstantin H. (nocheinstudent)


Angehängte Dateien:

Lesenswert?

Danke denjenigen, die mir geholfen haben. Ich habe jetzt das Program 
fertiggestellt und es läuft alles :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.