Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage: LED Toggle in C - ATtiny13/ATmega8


von Horstus (Gast)


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

von Timmo H. (masterfx)


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)

von MWS (Gast)


Lesenswert?

Der Taster zieht auf GND, im ungedrückten Zustand ist der If-Block immer 
wahr und es wird ein Blinker.

von Malte S. (maltest)


Lesenswert?

Horstus schrieb:
> if (PINB &= (1<<PINB0))

Meintest du if (PINB & (1<<PINB0)) ?

von Horstus (Gast)


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.

von Timmo H. (masterfx)


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.

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.