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); }
Mit welchem Takt, betreibst du denn dein Mega?
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)
Hast Du die Flags kontrolliert? Ev. ist noch das "devide clock by 8" Flag gesetzt.
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.
ä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
Praktisch! Da hab ich ja nicht mehr viel zu schreiben... MfG Steven
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
@ 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
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.
@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
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).
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.
Hallo Falk, ja meine Frage ist bloß einfach, was sind Fuses (was normale Sicherungen sind ist mir klar) und wie programmiere ich diese?
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.
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
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
@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
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
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
Hm... leider blinkt die LED immernoch... zwar schnell aber sie blinkt. Und ich müsste sie eigentlich dimmen.
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); |
>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?
habe im Datenblatt keine mögliche Einstellung gefunden, die es mir erlaubt auf 16 Mhz zu takten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.