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
voidout(uint16_tvalue);
4
5
intmain(void)
6
{
7
DDRC|=0x3F;
8
DDRD|=0xFF;
9
10
out(0x00F0);
11
12
while(1)
13
{
14
}
15
}
16
17
voidout(uint16_tvalue)
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
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.
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.
> 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
voidout(uint16_tvalue);
4
5
intmain(void)
6
{
7
DDRC|=0x003F;
8
DDRD|=0x00FF;
9
10
out(0x0100);
11
//out(256);
12
13
while(1)
14
{
15
}
16
}
17
18
voidout(uint16_tvalue)
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...
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;
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.
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.
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.
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.
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.