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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.