Anfängerfrage: LED Toggle in C - ATtiny13/ATmega8

Gast #3136973
Lesenswert?

Moin moin,

ich habe eigentlich etwas ganz einfaches vor: Durch einen Impuls 
(Taster) sollen ein paar LEDs ein, bzw. ausgeschaltet werden. Beim 
ersten mal drücken einschalten, drückt man nach einer weile ein zweites 
mal sollen die LEDs wieder ausgehen. Das ganze soll später auf einem 
ATtiny13 laufen. Ich habe mal aus meinen C kenntnissen und dem AVR GCC 
Tutorial etwas zusammengebastelt. Sieht wie folgt aus:
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
void delay(uint16_t duration){
5
  for(;duration>0;duration--){  //Schleife zum aufruf von _delay_ms(1) => duration*1ms
6
    _delay_ms(1);  //1ms Warten
7
  }
8
}  
9

10
int main(void){
11
  
12
  DDRB &= ~(1<<PINB0);  //PINB0 als Eingang
13
  PORTB |= (1<<PINB0);  //Pullup an PINB0 aktivieren
14
  
15
  DDRB |= (1<<PINB5);  //PINB5 als Ausgang
16
    
17
    while(1){
18
    if (PINB &= (1<<PINB0)){  
19
      PORTB ^= (1<<PINB5);
20
      delay(2000);  //2sec delay zum Entprellen
21
    }
22
  }
23
  return 0;
24
}

Das ganze läuft im Simulator unter AtmelStudio6 ganz wunderbar. Lade ich 
es zum test auf mein ATmega8 Experimentierboard (myAVR) funktioniert es 
nicht wie gewollt: Scheinbar stimmt die if Bedingung nicht. Es endet 
immer in einer Blinkschaltung. Ich hab aber irgendwie gerade ein Brett 
vor dem Kopf und komme nicht drauf was dort der fehler ist. Habt ihr 
eine Idee?

Ich verwende ja "delay.h" und bekomme im AtmelStudio die Warnung dass 
die CPU Frequenz nicht definiert ist. Kann ich diese Warnung für den 
Einsatz auf dem echten µC getrost ignorieren? (Im GCC kann ich ja unter 
Symbols die Frequenz selber angeben)

Schönen Restabend euch und danke schonmal im Vorraus für eure Hilfe und 
Tipps
#3136980
Lesenswert?

Horstus schrieb:
>
> Das ganze läuft im Simulator unter AtmelStudio6 ganz wunderbar
> Ich verwende ja "delay.h" und bekomme im AtmelStudio die Warnung dass
> die CPU Frequenz nicht definiert ist. Kann ich diese Warnung für den
> Einsatz auf dem echten µC getrost ignorieren? (Im GCC kann ich ja unter
> Symbols die Frequenz selber angeben)
Die delay Funktionen müssen schon den CPU Takt kennen sonst weiß sie ja 
nicht wieviele Takte jetzt 1 ms entspricht.
Also erstmal brav F_CPU definieren, und du musst die Optimierungen an 
machen ( mindestens -01)
Gast #3137001
Lesenswert?

MWS schrieb:
> Der Taster zieht auf GND

Danke für den Tipp! Das war der, zugegeben ziemlich doofe, Fehler.

die if Bedingung lautet korrekt:
1
if (!(PINB & (1<<PINB0)))

Timmo H. schrieb:
> Die delay Funktionen müssen schon den CPU Takt kennen sonst weiß sie ja
> nicht wieviele Takte jetzt 1 ms entspricht.

Ich dachte der CPU Takt kommt beim makefile automatisch hinzu? Im 
Simulator sollte der Takt eh ziemlich Wurst sein.

Danke euch.
#3137082
Lesenswert?

Horstus schrieb:
> Timmo H. schrieb:
>> Die delay Funktionen müssen schon den CPU Takt kennen sonst weiß sie ja
>> nicht wieviele Takte jetzt 1 ms entspricht.
>
> Ich dachte der CPU Takt kommt beim makefile automatisch hinzu? Im
> Simulator sollte der Takt eh ziemlich Wurst sein.
Ja, dass ging aus deiner Aussage jetzt nicht so direkt hervor ob du das 
auch tust.
>(Im GCC kann ich ja unter Symbols die Frequenz selber angeben)
Wenn du das auch machst ist alles Ok.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren