mikrocontroller.net

Forum: Compiler & IDEs Pin Abfrage, wo ist der Fehler?


Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem mit meinem Programm (für ATtiny26)
int main()
{
  uint8_t Drehzahl,Taster;

  DDRB = (1<<DDB0)|(1<<DDB1);              // LEDs
  
  DDRA &= ~((1<<DDA0)|(1<<DDA1)|(1<<DDA2)); //Taster UP,DOWN,SET
  PORTA = (1<<PA0)|(1<<PA1)|(1<<PA2);   //Pullups aktivieren
  
  TIMSK |= (1<<TOIE0);    //Timer0 Overflow Interrupt enable 
  TCCR0 |= (1<<CS02);    //Prescaler = 256 & Timer sarten
  GIMSK |= (1<<INT0);    //INT0 enable
  MCUCR |= (1<<ISC01);    //INT0 auf fallende Flanke
  Drehzahl = eeprom_read_byte(&SpeicherDrehzahl);
  sei();

  while(1)
  {
    Taster=PINA;
    if( Taster <7)
    { 
      PORTB|=(1<<PB1); //LED an
        ...

Ich habe wie im Programm zu erkennen an PA0, PA1 und PA2 Taster 
angehängt und die internen Pullups aktiviert.
Mein Problem ist jetzt, dass wenn ich die Taster betätige (Taster ziehen 
den entsprechenden Pin auf Masse) die If-Anweisung nie durchlaufen wird. 
Egal welchen Taster ich drücke.
Ich hänge vor diesem blöden Fehler schon ein paar Stunden. Im Simulator 
funktioniert es aber auf dem µC nicht.
Die LED ist auch richtig angeschlossen, von Pin über Widerstand nach 
Masse.

Vielleicht sieht jemand von euch den Fehler, ich sehe den Wald vor 
lauter Bäumen nicht mehr.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast den kompletten Port A als Eingänge konfiguriert, aber nur für 
die letzten drei Pins (an denen ja vermutlich die Taster hängen) die 
Pull-Ups aktiviert. Das bedeutet, dass alle anderen Pins hochohmige 
Eingänge sind. Wenn die nicht extern definiert auf Masse gezogen werden, 
wissen nur die Götter und Naturgeister, was für Pegel da im Moment der 
Tasterabfrage anliegen. Entweder Du legst die freien Pins definiert auf 
Masse, oder Du maskierst sie bei der Abfrage aus, indem Du sie mit einem 
& explizit auf Null setzt. Die zweite Methode ist die bessere und auch 
einfacher zu implementieren.

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh man du hast recht!
Jetzt funktioniert das wenigstens. ;-) Danke für die schnelle Antwort.

Autor: Bobo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch etwas:

Wenn ich die _delay_ms(50); einfüge, ist der Flash 195% voll und ohne 
die Funktion 26%!? Ist das normal, oder wird der Tiny nicht unterstützt?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Bobo (Gast)

>Wenn ich die _delay_ms(50); einfüge, ist der Flash 195% voll und ohne
>die Funktion 26%!? Ist das normal, oder wird der Tiny nicht unterstützt?

Optimierung einschalten!

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

MfG
Falk

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.