Bitweise Darstellung mit 10 LEDs

#6799782
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
Moderator (Firma: Titel) Persönliche Seite #6799788
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.
#6799803
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...
Moderator (Firma: Titel) Persönliche Seite #6799868
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.
#6799884
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.
Gast #6799938
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.
#6800150
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.
Angehängte Dateien:

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