Hallo, ich möchte gerne, das der MCU, alle LEDs auf Port B ein schaltet und und nach einer weil (ca 2sek) wieder alles aus schaltet. Die Funkionen alleine all_on und all_off funktionieren problemlos, nur die Warte funktion pa wird irrgend wie ignoriert. Habt ihr einen, kleinen TIP für mich? // MCU Typ: AT90S4433 #include <avr/io.h> //_________warte Schleife____________________ void pa() { int x; // legt varieable x fest x=0; // hat den wert 0 while (x<3000) // x kleiner 3000 { x++; // erhöhe um jwals um eins } } //_________alle LEDs an_______________________ void all_on() { DDRB = 0xff; // Register auf Ausgang PORTB = 0x00; // Alle LED an } //_______________alle LEDs aus_________________ void all_off() { DDRB = 0xff; // Register auf Ausgang PORTB = 0xff; // Alle LED an } //_______Hauptprogramm_________________________ int main (void) { all_on(); // all LEDs an pa(); // kleine pause all_off();// Alles LEDs aus return 0; }
Wie schnell taktet der Controller und woher weißt du, dass die Warte-Funktion ignoriert wird? Du musst DDRB nicht jedesmal neu setzen - einmal zu Beginn reicht völlig aus.
Schon mal was vom Optimierer gehört? Die Schleife hat effektiv keinen Sinn (so siehts der Compiler), also wird sie einfach weggelassen. Lösung: Zählvariable als volatile deklarieren. >void pa() { >*volatile* int x; // legt varieable x fest >x=0; // hat den wert 0 > > while (x<3000) // x kleiner 3000 > { > x++; // erhöhe um jwals um eins > } > >}
>*volatile* int x; // legt varieable x fest
Bitte nicht nachmachen ;)
volatile int x; // legt varieable x fest
Sieht doch besser aus.
Hallo, Ich takte den MCU mit 4 MHz, ich habe die Funktion einseln getestest, Funkion all_on, alle LEDs gehen an, Funktion all_off, dann gehen die alles aus , wenn ich pa() dazwischen setze, wird die Funkion all_off sofort erreicht. DDRB, werde ich demnächst beachten. In der tat, funktioniert das mit " volatile int x;" super Aber, warum Leuchtten die LEDs dauen, wenn ich die Zahl größe 32000 nehme, erzeuge ich dann ein überlauf?
>Aber, warum Leuchtten die LEDs dauen, wenn ich die Zahl größe 32000 >nehme, >erzeuge ich dann ein überlauf? Ja, ab 32768. Nimm halt ein ein "unsigned int". Das geht bis 65535.
So danke erstmal an Euch allen, so Funtionerts !!! #include <avr/io.h> //_________warte Schleife____________________ void pa() { volatile int x; // legt varieable x fest x=0; // hat den wert 0 while (x< 30000) // x kleiner 3000 { x++; // erhöhe um jwals um eins } } //_________alle LEDs an_______________________ void all_on() { DDRB = 0xff; // Register auf Ausgang PORTB = 0x00; // Alle LED an } //_______________alle LEDs aus_________________ void all_off() { DDRB = 0xff; // Register auf Ausgang PORTB = 0xff; // Alle LED an } //_______Hauptprogramm_________________________ int main (void) { all_on(); // all LEDs an pa(); // kleine pause pa(); pa(); all_off();// Alles LEDs aus return 0; }
OK, und jetzt guckst du dir bitte die Doku zu <util/delay.h> noch an: http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html Danach nimmst du dann einen Timer, und dein Prozessor ist wieder 99,9 % der Zeit frei für andere Dinge. ;-)
Hallo danke, für Eure Hilfe, Ich bin jetzt schon ein ganses Stück weider gekommen. :-) Danke Tobias :-) #include <avr/io.h> #include <avr/delay.h> #define F_CPU 8000000UL // 8 MHz //__________timer_______________ void delay_ms(int ms) { int t; for(t=0; t<=ms; t++) _delay_ms(1); } //_________warte Schleife____________________ void pa() { volatile int b; // legt varieable b fest b=0; // b hat den Wert 0 while (b<30000) // x kleiner 3000 { b++; // erhöhe um jwals um eins } } //_________alle LEDs an_______________________ void all_on() { DDRB = 0xff; // Register auf Ausgang PORTB = 0x00; // Alle LED an } //_______________alle LEDs aus_________________ void all_off() { DDRB = 0xff; // Register auf Ausgang PORTB = 0xff; // Alle LED aus } //_______Hauptprogramm_________________________ int main (void) { int a; all_on(); // alle LEDs an pa(); // Mit warte Funktion pa(); // Mit warte Funktion all_off();// Alles LEDs aus pa(); // Mit warte Funktion pa(); // Mit warte Funktion a=0; // a hat den Wert 0 while (a<5) // 5 x Blingen { all_on(); // alle LEDs an delay_ms(4000); // Timer Funktion all_off(); // Alles LEDs aus delay_ms(4000); // Timer Funktion a++; } return 0; }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.