PWM, ATmega 32, LED dim funktion, C Code

Gast #1341748
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
Angehängte Dateien:
Gast #1341827
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
Angehängte Dateien:
Gast #1345220
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.
Gast #1345257
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.
Gast #1351657
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren