Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] ATMega128 nur 8 Bit oder 16Bit Timer für PWM nutzbar, nicht beide gemeinsam...
oderlachs
09.01.2017, 10:53
Hallo Freunde !
Ich habe mal wieder ein Problem und hoffe mit Eurer Unterstützung es lösen zu können.
Also ich benötige 4 unabhängige PWM Ausgänge am ATMega128A für einen Allseiten-Bot (4 Motore) . Nutze ich die beiden 8Bit Timer TC0 und TC2 alles ok.
Nur aktiviere ich auch den 16 Bit Timer TC1 A+B, werden die 8 Bit Timer abgeschaltet, d.h. ich habe kein Ausgangssignal mehr.
Der Timer1 A+ B arbeitet im 10 Bit Modus, Timer 0 + 2 im 8 Bit Modus
Ich habe meinen Code mal auf meinen Webspace hochgeladen : HIER (http://oderlachs.de/forum/pwm_8_16_start.html)
Es kann sein, das ich die ganze Sache falsch angegangen bin, habe aber nirgends einen Hinweis(bei meinen mangelhaften Engliskenntnisen ) darüber gefunden,
warum ich keine 4 PWM Kanäle separat ausführen kann.
Vielleicht kann mir ja wer mal einen Hinweis darüber geben , was ich da grundlegend falsch mache.
Gruss und Dank
Gerhard
Unregistrierter
09.01.2017, 11:26
Die zweite Zeile überschreibt in DDRB die in der ersten Zeile gesetzten Bits mit 0 -> das sind dann keine Ausgänge mehr.
In der zweiten Zeile muß der Inhalt von DDRB mit den zu setzenden Bits verodert werden.
DDRB = (1<<PB5)|(1<<PB6);
DDRB = (1<< PB4)|(1<< PB7);
oberallgeier
09.01.2017, 12:02
.. Vielleicht kann mir ja wer mal einen Hinweis darüber geben , was ich da grundlegend falsch mache ..Hallo Gerhard,
alles Gute im Neuen Jahr.
Siehe Kommentar oben, also statt :
DDRB = (1<<PB5)|(1<<PB6);
schreibe ich:
DDRB |= (1<<PB5)|(1<<PB6);
(der senkrechte Strich vor dem Gleichheitszeichen: [Alt Gr]+[> <|]
Gaanz zweifelhaft erscheint mir diese Schreibweise:
TCCR1A = (1<< COM1A1) + (1<< COM1B1) + (1<< WGM11) + (1<< WGM10);
TCCR1B = (1<< WGM12) + (1<< CS11);
Was machen die vielen Pluszeichen? Hier empfiehlt sich ebenfalls die oben genannte Schreibweise: der "oder"Operator | vor dem Gleichheitszeichen und ebenso statt der Pluszeichen. Aber Deine Schreibweise habe ich nicht getestet. Sieht mir nur etwas sehr strange aus :-/ - und ich vermute, dass das keine Spezialität Deines Compilers ist.
Mal (m)ein aktuell laufendes Beispiel (Studio4, mega1284) :
// ================================================== =========================== =
// === Initialisierung fuer ADC mega1284 MIT Interrupt free running
// siehe Dokumentation Atmel-8272G-AVR-01/2015
// === ADC0/PC0 auf 10 Bit, fertige Wandlung ###>>> löst Interrupt aus
void ADC0_i10free (void) // Init ADC-0, 10 Bit, mit free runn. Interrupt
{ // Kanal 0 <=> Temperatur RN VNRN-VN2
// - - - - - - - - - - - - - - -
ADMUX = 0 ; // Multiplexer zeigt auf ADC_0_ ! !
ADMUX |= (1<<REFS0); // Referenzspannung ist AVcc S 249
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // Prescaler=clock/128 251
ADCSRA |= (1<<ADATE); // Auto Triggering Enable 250
// es wird bei clock 20 Mhz alle ca. 86,40 µs getriggert: 20e6/128/13,5 =>
// 11 574,07 Interrupts pro Sekunde (ca. 11kHz)
// =>> Erforderlich ist uU. eine Anpassung an die Quelle <<<<< === z.B.:
// Sharp GP2Y0A60SZLF ca. 20,5 ms/Wandlung => alle 237 ADC-ISR !!!
// genauer: ca 12 Zyklen in 1 ms <=> 1200 Hz
ADCSRA |= (1<<ADIE); // ADC Interrupt Enable 251
ADCSRA |= (1<<ADEN); // ADC Enable 250
ADCSRA |= (1<<ADSC); // starte gleich die erste Wandlung 250
In_adc = 0; // Durchlaufzähler ADC zum Kanalumschalten
} // Ende von void ADC_in_10free(void)
// ================================================== =========================== =
oderlachs
09.01.2017, 13:35
Danke Joe !!
Mensch bin ich ein Blödmann !!! ja ich habe einfach die beiden pwm_init reinkopiert....ohne daran zu denken.
Nun sind die schlaflosen Nächte vorbei.... ;) ja ein anderer sieht wohl schneller, als man selbst, wenn man denkt das doch alles Ok ist.
Ich glaube ich muss mir doch mal einen Oszi anschaffen.... :)
Nachtrag :
Ja ich weiss auch nicht ich darauf gekommen bin einfach "DDRB = ..." , anstatt wie immer " DDRB |= .... "
Ja die + Zeichen, ich habe das mal im Programmierbuch ( AVR-Microcontroller Programmieren in C ) so gelesen und wollte es mal probieren, ansonsten auch nur " | " dafür kannte.
Ich verwende avr-gcc unter Linux zum compilieren und Geany als Editor-IDE.
Gruss und Danke
Gerhard
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.