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


von Martin (Gast)


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);
}

von Steven (. (ovular) Benutzerseite


Lesenswert?

Mit welchem Takt, betreibst du denn dein Mega?

von Martin (Gast)


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)

von Patrick (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


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.

von Martin (Gast)


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

von Steven (. (ovular) Benutzerseite


Lesenswert?

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

von Johannes M. (johnny-m)


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

von Martin (Gast)


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

von Johannes M. (johnny-m)


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.

von Falk B. (falk)


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

von Martin (Gast)


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).

von Johannes M. (johnny-m)


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.

von Martin (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


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.

von Martin (Gast)


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

von Martin (Gast)


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

von Falk B. (falk)


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

von Martin (Gast)


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

von Steven (. (ovular) Benutzerseite


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

von Martin (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

LED dimmen = LED blinkt ganz schnell.
=> Frequenz erhöhen.

von Patrick (Gast)


Lesenswert?

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

von Patrick (Gast)


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?

von Martin (Gast)


Lesenswert?

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

von Patrick (Gast)


Lesenswert?

Hast Du denn keinen externen Oszillator?

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.