Danke, ich werde es nachher Testen...
Danke, ich werde es nachher Testen...
Code:#define FADE_SPEED_IN 200 // schnell heller werden #define FADE_SPEED_OUT 500 // langsamer ausgehen #define FADE_MIN 10 #define FADE_MAX 255 value = FADE_MIN; // Start Bedingung 30 Prozent while (1) { OCR0A = value; // PWM setzen if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3 { if (value < FADE_MAX) value++; _delay_ms(FADE_SPEED_IN); } else { if (value > MIN) value--; _delay_ms(FADE_SPEED_OUT); } }
Hallo, danke für die Codes aber ich habe versucht meinen Code zu nutzen mit dem Tipp von Siro, sonst ist der lern effekt gleich null....
Habe das ganze jetzt ein wenig umgebaut, das blinken konnte ich so beheben
Jetzt habe ich aber das Problem das die LED nicht zurück Faded wenn ich das High Signal auf Low ziehe.....
externer Pull-down Wiederstand ist vorhanden...
Kann mir jemand noch einen Tipp geben, habe schon alles verucht mit "else if" oder "else" nur "if", ich habe den verdacht das der Code sich nach der ersten If abfrage hängen bleibt...
Code:#include <avr/io.h> #define F_CPU 1200000UL // 1,2 MHz #include <util/delay.h> int main (void) { DDRB =(1<<PB0); // Ausgang PB0 TCCR0A=(1<<COM0A1) | (1<<WGM00) | (1<<WGM01); // PWM Phase Korrigieren, OCR0A an TOP setzen TCCR0B=_BV(CS01) ; // Prescaler 8 int a=5; // Min Wert für Lichtstärke int b=255; // Max Wert für Lichtstärke while (1) { { OCR0A = a; // Startpunkt mit Min Lichtstärke if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3 { if (a <255) a++; // Wenn Wahr dann erhöhe in 5s auf den Wert "b" _delay_ms(5); } else // (!(PINB & (1<<PB3))) // Prüfe ob PB3 Low wenn Wahr zurück zu "a" { if (b >10) b--; // Wenn solange der wert Max gößer als Min dann b-- _delay_ms(5); // OCR0A =a; } } } return 0; }
Geändert von Live85 (27.01.2018 um 01:45 Uhr)
Hallo,
da du OCR0A nur den Wert a zuweist, darfst du auch nur diesen ändern:
Viele Grüße,Code:if (a >10) a--;
Andreas
Hallo Live85
nimm mal das "return 0;" raus.
Das gehört da nicht rein.....
Ein Return brauchst Du nur in Unterfunktionen die vom Hauptprogramm oder woher auch immer aufgerufen werden.
Du hast ja nur eine einzige Schleife, wo soll er dann landen mit dem Return.
sorry, das return steht ja hinter der while Schleife, da stört es keinen, da kommt der code ja nie an.....
Da sind aber ein paar geschweifte Klammern zu viel, das hat mich verwirrt.
Du hast 2 mal { bei dem while und am Ende dann auch zwei mal } das tut nicht weh, ist aber unnötig und verwirrt.
Dein return am Ende darf dort stehen und hat oftmals auch seine Berechtigung. Das ist eigentlich für Programme zum Beispiel auf nem PC
da gibt man dann beim Verlassen des Programms eine Wert 0 zurück um zu signalisieren dass das Programm ordnungsgemäß
verlassen wurde oder auch ein Übergabewert für andere Programme (Der sogenannte Exitcode)
Dein Programm läuft aber ständig und sollte dort niemals ankommen.
Andreas hat recht, das b benutzt Du ja garnicht. Da liegt das Problem
Ein schönes Wochenende
Siro
Geändert von Siro (27.01.2018 um 08:35 Uhr)
Habe ich korrigiert Andreas, das hatte ich falsch interpretiert, ich dachte er springt aus der While Schleife.
Geändert von Siro (27.01.2018 um 08:36 Uhr)
Hallo, habe die Fehler beseitigt und jetzt geht alles wie gewollt, ich bin davon ausgegangen das OCR0A dann automatisch zu "b" wird da der wert "10" ist, habe dem ganzen wohl zuviel Logisches denken zugemutet und den absatz im AVR Buch vollkommen falsch interpretiert ...
Auf dem Ozi kann ich auch schön sehen wie sich das PWM Signal ändert....
Danke für die Tipps
Code:#include <avr/io.h> #define F_CPU 1200000UL // 1,2 MHz #include <util/delay.h> int main (void) { DDRB =(1<<PB0); // Ausgang PB0 TCCR0A=(1<<COM0A1) | (1<<WGM00) | (1<<WGM01); // PWM Phase Korrigieren, OCR0A an TOP setzen TCCR0B=_BV(CS01) ; // Prescaler 8 int a=5; // Min Wert für Lichtstärke int b=255 // Max Wert für Lichtstärke while (1) { OCR0A = a; // Startpunkt mit Min Lichtstärke if (PINB & (1<<PB3)) // Prüfe auf High Signal an PB3 { if (a <255) a++; // Wenn Wahr dann erhöhe in 5s auf den Wert "b" _delay_ms(5); } else // (!(PINB & (1<<PB3))) // Prüfe ob PB3 Low wenn Wahr zurück zu "a" { if (a >10) a--; // Wenn solange der Wert Max gößer als Min dann a-- _delay_ms(5); } } return 0; }
Lesezeichen