Hallo, Wie zbs. 8bit binärzähler für atmega8, mit Taster und 8Led (DDRD 0xFF) und Taster an PB6! ........................................................................ ... #include <avr/io.h> #include <avr/delay.h> int main(void) { DDRB = ~(1<<PB6); DDRD |= 0xFF; while(1) { if (!(PINB & (1<<PINB6))) { _delay_ms(10); if (PINB & (1<<PINB6)) { _delay_ms(10); PORTD ++; } } } } ........................................................................ ... so bräuchte ich ein weiterschalten von 1 bis 8 mit Taster anwählbar! Nur nicht binär sondern chronologischer weiterschalten von PD0 bis PD7 ! Gibt es eine einfache Lösung? Wäre Fantastisch, mir ist noch nichts gelungen, zu dem bin ich "blutiger amateur"!
:
Verschoben durch Admin
Entprellen, Shiften und ins richtige Forum verschieben lassen... ;-)
Was ist zu Lösung des Problems bei Beitrag "avr schritt weiterschalten in c" falsch? Genau, das "PORTD++". Statt dessen muß ein Bit "an Rand" gesetzt werden, das je Tastendruck "eine Stelle weiter geschoben" wird. Fällt es am Ende raus, beginnt das Spiel von vorn. Das ganze ist noch richtungsmäßig anzupassen. Alles kann in einem C-Statement abgehandelt werden. Es benötigt die "Sonderzeichen" "?", ":" und "<" oder ">", je nach Richtung.
Danke für shifting Hinweis, habe einiges probiert! Habe es allerdings nicht hinbekommen! Herr Drexler! Die Änderungen im Listing könnten sie mir nicht aufskizzieren?! Trotzdem Vorerst Dankeschön aus Nürnberg
Ich bevorzuge eigentlich die Variant "Hilfe zur Selbsthilfe" bzw. "Schubs in die richtige Richtung, aber
1 | ...
|
2 | DDRD |= 0xFF; |
3 | PORTB = 1; // oder 0, wenn zuerst alles aus sein soll |
4 | ...
|
5 | _delay_ms(10); |
6 | if (PINB & (1<<PINB6)) |
7 | {
|
8 | |
9 | _delay_ms(10); |
10 | // PORTD ++;
|
11 | PORTD = (PORTD)?(PORTD<<1):1; |
12 | }
|
13 | ...
|
Mal ohne Kommentar und zum selberenträtseln (und ohne Gewähr auf Funktion, da einfach runtergeschrieben und sicher auch bald verrissen)
:
Bearbeitet durch User
Carl D. schrieb: > Mal ohne Kommentar und zum selberenträtseln > (und ohne Gewähr auf Funktion, da einfach runtergeschrieben und sicher > auch bald verrissen) Das geht von 0x00 bis 0x80, d.h. beim 9-ten Druck auf die Taste gehen alle LEDs aus. Sollte der TO von 0x01 bis 0x80 zählen, muss die Abfrage umformuliert werden.
Herzlichen Dank, ich werde es gleich testen und nötig ergänzen! Mein wissen ist mässig, als ich zur Schule ging, gab es noch keine Computer geschweige Händys, ich bin autotakt und zudem am Anfang ... Dankeschön
MIFA schrieb: > ich werde es gleich testen und nötig ergänzen! Falls du von 0x01 von 0x80 zählen willst:
1 | PORTD = ((PORTD != 0x80) && (PORTD != 0))?(PORTD<<1):1; |
MIFA schrieb: > ich werde es gleich testen und nötig ergänzen! > Mein wissen ist mässig, als ich zur Schule ging, gab es noch keine > Computer geschweige Händys, ich bin autotakt und zudem am Anfang ... Aber es gab Multiplikation und Division, und diese beiden Operationen reichen für Deine Aufgabenstellung schon aus. Lies mal ein gutes C Buch wie den K&R, die Sprache ist nicht selbsterklärend.
Getestet! Super ohne Änderungen beim ersten mal funktioniert! Herr Drexler sie haben meine Achtung! Dankeschön Hier nochmal das kompl. Listing: ...................................................................... #include <avr/io.h> #include <avr/delay.h> int main(void) { PORTB = 1; DDRD |= 0xFF; while(1) { if (!(PINB & (1<<PINB6))) { _delay_ms(10); if (PINB & (1<<PINB6)) { _delay_ms(10); //PORTD ++; PORTD =(PORTD)?(PORTD<<1):1; } } } }
Habe das Listing noch geändert um 1 bis 4 Kanäle umzuschalten: #include <avr/io.h> #include <avr/delay.h> int main(void) { PORTB = 1; DDRD |= 0xFF; while(1) { if (!(PINB & (1<<PINB6))) { _delay_ms(100); if (PINB & (1<<PINB6)) { _delay_ms(100); //PORTD ++; PORTD = ((PORTD != 0x08) && (PORTD != 0))?(PORTD<<1):1; } } } }
MIFA schrieb:
> Dankeschön
Bitteschön!
Als ich zur Schule ging, gab es (ganz am Ende) einen AppleII, den der
Direktor unter Verschluß hatte. Nur ein einziger Schüler dürfte den
benutzen. Ich war es nicht, aber bald danach war 81 und es gab den
gleichnamigen ZX von Sinclair.
PS:
Selber auf die Lösung kommen, notfalls mit einem Schubs in die richtige
Richtung, hilft langfristig.
Edit: wie man sehen kann ;-)
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.