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


von Bobo (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem mit meinem Programm (für ATtiny26)
1
int main()
2
{
3
  uint8_t Drehzahl,Taster;
4
5
  DDRB = (1<<DDB0)|(1<<DDB1);              // LEDs
6
  
7
  DDRA &= ~((1<<DDA0)|(1<<DDA1)|(1<<DDA2)); //Taster UP,DOWN,SET
8
  PORTA = (1<<PA0)|(1<<PA1)|(1<<PA2);   //Pullups aktivieren
9
  
10
  TIMSK |= (1<<TOIE0);    //Timer0 Overflow Interrupt enable 
11
  TCCR0 |= (1<<CS02);    //Prescaler = 256 & Timer sarten
12
  GIMSK |= (1<<INT0);    //INT0 enable
13
  MCUCR |= (1<<ISC01);    //INT0 auf fallende Flanke
14
  Drehzahl = eeprom_read_byte(&SpeicherDrehzahl);
15
  sei();
16
17
  while(1)
18
  {
19
    Taster=PINA;
20
    if( Taster <7)
21
    { 
22
      PORTB|=(1<<PB1); //LED an
23
        ...

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.

von Johannes M. (johnny-m)


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.

von Bobo (Gast)


Lesenswert?

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

von Bobo (Gast)


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?

von Falk B. (falk)


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-Tutorial#Warteschleifen_.28delay.h.29

MfG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.