mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik avr schritt weiterschalten in c


Autor: MIFA (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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
Autor: Kai S. (kai1986)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
shiften

Autor: Mikrocon T. (-42-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entprellen, Shiften und ins richtige Forum verschieben lassen... ;-)

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MIFA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bevorzuge eigentlich die Variant "Hilfe zur Selbsthilfe" bzw. 
"Schubs in die richtige Richtung, aber
...
    DDRD |= 0xFF;
    PORTB = 1;  // oder 0, wenn zuerst alles aus sein soll
...
    _delay_ms(10);
    if (PINB & (1<<PINB6))
  {

    _delay_ms(10);
    // PORTD ++;
    PORTD = (PORTD)?(PORTD<<1):1;
  }
...
Mal ohne Kommentar und zum selberenträtseln
(und ohne Gewähr auf Funktion, da einfach runtergeschrieben und sicher 
auch bald verrissen)

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

Bewertung
-1 lesenswert
nicht 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.

Autor: MIFA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marc V. (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
MIFA schrieb:
> ich werde es gleich testen und nötig ergänzen!

 Falls du von 0x01 von 0x80 zählen willst:
    PORTD = ((PORTD != 0x80) && (PORTD != 0))?(PORTD<<1):1;

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MIFA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }


  }

    }
}

Autor: MIFA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }


  }

    }
}

Autor: Carl D. (jcw2)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.