Forum: Mikrocontroller und Digitale Elektronik Atmega 8 Eingang kann nicht eingelesen werden


von DK1SI (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Guten Abend zusammen,

Soviel vorweg:
Ich weis es gibt bestimmt schon einige Einträge dieser Art aber ich habe 
über die Forensuche und im www nichts gefunden dass mich weitergebracht 
hätte.


Nun zu meinem Problem:

Ich versuche schon seit ein paar Tagen vergeblich einen Taster in meinen 
Atmega 8 mit C einzulesen.

Ich habe das Programm mal angehängt, meine Taster sind bereits schon 
Hardwareseitig mit PULL Ups hochgezogen , die LEDs sind Low Aktiv 
angeschlossen.

Ich vermute meine Fehler liegt an der IF anweisung aber laut gcc 
Tutorial müsste sie richtig sein.

Ich kann die LED nur ein einziges mal schalten dann ist ein Reset 
notwendig.
Dass die Ausgabe verzögert kommt stört mich vorerst mal nicht.

Vielen Dank im Voraus
Grüße
Simon

PS: Ich verwende das Atmel Evaluationsboard von Pollin.
Als Compiler verwende ich das AVR Studio.

von Karl H. (kbuchegg)


Lesenswert?

Nun, was erwartest du?
Laut deinem Programm schaltest du zwar die LED an PB0 ein, aber es gibt 
in der ganzen Hauptschleife keine einzige Anweisung, die die LED wieder 
ausschalten würde. Von alleine geht die nicht aus.

Formatiere deinen Code mal ein wenig vernünftig, dann siehst du das 
auch.
Nach jeder Anweisung eine Leerzeile machen, macht hauptsächlich eines: 
es zieht den Code in die Länge. Aber Übersicht bringt das nicht. Und 
auch Einrückungen sind kein überflüssiger Luxus.
1
#include <avr/io.h>
2
3
#define F_CPU 16000000UL             // 16 Mhz-Takt
4
#include <util/delay.h> 
5
6
int main (void)
7
{
8
  DDRB = 0xFF;                       //Ausgang definiert + auf Null gesetzt
9
  PORTB |=0xFF;
10
11
//DDRD =0x00;
12
  DDRD &= ~(1 << PD1); // PD0 als Eingang festlegen
13
14
//PORTD |= (1 << PD1); // Pullup für PD0 aktivieren
15
16
  while (1)                      //Hauptschleife diese darf nie verlassen werden!
17
  {
18
    PORTB |= (1 << PB2);              //LED PB0 blinkt 
19
    _delay_ms(63);
20
    PORTB &= ~(1 << PB2);           // PD0 deaktivieren
21
    _delay_ms(63);
22
23
    if (PIND & (1 << PD1)) 
24
    {
25
      //PORTB |= (1 << PB1);
26
      PORTB &= ~(1 << PB0);
27
    }
28
  }                        //Ende der Hauptschleife
29
30
  return 0;  
31
}                           //Programmende (wird nie erreicht)

Und ehe du Kommentare schreibst die falsche sind, ist es besser du 
schreibst die Kommentare gar nicht.
Nur ein Beispiel von mehreren:
1
  DDRD &= ~(1 << PD1); // PD0 als Eingang festlegen
Was stimmt denn nun? Ist der Kommentar falsch und das Setzen von PD1 auf 
Eingang ist richtig. Oder hast du im Programm einen Tippfehler gemacht 
und der Kommentar erzählt deine Absicht richtig, dass PD0 auf Eingang 
gestellt werden soll? Beides gleichzeitig kann nicht richtig sein.
Das Problem: Du als Mensch orientierst dich nur allzu gerne an den 
Kommentaren. Nur: dem µC sind deine Kommentare schnurz. Der führt das 
aus, was im Programmtext steht.

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.