mikrocontroller.net

Forum: Compiler & IDEs Schalter für den Atmega16


Autor: Matze Klaus (phytomed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich bin noch ein absoluter Anfänger mit Mikrocontrollern und
möchte zwei Schalter mit dem Atmega16 verwenden.
Dabei habe ich die Schalter an die Pins PB0 und PB1 angeschlossen.
Die Schalter verbinden die Pins mit der Masse und die Pins sind
über einen Widerstand (10 kOhm) mit der Spannung verbunden.

DDRB &= ~(1 << DDB0) | ~(1 << DDB1); /* Pin B0 und B1 als Eingang */

unsigned int Taster1(void){                    //Taster1 ist B0
  unsigned char temp1, temp2;
  unsigned int i;
  unsigned int ret;

  temp1 = !(PINB);                  // read input
  for(i=0;i<65535;i++);
  temp2 = !(PINB);                  // read input
  temp1 = (temp1 & temp2);       // debounce input
  if ( temp1 & (1 << PINB0) ){
    ret=1;
  }else{
    ret=0;
  }
  return ret;
}


main(){

...
      taster1 = Taster1();
      taster2 = Taster2();
      if ((taster1 == 1) || (taster2 == 1)){
  lcd_clrscr();
  lcd_puts("Taster gedrückt:\n");
  lcd_puts("Sehr gut!!");
      }
}

Dieser Code funktioniert für keinen Taster,
was ist daran verkehrt?

Vielen Dank
Matthias

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> DDRB &= ~(1 << DDB0) | ~(1 << DDB1); /* Pin B0 und B1 als Eingang
> */

Überprüfe mal deine Logik.

~(1 << DDB0) | ~(1 << DDB1) = 0xff

Also wird der gesamte Port B auf Ausgang umgeschaltet.

>   for(i=0;i<65535;i++);

Soll das eine Warteschleife sein? Dann lieber eine entsprechende
Bibliotheksfunktion nutzen. Andernfalls wird der Compiler bei
eingeschalteten Optimierungen diese Schleife komplett entfernen.
}

Autor: Matze Klaus (phytomed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

nochma.

@Rolf
> DDRB &= ~(1 << DDB0) | ~(1 << DDB1); /* Pin B0 und B1 als Eingang
> */

Überprüfe mal deine Logik.


Ich habe meine Logik überprüft und es etwas verändert, nach dem
avr-gcc Skript.

DDRB &= ~((1 << PB0)|(1 << PB1)); //Eingänge -> 9.5 im Skript
PORTB &= ~((1 << PB0)|(1 << PB1));//da Pull-Up Widerstände(10kOhm)


Das Entprellen mache ich nun mit _delay_ms(100);

es funktioniert allerdings immer noch nicht.

Für weitere Hilfen bin ich immer noch dankbar.

Matthias

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
_delay_ms(100) ist mglw. "zu viel", es gibt einige Randbedingungen
fuer die maximale Wartezeit in Abhaengigkeit vom Takt, vgl. dazu
avr-libc Dokumtentation. Testweise mehrere _delay_ms(x) mit x<max.
Delay hintereinander.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Allerdings braucht man auch keine 100 ms zum Entprellen.  10 oder 20
ms sollten dafür genügen.

Normalerweise pollt man einfach die Schalter im Timer-Interrupt, und
betrachtet sie als gesetzt, wenn sie für N ms ihren Wert nicht mehr
geändert haben.  Ich glaube, Peter Dannegger hat da irgendwo ein Stück
Code, was das macht.

Die ganzen Operationen auf DDRB und PORTB sind übrigens NOPs, da sie
den Reset-Wert von 0 nicht ändern (alle Ports sind nach dem Reset auf
Eingang ohne Pullup geschaltet).

Ansonsten Matze: bitte definiere ,,geht nicht'' etwas näher.

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.