Kriege den Taster nicht eingelesen

Gast #1962533
Lesenswert?
• ▲
▼
Hallo,
ich verwende das MK2 bard USB von AVR mit einem Atmega8 und versuche 
einen Taster einzulesen doch leider funzt das nicht. Es soll, wenn man 
den Taster drück,eine LED angehen. Bei dem Booard sind die Schalter GND 
schaltend, ist das vielleicht mein Problem?

Was mache ich da noch verkehrt?
Vielen Dank
1
// Test LED blinken - Taster etc. //
2

3
#include <avr/io.h>          
4
#define Bit0 0
5
#define Bit1 1
6
#define Bit2 2
7
#define Bit3 3
8
#define Bit4 4
9
#define Bit5 5
10

11

12

13
int main (void) {            
14
 
15
 
16
   DDRB    = 0xff;       // Port B als Ausgang definieren
17
   DDRC    = 0x00;       // Alle Pins auf Eingang
18
   PORTC   = 0xff;       // Port C Pulldown aktivieren
19

20

21
         
22

23
if ( PINC & (1<<PINC0) ) { 
24

25

26
 // Ausgänge von Port B beschreiben
27
  PORTB = (1<<Bit2) | (1<<Bit0);
28
}         
29

30

31

32

33

34

35

36
   while(1) {                
37
   return 0;                
38

39
}
40
}
Gast #1962682
Lesenswert?
• ▲
▼
Alexander schrieb:

>    while(1) {
>    return 0;
>
> }
> }

wie wärs mit:
1
 while( 1 ) {
2

3
  // Wenn Pin gesetzt Ausgänge setzen
4
  if ( PINC & ( 1 << PIN0 ) ) PORTB = ( 1 << PIN2 ) | ( 1 << PIN0 );
5

6
  // Sonst Ausgänge löschen
7
  else PORTB = 0;
8

9
 }
10

11
 return 0;
12
}

Und die Bits sind auch schon fertig:

Auszug aus portpins.h ( wird durch io.h eingebunden ):
1
/* Port Input Pins (generic) */
2
#define    PIN7         7
3
#define    PIN6         6
4
#define    PIN5         5
5
#define    PIN4         4
6
#define    PIN3         3
7
#define    PIN2         2
8
#define    PIN1         1
9
#define    PIN0         0
Gast #1964441
Lesenswert?
• ▲
▼
1000 Dank.

Ich habe es zwar noch nicht ausprobiert aber deine (Tim) Variante ist ja 
weinwenig eleganter. Aber was habe ich denn falsch gemacht. Ich gehe 
jetzt mal davon aus das deine Funktioniert.
#1964462
Lesenswert?
• ▲
▼
Bei Deinem Programm muss der Taster während dem Reset gedrückt sein, 
sonst landet das Programm in der while(1) und fragt dort gar nicht mehr 
ob der Taster gedrückt ist. (Von Reset bis zur Abfrage sind es weniger 
als eine Millisekunde, so schnell kannst Du nicht drücken)

Zusätzlich hast du in der while(1) ein return drinstehen. Wohin soll 
dein Programm denn zurückkehren? (Das return aus der main() sollte in 
einem Mikrocontrollerprogramm nie erreicht werden.)
Gast #1964497
Lesenswert?
• ▲
▼
Das mit der while habe ich hiervon:
(Steht im AVR-GCC-Tutorial 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial)
1
* Alle Zeichen zwischen Schrägstrich-Stern 
2
   und Stern-Schrägstrich sind lediglich Kommentare */
3
 
4
// Zeilenkommentare sind ebenfalls möglich
5
// alle auf die beiden Schrägstriche folgenden
6
// Zeichen einer Zeile sind Kommentar
7
 
8
#include <avr/io.h>          // (1)
9
 
10
int main (void) {            // (2)
11
 
12
   DDRB  = 0xff;             // (3)
13
   PORTB = 0x03;             // (4)
14
 
15
   while(1) {                // (5a)
16
     /* "leere" Schleife*/  // (5b)
17
   }                         // (5c)
18
 
19
   /* wird nie erreicht */
20
   return 0;                 // (6)
21
}

Ist das falsch ?
Gast #1964514
Lesenswert?
• ▲
▼
Tatsache....
Ich habe soviel ausprobiert, da ist das dann verrutscht. Danke.
Also wenn ich es richtig verstehe muss mein Prog in die While Schleife. 
Deklerationen kommen über die Schleife. (Registerfestlegeung etc.) Wenn 
ich die Dekleration ändere reicht es dann das ich neu übertrage oder 
muss ich zwingend ein Reset ausführen ?

PS. Bin seit 1h Stunde erst dabei mich mit dem Micro zu befassen.Sorry.
#1964537
Lesenswert?
• ▲
▼
Alexander schrieb:
> Tatsache....
> Ich habe soviel ausprobiert, da ist das dann verrutscht. Danke.
> Also wenn ich es richtig verstehe muss mein Prog in die While Schleife.

Genau.
Dort findet deine Programmlogik statt

Der grundsätzliche Aufbau ist immer gleich
1
#include <avr/io.h>
2
 
3
int main (void)
4
{
5

6
  // Variablen definieren, die in main gebraucht werden
7
  // globale Variablen auf die richtigen Werte einstellen
8

9

10
  // µC richtig konfigurieren
11
  // Ports einstellen, Timer einstellen etc.
12

13
  while( 1 ) {
14

15
    // Programmlogik
16
    // zb wenn Taster gedrückt, LED einschalten
17
    //    wenn Taster nicht gedrückt, LED ausschalten
18

19
  }
20

21
  return 0;
22
}

> Deklerationen kommen über die Schleife. (Registerfestlegeung etc.) Wenn
> ich die Dekleration ändere reicht es dann das ich neu übertrage oder
> muss ich zwingend ein Reset ausführen ?

Wenn du neu überträgst, wird sowieso der Prozessor immer resettet
Gast #1964911
Lesenswert?
• ▲
▼
Warum aber funktioniert das hier nicht:
1
   while(1) {     
2
   
3

4
  if ( PINC & ( 1 << PIN0 ) ) {
5

6
 // Ausgänge von Port B beschreiben
7
  PORTB = (1<<PIN2) | (1<<PIN1);
8
}      
9
    
10
   }         
11

12
   return 0;                
13
}

und das funktioniert:
1
 while( 1 ) {
2

3
  // Wenn Pin gesetzt Ausgänge setzen
4
  if ( PINC & ( 1 << PIN0 ) ) PORTB = ( 1 << PIN2 ) | ( 1 << PIN0 );
5

6
  // Sonst Ausgänge löschen
7
  else PORTB = 0;
8

9
 }
10

11
 return 0;
12
}

Kann ich bei ner If - Anweisung nicht hinterm { was stehen haben ? 
Versteh ich nicht ....
Gast #1964929
Lesenswert?
• ▲
▼
Shit, du has so recht;-)------ mmmhhh.
Kannst Du mir auch noch sagen warum in dieser Anweisung die LED's beim 
drücke ausgehen ?
1
   while(1) {     
2
   
3

4
  if ( PINC & ( 1 << PIN0 )) 
5

6
 
7
  PORTB = (1<<PIN0) | (1<<PIN1);      // Ausgänge von Port B beschreiben
8
     
9
  else PORTB = 0;

Für mich ist dieser Part  ( PINC & ( 1 << PIN0 ))  ein ganz klares UND.

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.