Forum: Mikrocontroller und Digitale Elektronik PWM, ATmega 32, LED dim funktion, C Code


von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

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

von Thomas R. (tinman) Benutzerseite


Lesenswert?

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

von Christoph (Gast)


Angehängte Dateien:

Lesenswert?

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

von Christoph (Gast)


Lesenswert?

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.

von lightninglord (Gast)


Lesenswert?

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.

von Patrick (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.