Forum: Mikrocontroller und Digitale Elektronik ATmega8 ignoriert if-Anweisung


von Leigh B. (launebaer)


Lesenswert?

Hi Leute,

ich habe gerade damit begonnen mit einem ATmega8 meine ersten 
Erfahrungen in µC-Programmierung zu sammeln. Bisher bin ich ganz froh 
darüber eine LED zum Blinken gebracht zu haben, möchte jetzt aber dass 
sie nur blinkt wenn ein Input-Pin HIGH ist. Dafür habe ich eine 
if-Anweisung eingebaut, aber die wird einfach mal gepflegt ignoriert. 
Die LED blinkt unabhängig davon was am Pin anliegt, obwohl es in der 
Simulation funktioniert hat.

Ich habe das Test-Programm so simpel wie irgend möglich gehalten, hier 
mal der Code:
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
  DDRB = 0x02;
9
  DDRD = 0x00;
10
  
11
    while(1)
12
    {    
13
        if(PD2)
14
        {
15
            _delay_ms(1000);
16
            PORTB = 0x02;
17
            _delay_ms(618);
18
            PORTB = 0x00;
19
        }
20
    }
21
}

Also:
- Pin B1 wird auf Output gesetzt um die LED ansteuern zu können
- in der while-Schleife beginnt sofort die Abfrage, da das ständig 
gemacht werden soll

Wäre bitte jemand so nett mir zu helfen? Ich blick da nicht ganz durch.

Danke

von Peter II (Gast)


Lesenswert?

Leigh Beyst schrieb:
> Wäre bitte jemand so nett mir zu helfen? Ich blick da nicht ganz durch.

> if(PD2)

PD2 ist ein define und steht für eine 2

also steht dort

if(2)

und das macht wenig sinn.

von Martin S. (tungl)


Lesenswert?


von icke (Gast)


Lesenswert?

Eingänge liest man mit PINX. Das liefert den kompletten Port zurück.

Dann kann man binäre Operationen drauf ausführen, um den entsprechenden 
Pin zu erhalten.

Bei Dir also sowas wie
1
 if (PINB & 0x02)
2
{
3
...
4
}

von Cyblord -. (cyblord)


Lesenswert?

icke schrieb:

> Bei Dir also sowas wie
>
1
 if (PINB & 0x02)
2
> {
3
> ...
4
> }
5
>

Ne, so:
1
if (PINB & (1<<PD2))
2
{}

Und noch besser, wenn man per #define sowohl PINB als auch PD2 sinnvolle 
Namen gibt. Dann sieht man auf den ersten Blick was passieren soll.

von Leigh B. (launebaer)


Lesenswert?

Ok.

Erstmal danke für diese schnellen Antworten.

Ich habe jetzt jede Variation ausprobiert, die mir in den Sinn kam:
1
...
2
if(PD2)
3
{
4
...
5
}
6
...

LED blinkt immer
1
...
2
if(PIND2)
3
{
4
...
5
}
6
...

LED blinkt immer
1
...
2
if(PIND2 == 1)
3
{
4
...
5
}
6
...

LED blinkt nie
1
...
2
if(PIND == 0b00000100) //nur mal auf Nummer Sicher
3
{
4
...
5
}
6
...

LED blinkt nie

In keinem der Fälle reagiert es auf eine Änderung des Inputs.

von Martin S. (tungl)


Lesenswert?

Lies bitte die Antworten bzw. das Tutorial richtig. Keine Deiner 
Varianten entspricht den dort aufgefuehrten.

von Leigh B. (launebaer)


Lesenswert?

icke schrieb:
> Bei Dir also sowas wie if (PINB & 0x02)
> {
> ...
> }

Ok das hat es tatsächlich getan. Scheint nur eine Frage des Maskierens 
gewesen zu sein. Daran habe ich natürlich nicht mehr gedacht.

Vielen vielen Dank!!!

von Martin (Gast)


Lesenswert?

Keiner Deiner "Lösungs-Varianten"  scheint irgendeine der Hilfs-Postings
aufzugreifen.

Autismus?

von Andreas B. (bitverdreher)


Lesenswert?

Es ist schon ein Kunststück, alles zu testen und dabei zu ignorieren was 
oben schon geschrieben wurde.

Glückwunsch!

von Leigh B. (launebaer)


Lesenswert?

Zu meiner Verteidigung: Ich hatte es getestet und war gerade dabei es 
abzutippen als die Vorschläge eingingen.

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.