Forum: Mikrocontroller und Digitale Elektronik Bedingte While-Schleife AVR ATmega8 DIL28


von Sebastian S. (audionaut)


Lesenswert?

Hey Leute,

bin ganz neu im µC Bereich und habe gerade mal wieder keine Ahnung was 
ich falsch machen. Habe in allen Tutorials die die Seite und google so 
hergeben keine Lösung für mein Problem gefunden. Deswegen stell ich die 
peinlich einfache Frage jetz mal hier.

Das Programm ist denke ich selbst erklärend. Ein Taster an PB0 soll zwei 
LEDs an PD6 und PD7 zum Blinken bringen so lange wie er gedrückt ist. 
Doch es will einfach nicht funktionieren. Setze ich die While-Bedingung 
auf 1 klappt es, also muss es irgendwas mit der Bedingung oder dem 
Eingang zu tun haben.

Was mach ich nur falsch???
1
#define F_CPU 1000000UL      //Taktfrequenz ist 1MH
2
#include <util/delay.h>
3
#include <avr/io.h>
4
5
#define TASTER PB0        //Gebe PB0 den Namen TASTER
6
7
int main(void){
8
  
9
  DDRD = 0b11000000;      //PD6 und PD7 sind Ausgänge
10
  DDRB = 0b00000000;      //PORTB ist Eingang
11
    
12
  while(TASTER){        //Führe Schleife aus, wenn TASTER == 1
13
    
14
    PORTD = 0b01000000;    //Lösche PD7 und setze PD6
15
    _delay_ms(500);      //Warte 500ms
16
    PORTD = 0b10000000;    //Lösche PD6 und setze PD7
17
    _delay_ms(500);      //Warte 500ms
18
  
19
  }
20
}

von troll (Gast)


Lesenswert?


von Sebastian S. (audionaut)


Lesenswert?

Hm funktioniert auch nicht. Habe auch mal
1
while(PINB & (1<<PINB0))

probiert, aber immernoch nichts. Die Spannung an diesem pin kontrolliere 
ich nebenbei immer. Da kommen die 5V an...

von Malte S. (maltest)


Lesenswert?

Taster schaltet also gegen Vcc? Hast du einen Pull-Down-Widerstand dran? 
Oder schaltet der Taster nach GND, dann kannst du den internen Pull-Up 
nehmen: PORTB |= (1 << TASTER);

von Karl (Gast)


Lesenswert?

Sebastian Schubert schrieb:
> ...
> Das Programm ist denke ich selbst erklärend. Ein Taster an PB0 soll zwei
> LEDs an PD6 und PD7 zum Blinken bringen so lange wie er gedrückt ist.
> Doch es will einfach nicht funktionieren. Setze ich die While-Bedingung
> auf 1 klappt es, also muss es irgendwas mit der Bedingung oder dem
> Eingang zu tun haben.
> ...
>   while(TASTER){        //Führe Schleife aus, wenn TASTER == 1
>
>     PORTD = 0b01000000;    //Lösche PD7 und setze PD6
>     _delay_ms(500);      //Warte 500ms
>     PORTD = 0b10000000;    //Lösche PD6 und setze PD7
>     _delay_ms(500);      //Warte 500ms
>
>   }

Mach mal ne Endlosschleife
while(1) {...}
drum rum, und frage innerhalb den Taster ab.
(So wird das alles nur 1* durchlaufen und fertig - bzw drück mal den 
Taster bevor Reset bzw. power on, dann sollte es auch loslaufen, aber 
nur einmal, d.h. sobald du den Taster loslässt kein 2. mal...).

von Dominic A. (neo123)


Lesenswert?

Die while(1) Schleife fehlt. Somit wird die Bedingung nur einmal 
abgefragt und danach kann das Programm alles mögliche machen.

von Sebastian S. (audionaut)


Lesenswert?

Ja Taster schalten gegen VCC mit Pull-Down. Also bei gedrücktem Taster 
1. Denn wenn er nach GND schaltet ist es ein Öffner oder?

von Malte S. (maltest)


Lesenswert?

Nein, aber dann brauchst du keinen externen Widerstand weil die AVRs 
interne Pull-Ups haben, die man bei Eingängen mit PORTx aktivieren kann. 
Kein Öffner, nur invertierte Logik (1 = nicht gedrückt, 0 = gedrückt).
Aber die fehlende Endlosschleife war natürlich das eigentliche Problem.

von Sebastian S. (audionaut)


Lesenswert?

Ah ok jetzt hab ich den Fehler kapiert. Danke für die Erleuchtung!

Und mit dem 'öffner', da meinte ich auch logisch 0 bei Betätigung. Wenn 
ich das so schalte muss ich ihn aber auch auf 0 abfragen oder? Das mit 
dem internen pull-up is natürlich ne feine Sache. Spart pro Eingang 
einen Widerstand. Kannte ich auch schon... Is halt bisschen verdrehte 
Logik, aber werde das ab jetzt auch so machen.
Nur nichtmehr heute. PC is schon aus und Beine liegen auf der Couch. 
Werd es aber morgen gleich mal probieren!

Danke nochmal

von Malte S. (maltest)


Lesenswert?

Sebastian Schubert schrieb:
> Wenn ich das so schalte muss ich ihn aber auch auf 0 abfragen oder?

Genau. Und da sowas immer wieder auftaucht, gewöhnt man sich auch ganz 
schnell daran. Ob if (PINx & (1 << ...)) oder if (!(PINx & (1 << ...))) 
ist ja nicht die Welt :)
Zumal speziell wenn es um Taster geht und um andere Reaktionen als 
Blinken wenn gedrückt, ist Entprellung immer einen Blick wert, da 
verschwindet die genaue Bedingung ohnehin sehr schnell in der 
Bedeutunslosigkeit, am Ende bleibt nur noch eine Variable mit dem 
aufbereiteten Input.

von Sebastian S. (audionaut)


Lesenswert?

Achja stimmt. Wenn es dann um counter geht sollte Entprellung vorhanden 
sein. Ich denke ich werde immer einen Entprellkondensator setzen. Das 
erscheint mir am Einfachsten und ist vom Zeitverlust her auch eine gute 
option da der Kondensator ja ab der ersten Prellflanke den Pegel hält. 
Aber das werde ich noch austesten wenn ich soweit bin.

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.