Forum: Mikrocontroller und Digitale Elektronik Wachsender LED-Balken


von Rene (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe diese Woche in Embedded eine Prüfung und ich habe jetzt ein 
Problem bei einem wachsenden LED-Balken. Der Balken soll von rechts nach 
lins wachsen und dann wieder ausgehen, dann soll er von links nach 
rechts wachsen und wieder ausgehen. Dann beginnt das ganze von neuen.

Ich habe es geschafft dass der Balken immer von der selben Seite zu 
wachsen beginnt (egal ob rechts oder links) aber die Kombination bekomme 
ich nicht hin. Der Balken wächst von rechts nach links und dann von 
links nach rechts, jedoch hört er dann schon bei der vor vor letzten LED 
auf und beginnt wieder von neuen. Warum geht er nicht bis zur letzten? 
Ich zähle zuerst von 0 bis 8 und dann wieder von 8 bis 0, also sollte es 
ja funktionieren, oder?

Vielleicht kann mir jemand weiter helfen. Danke!

Lg
1
#include <reg167.h>
2
3
int i;
4
5
void t3_isr(void) interrupt 0x23{
6
7
unsigned int mask=0x0000;
8
static int zaehlflag=0;
9
10
mask=1<<(i+8);
11
mask=~mask;
12
13
P2=P2&mask;
14
15
if (i<=7 && zaehlflag==0){
16
i++;
17
}else{
18
if(i==8) P2=P2|0xFF00;
19
zaehlflag=1;
20
i--;
21
if(i==0){
22
zaehlflag=0;
23
P2=P2|0xFF00;
24
}
25
}
26
}
27
28
29
void main(void){
30
31
DP2=0xFFFF;
32
P2=0xFF00;
33
34
T3CON=0x0006;
35
T4CON=0x0027;
36
37
T3=26474;
38
T4=26474;
39
40
T3R=1;
41
IEN=1;
42
43
T3IC=0x0047;
44
45
while(1){
46
}
47
}

: Verschoben durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1. Dein Quelltext ist nicht lesbar, da er überhaupt keine Einrückungen 
enthält.

2. Was hat das mit "PC-Programmierung" zu tun?

(Verschoben)

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Wer so Programmiert sollte den Kurs auf jeden Fall wiederholen !

mfg aus Berlin
auch Rene, sorry

von Udo S. (urschmitt)


Lesenswert?

Rufus Τ. Firefly schrieb:
> 2. Was hat das mit "PC-Programmierung" zu tun?
Wahrscheinlich weil er "auf dem PC programmiert" :-))

von Haudrauf ! (Gast)


Lesenswert?

Im Simulator kann man singlesteppen. Wer das nicht kann - wiederholen.

Sorry.

von Karl H. (kbuchegg)


Lesenswert?

Bis zur 'vor vor letzten'?

Sicher?

Aus dem Programm heraus würde ich sagen, dass du das leuchten der 
letzten übrig gebliebenen LED nicht sehen wirst.

wenn i den Wert 1 hat, schaltest du am Anfang der ISR mit deiner 
Maskensteuerung diese einzelne LED ein, nur um sie kurz darauf hier

i--;
if(i==0){
zaehlflag=0;
P2=P2|0xFF00;
}

sofort wieder abzuschalten. Hat i den Wert i, dann ergibt i-- den Wert 0 
worauf hin die LED sofort alle abgeschaltet werden.

Im Ernst:
Dein Quelltext ist furchtbar. Keine Einrückungen und ich denke du hast 
dich mit deiner komplizierten Steuerung auch ein Eigentor geschossen.

Mach eine 2 teilige ISR

ISR
{

   ... bestimme welche LED leuchten müssen

   ... lass dann auch genau diese LED leuchten
}

den Teil über die Bestimmung zerteilst du wieder in 2 Teile

ISR
{

  if( LED Kette soll von rechts nach links wachsen )
    ... bestimmte welche LED als nächstes leuchten müssen

  else // (LED Kette soll von links nach rechts wachsen
    ... bestimme welche LED als nächstes leuchten müssen

  ... lass dann auch genau diese LED leuchten
}

jetzt überlegst du dir für den ersten der beiden Fälle, wie die Logik 
lauten muss damit du dort, ausgehend von einem bestimmten Wert für i der 
nächste Wert für i aussehen muss

dann überlegst du dir den umgekehrten Fall

und du überlegst dir, wie in den jeweiligen Fällen die Bedingungen sein 
müssen, damit beim nächsten ISR Aufruf dann auch die Richtungen 
gewechselt werden.


Alles nur eine Frage der Organisation. Und manchmal muss man die auch 
ändern und bestehenden Code auch verwerfen.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Rene schrieb:
> ich habe diese Woche in Embedded eine Prüfung und ich habe jetzt ein
> Problem bei einem wachsenden LED-Balken.

Der Sinn einer Prüfung besteht in der Kontrolle eines erlernten 
Stoffkomplexes über einen definierten Zeitraum. Das setzt also voraus, 
dass du vorher gelernt hast.
Unter Lernen versteht man den absichtlichen individuellen Erwerb von 
geistigen, Kenntnissen, Fähigkeiten und Fertigkeiten.
Dabei macht man auch Fehler. Lernen aus Fehlern ist als ein Spezialfall 
des erfahrungsbasierten Lernens anzusehen.

Du hast nun genau zwei Möglichkeiten:
1.  Finde deinen Fehler selbst und du hast etwas gelernt!
2.  Es zeigt dir jemand deinen Fehler und du hast nichts gelernt.

Im Kontext deiner Prüfung ist Variante 2 schlechter.

von bobtheworker (Gast)


Lesenswert?

probiere mal
1
if (i = 8)
2
{
3
  zaehl = 1;
4
}
5
if (i = 0)
6
{
7
  zaehl = 0;
8
}
9
if (zaehl = 0)
10
{
11
  P2 &= 0x0F;  
12
  P2 |= 0x01<<(i+8);
13
  i++;
14
}    
15
if (zaehl = 1)
16
{
17
  P2 &= 0x0F;
18
  P2 |= 0x01<<(i+8);
19
  i--;
20
}

wobei bei ES wäre es einfacher auf Assembler zu gehn und einfach Rotate 
Left/Right P2

von bobtheworker (Gast)


Lesenswert?

bobtheworker schrieb:
> P2 &= 0x0F

P2 &= 0x00FF

von N. Müller (Gast)


Lesenswert?

bobtheworker schrieb:
> if (i = 8)
> {
>  ...
> }

Fällt Dir der Fehler selber auf?

von Andreas G. (1412)


Lesenswert?

doppelistgleich ^^

von Uwe (Gast)


Lesenswert?

genau Assembler mit Rotate Left und Right und Carry richtig setzen und 
fertig.

von Karl H. (kbuchegg)


Lesenswert?

Uwe schrieb:
> genau Assembler mit Rotate Left und Right und Carry richtig setzen und
> fertig.

Sehr sinniger Vorschlag zur Vorbereitung auf eine Prüfung in der 
C-Programmierung gefordert wird.

Es ist auch in C nicht schwer ...
... wenn man regelmässig seine Übungen gemacht hat.

von bobtheworker (Gast)


Lesenswert?

N. Müller schrieb:
> bobtheworker schrieb:
>> if (i = 8)
>> {
>>  ...
>> }
>
> Fällt Dir der Fehler selber auf?

ja^^

war mal kurz in ner sec zusammen getippt ^^

von N. Müller (Gast)


Lesenswert?

bobtheworker schrieb:
> N. Müller schrieb:
>> bobtheworker schrieb:
>>> if (i = 8)
>>> {
>>>  ...
>>> }
>>
>> Fällt Dir der Fehler selber auf?
>
> ja^^
>
> war mal kurz in ner sec zusammen getippt ^^

Viele drehen deshalb den Vergleich in der Klammer um.
Also
if(8==i){...}

Wenn Du dann nämlich if(8=i){...} schreibst, bekommst Du einen Fehler.

Grüße

von Michael D. (etzen_michi)


Lesenswert?

Ich setze mir dafür immer gerne ein Register mit worin die Aufgaben 
erkannt werden können.

Nennen wir es "Status".

In dem Regsiter Status nehmen wir das Bit 7 um die Richtung zu 
bestimmen.
Desweiteren nehmen wir die Bits 0-3 für die 9Led`s.

Nun kann man einen Timer konfigurieren welcher nach einer bestimmten 
Zeit in Interrupt aufruft.


In diesem Interrupt wird Status&0x80 abgefragt.
Ist diese Abfrage wahr so wird ein Programm zum runterzählen aufgerufen.
Ist diese Abfrage falsch so wird ein Programm zum raufzählen aufgerufen.


Ist dem Programm wird nun eine Variable temp mit Status&0x0F geladen.
Nun haben wir in temp die anktuelle Anzahl der leuchtenen LED`s.
Diese wird nun je nachdem in welchem Unterprogramm (oder ohne einzelne 
Unterprogramm nach Status Status&0x80) verringert oder erhöht und 
ausgegeben.

Sobald eine Bestimmte Zahl erreicht ist wird einfach auf Null gesetzt 
und Status Bit 0 umgedreht.

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.