mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED dimmen durch PWM anstatt mit ATMega 16 mit ATMega 32


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
ich habe folgendes Problem.
Ich habe früher schon einmal mit Hilfe eines ATMega 16 (und dem Atmel 
Evaluationsboard) 4 PWM's erzeugt. Hiermit habe ich Motoren gesteuert. 
Jetzt habe ich einen ATMega 32 und möchte auch 4 PWM's erzeugen, aber 
diesmal um Laserdioden zu dimmen. Problem hier nur, dass die PWM's die 
ich erzeuge eine viel zu langsame Frequenz haben. Ich dachte mir ich 
könnte das Makefile und meinen alten Quellcode einfach kopieren (nach 
meinen wünschen etwas modifiziert) und dann müsste es gehen, da ich 
dachte, dasss der Unterschied zwischen Mega16 und Mega 32 nur der 
Speicher ist. Irgendwie funktioniert das aber leider nur die 
beschrieben.

Muss ich im Makefile noch irgendwas umstellen? Oder schreibe ich die 
Register falsch?

Im Anhang mein Quellcode.

wäre cool, wenn mir jemand helfen könnte

Grüße Martin


#include <avr/io.h>


void timer_initialisierung(void)
{
   DDRD = 0xff;  //Ports A,B,D werden als Ausgänge gesetzt
   DDRA = 0xff;
   DDRB = 0xff;



   TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<WGM10);
   TCCR1B = (1<<CS10)|(1<<CS12);
   TCCR2  = (1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM20)|(1<<COM21);
   TCCR0  = 
(0<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(1<<CS02)|(0<<CS01)|(0<<CS00 
);


   TIMSK &= ~0x3c;
}


int main (void) {

   timer_initialisierung();

   OCR1AL = 80*2.55;
   OCR1BL = 50*2.55;
   OCR2 = 50*2.55;
   OCR0 = 50*2.55;


  while (1);
}

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit welchem Takt, betreibst du denn dein Mega?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier einmal die ersten paar Zeilen des Makefile.. hoffe das beantwortet 
deine Frage




MCU = atmega32

F_CPU = 16000000

FORMAT = ihex

TARGET = main

OBJDIR = .

SRC = $(TARGET).c

CPPSRC =


ASRC =

OPT = s

DEBUG = dwarf-2

EXTRAINCDIRS =

CSTANDARD = -std=gnu99

CDEFS = -DF_CPU=$(F_CPU)UL

ADEFS = -DF_CPU=$(F_CPU)


CPPDEFS = -DF_CPU=$(F_CPU)UL

CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
#CFLAGS += -mshort-calls
#CFLAGS += -fno-unit-at-a-time
#CFLAGS += -Wundef
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wsign-compare
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die Flags kontrolliert? Ev. ist noch das "devide clock by 8" 
Flag gesetzt.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:
> Hier einmal die ersten paar Zeilen des Makefile.. hoffe das beantwortet
> deine Frage
Das Makefile hat nichts mit dem Takt zu tun, mit dem der AVR tatsächlich 
läuft! Wenn die Clock-Fuses nicht korrekt gesetzt sind, dann läuft er 
auch nicht mit 16 MHz, da kann im Makefile noch so sehr "16000000" 
stehen. Im Auslieferungszustand läuft der Mega32 genau wie der Mega16 
mit dem internen RC-Oszillator mit 1 MHz.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähh... Ich bin leider nicht so versiert bei dieser Thematik ;) könntest 
du mir erklären was du damit meinst und wo ich das finde?

Gruß Martin

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Praktisch! Da hab ich ja nicht mehr viel zu schreiben...
MfG Steven

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:
> ähh... Ich bin leider nicht so versiert bei dieser Thematik ;) könntest
> du mir erklären was du damit meinst und wo ich das finde?
Was? Die Fuse-Einstellungen stehen im Datenblatt!

AVR Fuses

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannse

und das heißt jetzt was? Ich versteh leider nicht so viel davon. Muss 
ich irgendwo was umstellen? Also der ist neu und wurde nicht verändert. 
Demnach Standart

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:
> @ Johannse
Aua!

> und das heißt jetzt was? Ich versteh leider nicht so viel davon. Muss
> ich irgendwo was umstellen?
Lies Dir den Artikel durch!

> Also der ist neu und wurde nicht verändert.
> Demnach Standart
Standard schreibt man mit einem "d" hinten! Das ist keine Art zu 
stehen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin (Gast)

>und das heißt jetzt was? Ich versteh leider nicht so viel davon.

Du musst die Fuses richtig programmieren, damit dein AVR mit der 
richtigen Taktquelle und Freqeunz läuft.

> Muss ich irgendwo was umstellen?

Ja, die Fuses.

> Also der ist neu und wurde nicht verändert.
>Demnach Standart

Dann läuft er mit 1 MHz internem RC-Oszillator.

MFG
Falk

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja den Text habe ich gelesen. Ich bin bloß etwas irritiert, da ich 
damals bei dem Mega 16 auch nichts verändert habe (Clock-Fuse).

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:
> Ja den Text habe ich gelesen. Ich bin bloß etwas irritiert, da ich
> damals bei dem Mega 16 auch nichts verändert habe (Clock-Fuse).
Dann war der Mega16, den Du damals verwendet hast, nicht fabrikneu.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,
ja meine Frage ist bloß einfach, was sind Fuses (was normale Sicherungen 
sind ist mir klar) und wie programmiere ich diese?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin wrote:
> Hallo Falk,
> ja meine Frage ist bloß einfach, was sind Fuses (was normale Sicherungen
> sind ist mir klar) und wie programmiere ich diese?
Das sind Konfigurationsbits in einem speziellen, nichtflüchtigen 
Speicherbereich. Wie die programmiert werden, steht in dem von mir 
weiter oben angegebenen Artikel AVR Fuses, von dem Du eben noch 
behauptet hast, Du hättest ihn gelesen.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah.. hab den Link nicht wargenommen, sorry.

Danke schonmal im Vorraus, für die spontane Hilfe. Ich werde das mal 
testen und mich gegebenenfalls noch einmal melden.

Danke und Gruß Martin

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
irgendwie scheine ich dafür zu blöd zu sein. Hab ich das richtig 
verstanden, dass ich diese Fuses in PonyProg2000 einstellen muss?.
Oder sind das einfach nur zwei/drei Zeilen Quellcode?

Sorry das ich solch blöde Fragen stellen muss.

Gruß Martin

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin (Gast)

>verstanden, dass ich diese Fuses in PonyProg2000 einstellen muss?.

Ja. Oder im AVR-Studio, wenn du einen AVR-Studio kompatiblen 
Programmieradapter hast.

>Oder sind das einfach nur zwei/drei Zeilen Quellcode?

Nein.

MFg
Falk

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So nach einige Versuchen, habe ich es geschafft, dass der nicht mehr 
1Mhz eingestellt ist sonder 8Mhz. Ich bedanke mich schon einmal für 
diese Hilfe. Leider blinkt die Led immernoch. eigentlich sollte sie 
dunkler werden. Habt ihr hierzu vielleicht noch eine Idee? Wäre cool..


Danke Gruß Martin

Autor: Steven () (ovular) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch mal das hier:
(Zeile ersetzen)

TCCR0  = 
(0<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00 
);

Mit den letzten 3 Bits stellst du den Prescaler ein.
Je kleiner diese 3 stellige Zahl, desto schneller deine Interrupts.

Ich sehe gerade, dass du Timer2 auch drin hast. Vieleicht kann dir 
jemand anderes weiterhelfen... Ich muss weg

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... leider blinkt die LED immernoch... zwar schnell aber sie blinkt. 
Und ich müsste sie eigentlich dimmen.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LED dimmen = LED blinkt ganz schnell.
=> Frequenz erhöhen.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mal den prescaler weg. D.h. setze den prescaler auf 1:
TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<WGM10);
TCCR1B = (1<<CS10);
TCCR2  = (1<<CS20)|(1<<WGM20)|(1<<COM21);
TCCR0  = (0<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00);

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>So nach einige Versuchen, habe ich es geschafft, dass der nicht mehr
>1Mhz eingestellt ist sonder 8Mhz.

Im Makefile steht was von 16MHz. Warum stellst Du Dein uC nicht auf 
diese Frequenz ein?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe im Datenblatt keine mögliche Einstellung gefunden, die es mir 
erlaubt auf 16 Mhz zu takten.

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du denn keinen externen Oszillator?

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.