Hallo, ich habe ein Problem mit der Funktionalität des PWM am ATmega 32, nehme zum Programmieren und Compilieren AVR Studio 4.16 und zum Flashen AVRISP mkII. Zur kurzen Erläuterung: Ich will später über PWM Signale Motorsteuerungen ansprechen die dann den jeweiligen Motor mit der genau, von mir, vorgegebenen Drehbewegung und Geschwindigkeit bewegt. So, da ich davor noch nicht mit PWM gearbeitet habe, teste ich das alles ersteinmal an LEDs, die die "Motorendrehbewegung = heller bzw. dunkler werden der LED" und "Geschwindigkeit" darstellen soll. So nun zu meinem Problem: Ich kann die LED in der Geschwindigkeit variieren, und ich kann sie von stark leuchten (helle LED) nach wenig leuchten (dunkle LED) bewegen. ABER ich schaffe es nicht in meinem C Code die LED von dunkel zu hell zu dimmen. Kann mir jemand helfen was an meinem Code (siehe Anhang) noch fehlt oder falsch ist? So das ich in der while(1) dann die LED von hell zu dunkel und wieder zu hell dimmen lassen kann? Und ein weiteres, eher kleines, Problem: Ich kann die Datei delay.h nicht includen. Meine Fehlerausgabe zu: #include <util/delay.h> ist in der c.Datei ganz am Ende als Kommentar angehangen. Würde mich über eure Hilfe sehr freuen. Gruß Christoph
wofür sind diese optionen an ? -ansi -pedantic nimm die raus dann geht auch delay Das #ifndef F_CPU #define F_CPU 1000000UL #endif sollte eigentlich vor #include <util/delay.h> stehen
Die Optionen: -ansi -pedantic hatte ich irgendwo gelesen und eingestellt, es lag am "-ansi" danke damit wäre mein kleineres Problem schon gelösst :) Im Anhang jetzt mein leicht veränderter, aktualisierter Code Kann mir noch jemand bei meinem ersten Problem helfen Gruß Christoph
sorry für den doppel Post. aber kann mir keiner bei meinem PWM problem helfen? oder kann man vielleicht auch das PWM Signal nur in die eine Richtung berteiben wie es bei mir auch geht? Würde mich echt über eure Hilfe freuen, da ich mit der Suche kein Erfolg hatte mir meine Frage zu beantworten. Gruß Christoph.
Folgende Sachen musst du verbessern:
1 | static void init(); |
das muss
1 | void init(void); |
heißen. Ebenso sind
1 | void main (){ |
2 | |
3 | /* blabla */
|
4 | |
5 | }
|
und
1 | static void init(){ |
2 | |
3 | /* blabla */
|
4 | |
5 | }
|
falsch. Das müsste
1 | int main (void){ |
2 | |
3 | /* blabla */
|
4 | |
5 | }
|
und
1 | void init(void){ |
2 | |
3 | /* blabla */
|
4 | |
5 | }
|
heißen.
Hi Christoph, wenn ich Dein Programm richtig verstehe zählst du in einem Schleifendurchgang hoch und runter. Ich würde eine INT Variable definieren und sie mit +1 oder -1 initialisieren. Wenn der Counter eine Grenze erreicht hat, dann nimmste die INT Variable *= -1.
1 | INT dir = 1; |
2 | while (1) |
3 | {
|
4 | TIMSK &= ~(1<<OCIE1A); |
5 | active_wait(500); |
6 | OCR1A += dir; |
7 | |
8 | if(OCR1A == ICR1) |
9 | {
|
10 | dir *= -1; |
11 | ICR1 = 0; |
12 | OCR1A = 200; |
13 | }
|
14 | if (OCR1A == ICR1) |
15 | {
|
16 | dir *= -1; |
17 | ICR1 = 200; |
18 | OCR1A = 0; |
19 | }
|
20 | }
|
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.