Forum: Mikrocontroller und Digitale Elektronik avr schritt weiterschalten in c


von MIFA (Gast)


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"!

: Verschoben durch Admin
von Kai S. (kai1986)


Lesenswert?

shiften

von Mikrocon T. (-42-)


Lesenswert?

Entprellen, Shiften und ins richtige Forum verschieben lassen... ;-)

von Carl D. (jcw2)


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.

von MIFA (Gast)


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

von Carl D. (jcw2)


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)

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von MIFA (Gast)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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;

von Jim M. (turboj)


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.

von MIFA (Gast)


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


  }

    }
}

von MIFA (Gast)


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


  }

    }
}

von Carl D. (jcw2)


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

: 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
Noch kein Account? Hier anmelden.