Forum: Mikrocontroller und Digitale Elektronik Bitweise Darstellung mit 10 LEDs


von Svenja S. (lavy7)


Lesenswert?

Hallöchen an Alle :)

Ich möchte mittels LEDs die besetzten Bits meines Programms darstellen 
lassen.
Hat auch bisher an sich sehr gut funktioniert, nur "überspringt" das 
Programm gewisse Zahlen und fängt dann wieder von vorne an. Es wirkt so, 
alsob nicht alle Bits "ausgenutzt" werden.

Hier der aktuelle Code:
1
#include <avr/io.h>
2
3
void out (uint16_t value);
4
5
int main(void)
6
{
7
  DDRC |= 0x3F;
8
  DDRD |= 0xFF;
9
  
10
  out(0x00F0);
11
  
12
    while (1) 
13
    {  
14
    }
15
}
16
17
void out (uint16_t value)
18
{
19
  PORTD &= ~0x00F0;
20
  PORTC &= ~0x002F;
21
22
  PORTD |= (value);
23
  PORTC |= (value);  
24
}

Ich habe so das Gefühl, dass die Lösung super simpel ist, übersehe sie 
aber ^^'

Vielen Dank schonmal im Voraus!
Lavy

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Svenja S. schrieb:
> Hat auch bisher an sich sehr gut funktioniert, nur "überspringt" das
> Programm gewisse Zahlen und fängt dann wieder von vorne an
Was soll das gepostete Porgemm machen? Was erwartest du und was passiert 
stattdessen? Welche Zahlen sind es, die "gewiss" übersprungen werden?

> (uint16_t value)
Auch wenn dein Eingangswort 16 (oder auch 10) Bits hat, deine Funktion 
nudelt nur auf den unteren 8 Bits davon herum. Ich vermute, du müsstest 
vor den beiden Zuweisungen die daten noch ein wenig hin- und 
herschieben.

: Bearbeitet durch Moderator
von H. (Gast)


Lesenswert?

Svenja S. schrieb:
> DDRC |= 0x3F;
> DDRD |= 0xFF;

Also willst Du 14bit ausgeben?

Dann musst Du für die oberen 6bit schieben

PORTC |= (value>>8);

von Svenja S. (lavy7)


Lesenswert?

> Also willst Du 14bit ausgeben?

Na eigentlich 10bit. Also eine LED stellt einen bit dar.

von H. (Gast)


Lesenswert?

Svenja S. schrieb:
> PORTD &= ~0x00F0;
> PORTC &= ~0x002F;

Wo hängen die LEDs denn nun konkret dran? Bit 0..7 an Port C und Bit 8/9 
an PortD?

von Egonwalter M. (heiner1234)


Lesenswert?

Wie soll das Programm denn mit einer leeren while-Schleife funktionieren 
🤔

von H. (Gast)


Lesenswert?

Egonwalter M. schrieb:
> Wie soll das Programm denn mit einer leeren while-Schleife funktionieren

Naja, es wird ja anscheinend zum Test erstmal ein Wert ausgegeben.

von Svenja S. (lavy7)


Lesenswert?

> Wo hängen die LEDs denn nun konkret dran? Bit 0..7 an Port C und Bit 8/9
> an PortD?

Bit 0-6 an PORTC und 7-10 an PORTD.

Ich habe mein Programm jetzt soweit geändert:
1
#include <avr/io.h>
2
3
void out (uint16_t value);
4
5
int main(void)
6
{
7
  DDRC |= 0x003F;
8
  DDRD |= 0x00FF;
9
  
10
  out(0x0100);
11
  //out(256);
12
  
13
    while (1) 
14
    {  
15
    }
16
}
17
18
void out (uint16_t value)
19
{
20
  PORTD &= ~0x00F0;
21
  PORTC &= ~0x002F;
22
23
  PORTD |= (value);
24
  PORTC |= (value >> 4);
25
}

Mir scheint, alsob das Programm noch eine Stelle zu wenig ausgibt, ich 
also noch nicht richtig geschoben habe. Gebe ich out(0x0200) aus, zeigt 
er mir binär aber die Dezimalzahl 51 aus...

von Svenja S. (lavy7)


Lesenswert?

Ah okey, ich habs....
ich muss natürlich Port D schieben und nicht Port C....

Bitte entschuldigt ^^'

von H. (Gast)


Lesenswert?

Svenja S. schrieb:
> Bit 0-6 an PORTC und 7-10 an PORTD.
>

> DDRC |= 0x003F;
> DDRD |= 0x00FF;

0x3F schaltet nur 6 Bit aus Ausgang, nicht 7. Du meinst also

> DDRC |= 0x007F;
> DDRD |= 0x00FF;

von H. (Gast)


Lesenswert?

Svenja S. schrieb:
> Bit 0-6 an PORTC und 7-10 an PORTD.

Und das sind auch schon 11 Bit.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Svenja S. schrieb:
> Mir scheint, alsob das Programm noch eine Stelle zu wenig ausgibt, ich
> also noch nicht richtig geschoben habe.
Nur weiter, du wirst den Fehler finden. Diesen Prozess nennt man 
"Lernen".

> Gebe ich out(0x0200) aus, zeigt er mir binär aber die Dezimalzahl 51 aus...
Worauf zeigt er die aus?

Svenja S. schrieb:
> ich muss natürlich Port D schieben und nicht Port C....
Du musst gar keinen Port schieben, weil der Port schon an seinem 
richtigen Platz sitzt. Du musst die an den Port zugewiesene Variable 
schieben und maskieren, so dass sie auf den Port passt.

Das hört sich nach Korinthenkackerei an, ist aber tatsächlich so.

von Hugo H. (hugo_hu)


Angehängte Dateien:

Lesenswert?

Warum malst Du Dir das nicht mal vorher auf - scheinbar hast Du 
bezüglich der Bits, Bit-Wertigkeiten und Halbbytes bzw. Hex-Werten 
einige Unsicherheiten.

Z. B. ein kleines Excel, wie in der Anlage.

von Martin (Gast)


Lesenswert?

... Oder auch nur ein Blatt Papier.

Füge nach jedem Schritt in deinem Programm eine Debug-Ausgabe ein.

Etwas Selbständigkeit schadet nicht.

von Adam P. (adamap)


Lesenswert?

Martin schrieb:
> Füge nach jedem Schritt in deinem Programm eine Debug-Ausgabe ein.

Oder im Windows Taschenrechner die Bitdarstellung aktivieren, schauen 
wie die gewünschte Zahl aussehen sollte (die untersten 10 Stellen) und 
dann mal den Debugger aktiveren und schauen wie die Port Resgister 
gesetzt werden.

Da sollte man direkt erkennen ob Bits "verschluckt" werden.

Evtl. sogar 2 weitere temporäre Variablen nutzen beim Zerlegen des 
Wertes, bevor die 2 einzelnen den Ports zugewiesen werden...ebenfalls im 
Debugger schön nachvollziehbar.

Edit:

H. schrieb:
> Svenja S. schrieb:
>> Bit 0-6 an PORTC und 7-10 an PORTD.
>
> Und das sind auch schon 11 Bit.

Das macht mich jetzt grad auch etwas stutzig?

Interessant wäre mal zu sehen (Zeichnung) welche Bits sie von den Ports 
nutzen möchte, bzw. wo die LED angeschlossen sind.
Mit deiesem Bit gerate kommen wir doch nicht weiter.

: Bearbeitet durch User
von H. (Gast)


Lesenswert?

Adam P. schrieb:
> Interessant wäre mal zu sehen (Zeichnung) welche Bits sie von den Ports
> nutzen möchte, bzw. wo die LED angeschlossen sind.
> Mit deiesem Bit gerate kommen wir doch nicht weiter.

Ganz genau. Skizze oder Text, welche LED an welchem Portbit hängt, dann 
gibt es exakte Hilfe! Wichtig wäre auch noch die Info, ob noch etwas 
anderes an den Ports hängt, dann müsste man noch passend ausmaskieren.

von H. (Gast)


Lesenswert?

H. schrieb:
> ob noch etwas anderes an den Ports hängt,

Meinte: ob noch etwas Anderes an den verbleibenden Bits von Port C/D 
hängt

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Svenja S. schrieb:
> Ich möchte mittels LEDs die besetzten Bits meines Programms darstellen
> lassen.

Svenja S. schrieb:
> Ich habe so das Gefühl, dass die Lösung super simpel ist, übersehe sie
> aber ^^'

Also ich hab mir das mal durch den Kopf gehen lassen.
Wenn deine LED an den Ports nebeneinander liegen ist es simpel,
hast du die aber über die Ports verstreut, sieht die Sache anders aus.
Diesen Fall habe ich jetzt mal angenommen, da mir deine Masken danach 
aussahen.

Einfach so mit einer Maske und einer Zuweisung wird dir das dann nicht 
gelingen.
Das Problem ist, dass du unter Umständen nebeneinanderliegende Bits von 
deiner value Variable "auseinanderziehen musst". bzgl. der Zuordnung der 
LED an den Ports.

Lösung 1: (siehe Code, nur eine Idee und auch nicht optimal)
[Jetzt erst gesehen...diese 010101 in Zeile 53 gehören dort nicht hin]
Ich hab ein dynamische Funktion gebastelt die die Bits durchläuft und 
dann setzt, das funktioniert, ist aber meiner Meinung nach voll 
Overplay.

Lösung 2:
Bit-Shifting, da bräuchtest du je LED eine Zuweisung:
Bsp mit 4 LED an PORTC:[x--x-xx-] (x = Ausgang)
1
PORTC |= (value & 1) << 1;
2
PORTC |= (value & 2) << 2;
3
PORTC |= (value & 4) << 4;
4
PORTC |= (value & 8) << 7;

Lösung 3: (da habe ich aber noch keine zufriedenstellende Lösung)
Man "errechnet" sich eine Maske die dann geschickt durch logische 
Verknüpfung/Verechnung die jeweiligen Bits ergibt.

: Bearbeitet durch User
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.