www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Kriege den Taster nicht eingelesen


Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
// Test LED blinken - Taster etc. //

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



int main (void) {            
 
 
   DDRB    = 0xff;       // Port B als Ausgang definieren
   DDRC    = 0x00;       // Alle Pins auf Eingang
   PORTC   = 0xff;       // Port C Pulldown aktivieren


         

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


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







   while(1) {                
   return 0;                

}
}
 

Autor: Chris M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

und das folgende Kapitel über Entprellung beachten.

Zum Board bzw. der Schaltung selbst kann ich nichts sagen.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:

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

wie wärs mit:
 while( 1 ) {

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

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

 }

 return 0;
}

Und die Bits sind auch schon fertig:

Auszug aus portpins.h ( wird durch io.h eingebunden ):
/* Port Input Pins (generic) */
#define    PIN7         7
#define    PIN6         6
#define    PIN5         5
#define    PIN4         4
#define    PIN3         3
#define    PIN2         2
#define    PIN1         1
#define    PIN0         0

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du "kriegst" den Taster nicht eingelesen? ...

Autor: Klaus T. (gauchi)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit der while habe ich hiervon:
(Steht im AVR-GCC-Tutorial 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial)
* Alle Zeichen zwischen Schrägstrich-Stern 
   und Stern-Schrägstrich sind lediglich Kommentare */
 
// Zeilenkommentare sind ebenfalls möglich
// alle auf die beiden Schrägstriche folgenden
// Zeichen einer Zeile sind Kommentar
 
#include <avr/io.h>          // (1)
 
int main (void) {            // (2)
 
   DDRB  = 0xff;             // (3)
   PORTB = 0x03;             // (4)
 
   while(1) {                // (5a)
     /* "leere" Schleife*/  // (5b)
   }                         // (5c)
 
   /* wird nie erreicht */
   return 0;                 // (6)
}


Ist das falsch ?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> Das mit der while habe ich hiervon:

nein hast du nicht, da steht das return nämlich nicht in der Schleife...

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wann brauche ich denn das return ?

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
 
int main (void)
{

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


  // µC richtig konfigurieren
  // Ports einstellen, Timer einstellen etc.

  while( 1 ) {

    // Programmlogik
    // zb wenn Taster gedrückt, LED einschalten
    //    wenn Taster nicht gedrückt, LED ausschalten

  }

  return 0;
}

> 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Danke.

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;                
}

und das funktioniert:
 while( 1 ) {

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

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

 }

 return 0;
}

Kann ich bei ner If - Anweisung nicht hinterm { was stehen haben ? 
Versteh ich nicht ....

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Shit, du has so recht;-)------ mmmhhh.
Kannst Du mir auch noch sagen warum in dieser Anweisung die LED's beim 
drücke ausgehen ?

   while(1) {     
   

  if ( PINC & ( 1 << PIN0 )) 

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

    

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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil die Schalter am MK2 board auf GND schalten.... Kerl Montag heute...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander schrieb:
> PORTC   = 0xff;       // Port C Pulldown aktivieren
Nur, um sich das mal auf der Zunge zergehen zu lassen....  :-o

Als kleiner Denkanstoss: auch zusammen mit dem Kommentar wird der PortC 
keinen Pulldown einschalten können...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.