mikrocontroller.net

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


Autor: Christoph (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgende Sachen musst du verbessern:
static void init();

das muss
void init(void); 

heißen.

Ebenso sind
void main (){ 

/* blabla */ 

} 

und
static void init(){ 

/* blabla */ 

} 

falsch.

Das müsste
int main (void){ 

/* blabla */ 

} 

und
void init(void){ 

/* blabla */ 

} 

heißen.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
INT dir = 1;
while (1)
{
  TIMSK &= ~(1<<OCIE1A);
  active_wait(500);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
  OCR1A += dir;  

  if(OCR1A == ICR1)
  {
    dir *= -1;
    ICR1 = 0;
    OCR1A = 200;      
  }  
  if (OCR1A == ICR1)
  {
    dir *= -1;
    ICR1 = 200;
    OCR1A = 0;
  }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.