Forum: Mikrocontroller und Digitale Elektronik 7-Segment, was weiß ich wie ich es nennen soll :)


von Lokus P. (derschatten)


Lesenswert?

Ich hole mir die Zeichen für das 7-Segment aus einer Tabelle.
1
const unsigned char Tabelle[] PROGMEM = {249, 164, 176, 153, 146, 130, 248, 128, 144};

Nun möchte ich gerne den Wert der im EEPROM gespeichert ist hervorheben.
Dazu nehme ich mir den Punkt auf dem Segment her.

D.h. Wird beim durchschalten der Ziffern eine Übereinstimmung mit dem 
Wert im EEPROM erziehlt soll der Punkt mitleuchten zur Ziffer.

Ich hatte mir das so gedacht:
1
test = eeprom_read_byte(&eeFooByte);
2
if (nKeyPress == test)
3
{
4
  SEGMENT_PORT = pgm_read_byte(&Tabelle[nKeyPress])+127;
5
}

Also nimm einfach den Wert für den Punkt (das wäre in dem Falle 127 - 
BIN=01111111) und addiere es zum aktuellen Wert.

Aber wie ihr euch ja jetzt sicher denken könnt, funktioniert das nicht.
Tja, nun frage ich mich, wie denn das nun lösen könnte.

Muß ich den Wert aus der Tabelle vielleicht in BIN umwandeln und dann 
das Bit dazuzählen?
Oder wie würdet ihr das machen?

von abraxas (Gast)


Lesenswert?

moment, das heißt ein LOW-Bit bedeutet "segment leuchtet"? dann solltest 
du eher || 128 nehmen

von Karl H. (kbuchegg)


Lesenswert?

Manfred W. schrieb:

>
1
> test = eeprom_read_byte(&eeFooByte);
2
> if (nKeyPress == test)
3
> {
4
>   SEGMENT_PORT = pgm_read_byte(&Tabelle[nKeyPress])+127;
5
> }
6
>
>
> Also nimm einfach den Wert für den Punkt (das wäre in dem Falle 127 -
> BIN=01111111) und addiere es zum aktuellen Wert.

Das kann ich mir nicht vorstellen.
Ich will einfach nicht glauben, dass du 7 Leitungen auf 1 setzen musst, 
damit der Punkt an der 7-Segmentanzeige aufleuchtet.

> Muß ich den Wert aus der Tabelle vielleicht in BIN umwandeln und dann
> das Bit dazuzählen?
> Oder wie würdet ihr das machen?

Zunächst mal wäre es gut, wenn du aufschreiben könntest, welches Bit in 
einem Byte welchem Segment in der Anzeige entspricht. Dann wäre es gut 
zu wissen, ob du eine Leitung auf 0 oder auf 1 setzen musst, damit das 
entsprechende Segment aufleuchtet.

Und dann änderst du deine Schreibweise an dieser Stelle von Dezimal nach 
Binär. Denn in diesem Fall macht binär absolut Sinn, weil du tatsächlich 
auf Bitebene arbeitest.

Und dann studierst du den Artikel über Bitmanipulationen um zu lernen, 
wie man gezielt ein Bit setzt bzw. löscht.

http://www.mikrocontroller.net/articles/Bitmanipulation

von Achim (Gast)


Lesenswert?

Hab ich es richtig verstanden das deine Segmente leuchten wenn der 
Ausgang auf Low ist? Um das Bit zu löschen kannst du ein Und nutzen:

SEGMENT_PORT = pgm_read_byte(&Tabelle[nKeyPress]) & ~(1 << 7);

~(1 << 7) ist ne schönere schreibweise für deine 127 ;)

von guest (Gast)


Lesenswert?

Leuchtet der Punkt wenn am entsprechenden Portpin eine 0 im Register 
liegt?
Dann sollte anstelle von "+127" "&127" zum Erfolg führen: MSB wird 
gelöscht, alle anderen nehmen den Wert aus dem EEPROM an.

von Lokus P. (derschatten)


Lesenswert?

Achim schrieb:
> Hab ich es richtig verstanden das deine Segmente leuchten wenn der
>
> Ausgang auf Low ist? Um das Bit zu löschen kannst du ein Und nutzen:
>
>
>
> SEGMENT_PORT = pgm_read_byte(&Tabelle[nKeyPress]) & ~(1 << 7);
>
>
>
> ~(1 << 7) ist ne schönere schreibweise für deine 127 ;)

Was soll ich sagen... Genau das wars! Thanks!

Ja, das ist tatsächlich so, das LOW, lecuhten bedeutet.
Das liegt vermutlich daran das ich eine Segmentanzeige mit gemeinsamer 
Anode verwende. Das bedeutet die Segmentausgänge sind Masse.

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.