Forum: Mikrocontroller und Digitale Elektronik Schleifenproblem


von blöder anfänger (Gast)


Lesenswert?

Grüß euch alle

Ich bin leider Anfänger und es happert ziemlich mit C :(
(Tutorial schon durchgelesen aber auch verstanden???)

Ich hab 2 Leds die jeweils abwechselnd leuchten,allerdings möchte
ich noch eine LED durch einen Taster betätigen die nur Leuchten soll
klappt net :(. Könnt ihr mir weiter helfen und eventuell Tipps zum
Programmier-Style geben?


#include <avr/io.h>


#define F_CPU 1000000UL
#include <util/delay.h>


int main()




{


DDRB &=~(1<<PB1); // internen pull-up
DDRC |=  (1<<PC2)|(1<<PC5); //LED
DDRD|= (1<<PD3);
PORTB|= (1<<PB1); // internen pullup



while(1) {

PORTC|= (1<<PC2);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
PORTC&= ~(1<<PC2);


if(!(PINB&(1<<PINB1))){

PORTD|=(1<<PD3);
}

PORTC|= (1<<PC5);
_delay_ms(100000);
_delay_ms(100000);
_delay_ms(100000);
PORTC&= ~(1<<PC5);





}

return 0;

}

von AVerr (Gast)


Lesenswert?

Warum setzt du so hohe Delay Zeiten ein ? Da dauert es ja ewig, bis sich 
was tut.
100000ms = 100s, das sind etwas mehr als 1 1/2 Minuten. Und immer direkt 
3 solcher Delays hintereinander ...

Deine Schleife sieht im Prinzip ja so aus:
1
while(1)
2
{
3
    LED1 an
4
    laaaaaaaaaaaaaange warten ( ~ 4 1/2 Minuten )
5
    LED1 aus
6
7
    Taster einlesen ... wenn gedrückt, schalte LED3 an
8
9
    LED2 an
10
    laaaaaaaaaaaaange warten ( ~ 4 1/2 Minuten )
11
    LED2 aus
12
}

Der Taster wird also nur alle 9 Minuten einmal eingelesen ( wenn die 
_delay_ms Funktion überhaupt so große Zahlen annimmt ).
Kein Wunder, dass du keine Funktion siehst ... stell das Delay mal auf 
100ms, dann kannst du schon eher was mit anfangen.

von blöder anfänger (Gast)


Lesenswert?

ja hast recht es funktioniert :D

kann ich nur so große Zeiten über einen Timer/counter realisieren?

von AVerr (Gast)


Lesenswert?

blöder anfänger schrieb:
> kann ich nur so große Zeiten über einen Timer/counter realisieren?

Ja, dafür sind die Timer durchaus da ...
Bei 1 Mhz Takt und einem Timer Prescaler von 1024 wird die ISR ( 
overflow ) mit 4 Hz aufgerufen ( 1 Khz Timer Clock, alle 256 Schritte 
Overflow ).
Für 300 Sekunden müsstest du also in der ISR immer bis 1200 Zählen 
mittels einer eigenen Variable :)

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.