Kann PINs nicht einlesen :(

Gast #1573490
Lesenswert?
• ▲
▼
Hallo!
Ich bin am Verzweifeln.
Am Pin D3 messe ich normal 0V, mit gedrücktem Button 5V.
Alles nett soweit, ist n PullDown dran, soll ja so sein.
Leider kriegt der Atmega32-16AU das garnicht mit!!!

Folgender Code bringt die LED dazu durchgehend zu leuchten, egal wie 
sehr ich auf dem Button rumdrücke.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <stdlib.h>
4

5
#define LED_PIN PD6
6
#define LED_PORT PORTD
7

8
#define BUTTON_PIN PD3
9
#define BUTTON_PORT PORTD
10

11
int main (void) {  
12
  // Jetzt die Ports richtig beschalten:
13

14
  DDRA = 0b11111111; // PA7 - PA0 als Ausgang (1)
15
  PORTA = 0b00000000; // PA7 - PA0 auf LOW schalten (0)
16

17
  DDRB = 0b11100011; // PB7 - PB5 und PB1 - PB0 als Ausgang (1), PB4 - PB2 als Eingang (0)
18
  PORTB = 0b00000000; // PB7 - PB0 auf LOW schalten (0), erstmal keinen Internen PullUps (Wäre 1)
19

20
  DDRC = 0b11111111; // PC7 - PC0 als Ausgang (1)
21
  PORTC = 0b00000000; // PC7 - PC0 auf LOW schalten (0)
22

23
  DDRD = 0b11110000; // PD7 - PD4 als Ausgang (1), PD3 - PD0 als Eingang (0)
24
  PORTD = 0b00000011; // PD7 - PD4 auf LOW schalten (0), Interne PullUps für PD1 - PD0 anschalten (1)
25
  // ACHTUNG! PD0 ist RXD, PD1 ist TXD!
26

27
  LED_PORT |= (1<<LED_PIN);
28
  _delay_ms(500);
29
  LED_PORT &= ~(1<<LED_PIN);
30

31
  while (1) {
32
    if ((BUTTON_PORT & (1<<BUTTON_PIN))) {
33
      LED_PORT &= ~(1<<LED_PIN);
34
    } else {
35
      LED_PORT |= (1<<LED_PIN);
36
    }
37
    _delay_ms(5);
38
  }
39
}

Hat jemand ne Idee? JTAG habe ich schon zig mal ausgeschaltet, das 
sollte an dem Port aber eh nichts machen, oder?

Danke, Toby
#1573497
Lesenswert?
• ▲
▼
Toby schrieb:

> Hat jemand ne Idee?

Ja.
Schalte mal den Pullup an PD3 ein.

Und wenns das war, dann hast du auch die Begründung, warum du die 
Initalisierung besser so schreibst
1
  DDRD = ( 1 << LED_PIN );       // Led auf Ausgang
2
  PORTD = ( 1 << BUTTON_PIN );   // dafür am Button den Pullup ein

so kannst du, solange du den Port nicht insgesamt wechselst, nicht 
vergessen, den Led-Pin auf Ausgang und den Pullup auf "ein" zu schalten. 
Egal auf welchem Pin die LED bzw. der Taster liegt. Du musst nur auf 
deine #define aufpassen, dass es zu keinen Konflikte kommt. Alles andere 
regelt dann der Compiler.

Edit: gerade gesehen
Eingelesen wird vom PIN Register, nicht vom Port
1
#define BUTTON_PORT   PIND
Gast #1573512
Lesenswert?
• ▲
▼
Ob PD3 oder PIND3 da steht, ändert überhaupt nichts. Beides sind 
Konstanten für 3.

Dies verrät ein Blick ins Header-File iom32.h, welches von avr/io.h 
eingebunden wird:
1
/* PORTD */
2
#define PD7     7
3
#define PD6     6
4
#define PD5     5
5
#define PD4     4
6
#define PD3     3
7
#define PD2     2
8
#define PD1     1
9
#define PD0     0
10

11
...
12

13
/* PIND */
14
#define PIND7   7
15
#define PIND6   6
16
#define PIND5   5
17
#define PIND4   4
18
#define PIND3   3
19
#define PIND2   2
20
#define PIND1   1
21
#define PIND0   0

Evtl. ist es etwas eleganter diejenigen Konstanten zu verwenden, die für 
den entsprechenden Port definiert wurden, funktional macht das aber 
nicht den geringsten Unterschied.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.