Kriege den Taster nicht eingelesen

Gast #1962533
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
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
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.
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
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
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.
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
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 ....
Alexander schrieb:
> Warum aber funktioniert das hier nicht:
>    while(1) {
>
>
>   if ( PINC & ( 1 << PIN0 ) ) {
>
>  // Ausgänge von Port B beschreiben
>   PORTB = (1<<PIN2) | (1<<PIN1);
> }
>
>    }
>
>    return 0;
> }
>

Weil hier in keinster Weise die in der If-Anweisung gesetzen Bits 
zurückgesetzt werden. In dem anderen Quelltext wird das jedoch im 
Else-Zweig getan.
Gast
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.