LED dimmen durch PWM anstatt mit ATMega 16 mit ATMega 32

Gast #979724
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);
}
Gast #979757
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)
#979765
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.
#979776
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.
#979779
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
#979788
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.
Gast #979813
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
Gast #979951
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
Persönliche Seite #979965
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
Gast #979994
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);
Gast #979999
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?

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