Forum: Mikrocontroller und Digitale Elektronik Fehler im Quellcode


von Constantin Alexandru M. (azzuro)


Lesenswert?

Hallo zusammen, bin neu hier und unerfahren bezüglich der 
µC-Programmierung.
Ich möchte mit Hilfe eines kapazitiven Tasters 3 Ausgänge ansteuern und 
zwar nach dem gleichen Prinzip, wie 3 D-Flipflops im Ringregister. Das 
soll einfach heißen, nach jedem Betätigen des Tasters, schaltet er von 
einem Ausgang zum anderen durch und der vorherige erlischt. Als 
Mikrocontroller benutze ich einen ATmega 8. Das Problem befindet sich im 
Source Code. Wenn ich den Taster drücke, tut sich absolut nichts. Ändere 
ich aber die if-Anweisung: PD1, PD2 und PD3 vergleichen mit 1, schaltet 
er bei Betätigung nur einmal durch und bleibt dann auch bei PD2 hängen. 
Was mache ich hier falsch?
1
#include <avr/io.h>
2
 
3
int main () {
4
DDRD=0x0E;
5
PORTD=0x0C;
6
   while (1){
7
       if (PIND & 0x01) {
8
         if (PD1 == 0) {
9
           PORTD =  0x0A;      
10
       } else if (PD2 == 0) {
11
           PORTD =  0x06;      
12
       } else if (PD3 == 0) {
13
           PORTD =  0x0C;     
14
       }
15
     }
16
   }
17
return 0;
18
}

von Spess53 (Gast)


Lesenswert?

Hi

>if (PD1 == 0)

heißt übersetzt

if (1 == 0)

MfG Spess

von Constantin Alexandru M. (azzuro)


Lesenswert?

Ich dachte while (1) wäre schon die Endlos-Schleife. Wie sieht die dann 
aus?

von Tom K. (ez81)


Lesenswert?

Bitte beim nächsten mal richtig einrücken, so wie oben ist das 
verwirrend.
1
#include <avr/io.h>
2
3
int main()
4
{
5
    DDRD = 0x0E;
6
    PORTD = 0x0C;
7
    while (1) {
8
        if (PIND & 0x01) {
9
            if (PD1 == 0) {
10
                PORTD = 0x0A;
11
            } else if (PD2 == 0) {
12
                PORTD = 0x06;
13
            } else if (PD3 == 0) {
14
                PORTD = 0x0C;
15
            }
16
        }
17
    }
18
    return 0;
19
}

Pins werden anders abgefragt:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29

von Constantin Alexandru M. (azzuro)


Lesenswert?

Ok, mit den Pins habe ich jetzt verstanden. Aber was ist das für eine 
Endlos-Schleife, die trotzdem bei PD2 stehenbleibt?

von Karl H. (kbuchegg)


Lesenswert?

Constantin Alexandru Mauro schrieb:
> Ok, mit den Pins habe ich jetzt verstanden. Aber was ist das für eine
> Endlos-Schleife, die trotzdem bei PD2 stehenbleibt?

Vergiss die Endlosschleife.
Das war eine Falschmeldung.

Kümmere dich lieber um die fehlerhaften Pinabfragen.

Das hier
1
            if (PD1 == 0) {

ist KEINE Abfrage eines Prozessorpins. PD0, PD1, PD2 sind nichts anderes 
als 'andere Namen' für 0, 1 und 2.

Das hier
1
        if (PIND & 0x01) {

ist eine Pinabfrage. Aber die fragt eben nur den Pin 1 (PD1) ab.

von holger (Gast)


Lesenswert?

>Das hier
>
>        if (PIND & 0x01) {
>
>ist eine Pinabfrage. Aber die fragt eben nur den Pin 1 (PD1) ab.

Nein, es ist PD0;)

von Karl H. (kbuchegg)


Lesenswert?

holger schrieb:
>>Das hier
>>
>>        if (PIND & 0x01) {
>>
>>ist eine Pinabfrage. Aber die fragt eben nur den Pin 1 (PD1) ab.
>
> Nein, es ist PD0;)


Daaanke.

von Constantin Alexandru M. (azzuro)


Lesenswert?

Vielen Dank. Jetzt geht es.

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.