avr schritt weiterschalten in c

Gast #4674732
Lesenswert?

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"!
#4674801
Lesenswert?

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.
Gast #4674950
Lesenswert?

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
#4674962
Lesenswert?

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)
Gast #4675005
Lesenswert?

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
#4675022
Lesenswert?

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.
Gast #4675029
Lesenswert?

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;
  }


  }

    }
}
Gast #4675044
Lesenswert?

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;
  }


  }

    }
}
#4675184
Lesenswert?

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 ;-)

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