PDA

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, 09: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, 10: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, 11: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, 12: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