es geht mir konkret um die Zeile PORTB=characters[i++];
auf dem Display taucht nur Mist auf. trage ich statt i++ beliebige
nummern ein (0-9) ist alles io.
frank schrieb:> auf dem Display taucht nur Mist auf
Es ist schon spät und du bist zu langsam. ;-)
Du benötigst eine Verzögerung nach der Ausgabe, damit der Mensch es
lesen kann.
nein daran liegt es nicht. mit festen werten geht es ja.
das ganze läuft ja in einer endlosschleife. soll heißen erste ziffer
immer 0 zweite immer 1... daher endet es in einem standbild. nur passt
es einfach nicht.
und kp woran es liegt :/ (software seitig)
Hallo,
im Code gehst du davon aus dass du den Wert den du in PORTD
reinschreibst auch wieder lesen kannst. Das ist aber bei einem
Spezialregister (hier wohl zur Ausgabe auf einen Port) nicht unbedingt
der Fall. Das hängt ganz davon ab wie die Hardware gebaut ist.
Deshalb meine Frage: Was passiert wenn du die Abfrage if(PORTD>=0x80)
ersetzt durch if(i>=8)?
Viel Erfolg!
Helmut
Hier initialisierst du ein Array der Größe 10 mit 11 Werten.
> while(1){> PORTD<<=1;> if(PORTD>=0x80) {PORTD=1; i=0;}> PORTB=characters[i++];> };> }>
Beim ersten Durchlauf wird hier PORTB nie geschrieben bei gesetztem
unteren Bit von PORTD. Dafür wird bei allen weiteren Durchläufen PORTB
nie geschrieben bei gesetztem oberen Bit von PORTD. Es bedeutet auch,
daß immer nur die ersten 7 deiner 11 Array-Einträge überhaupt genutzt
werden.
Rolf Magnus schrieb:> Beim ersten Durchlauf wird hier PORTB nie geschrieben bei gesetztem> unteren Bit von PORTD. Dafür wird bei allen weiteren Durchläufen PORTB> nie geschrieben bei gesetztem oberen Bit von PORTD. Es bedeutet auch,> daß immer nur die ersten 7 deiner 11 Array-Einträge überhaupt genutzt> werden.
Das PORTB=characters[i++]; gehört nicht zum if.
Die Klammern/Einrückung sind sehr bescheiden.
frank schrieb:> ersetze in obiger funktion i++ durch 0 bis 9> PORTB=characters[0];
Wie machst du das? Im Debugger? Dann hälst du die Ausgabe ja an und
bekommst dein delay.
Bitte den code zeigen!
DirkB schrieb:> Das PORTB=characters[i++]; gehört nicht zum if.
Ja, aber das ändert an meiner Aussage doch nichts. Überleg einfach mal:
Welchen Wert hat PORTD vor dem ersten Schleifendurchlauf. Welchen hat
er, wenn zum ersten mal PORTB=charactersſ[i++] aufgerufen wird? Welchen
Wert hat er direkt nachdem das if zugeschlagen hat? Und wenn bei PORTD
durch die Schiebe-Operation das oberste Bit gesetzt wurde, welchen Wert
hat es danach beim nächsten PORTB=...-Aufruf?
xfr schrieb:> Warum überhaupt so verschwurbelt? Man kann nur ahnen, was damit damit> erreicht werden soll. Vermutlich ist so etwas gemeint:> int i = 0;> while (1) {> if (i > 7) {> i = 0;> }> PORTD = (1 << i);
Den Registernamen nach zu urteilen handelt es sich um einen AVR. Da
sollte man das Schieben um eine Variable vermeiden.
> PORTB = characters[i];> i++;> }
Generell finde ich das immer noch unschön. Wenn da was 8 mal getan
werden soll, dann doch bitte eine eigene Schleife dafür und nicht den
Zähler in die umgebende Schleife irgendwie mit reingewurschtelt. Mein
Vorschlag:
Hatte ein Brett vorm Kopf. Die Lösung war natürlich das delay.
Dadurch das es fehlte kam es zu Ghosting Effekten.
Durch die hohe Frequenz, war der Effekt so stark das man ihn vom
gewollten Leuchten nicht unterscheiden konnte.
>im Code gehst du davon aus dass du den Wert den du in PORTD>reinschreibst auch wieder lesen kannst. Das ist aber bei einem>Spezialregister (hier wohl zur Ausgabe auf einen Port) nicht unbedingt>der Fall. Das hängt ganz davon ab wie die Hardware gebaut ist.
geht afaik via assembler eigentlich nicht beim atmega8. C fixed das wohl
beim assemblieren automatisch. Sieht etwas unsauber aus, aber naja.
frank schrieb:>>Spezialregister (hier wohl zur Ausgabe auf einen Port) nicht unbedingt>>der Fall. Das hängt ganz davon ab wie die Hardware gebaut ist.>> geht afaik via assembler eigentlich nicht beim atmega8.
Technisch geht das grundsätzlich schon. Die entsprechenden Assembler
Anweisungen existieren und werden auch ausgeführt.
> C fixed das wohl> beim assemblieren automatisch. Sieht etwas unsauber aus, aber naja.
Nicht naja. Das ganze zurücklesen ist unnötig, wenn man das Programm
anders aufbaut. Du kriegst für nicht benutztes SRAM von Atmel kein Geld
zurück. Und so in Speichernot scheinst du nicht zu sein, dass du
Ausgabeports als Zwischenspeicher benutzen musst.
>Und so in Speichernot scheinst du nicht zu sein, dass du>Ausgabeports als Zwischenspeicher benutzen musst.
wer den pfennig nicht ehrt...!
Spass bei Seite, hat das ganze den einen Nachteil?