- LiTime Speicher und Akkus         
Ergebnis 1 bis 4 von 4

Thema: ATMega128 nur 8 Bit oder 16Bit Timer für PWM nutzbar, nicht beide gemeinsam...

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1

    ATMega128 nur 8 Bit oder 16Bit Timer für PWM nutzbar, nicht beide gemeinsam...

    Anzeige

    Powerstation Test
    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

    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
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Unregistrierter
    Gast
    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.
    Code:
    DDRB = (1<<PB5)|(1<<PB6);
    DDRB = (1<< PB4)|(1<< PB7);

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.651
    .. 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) :
    Code:
    // ============================================================================= =
    // ===  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)
    // ============================================================================= =
    Geändert von oberallgeier (09.01.2017 um 12:13 Uhr)
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    73
    Beiträge
    1.175
    Blog-Einträge
    1
    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
    Geändert von oderlachs (09.01.2017 um 16:27 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Ähnliche Themen

  1. [ERLEDIGT] 16bit Timer Atmega2560 läuft zu schnell
    Von QuadV im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 19.12.2013, 08:49
  2. Welcher Controller hat 2 16BIT Timer
    Von Smith-mini-plane im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 17.12.2013, 23:02
  3. Zeitmessung via 16bit timer
    Von Martinius11 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 16.09.2010, 18:20
  4. Timer oder Interrupt reagiert nicht
    Von Sprengi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 21.08.2009, 21:59
  5. 16bit-PWM mit Timer 1 (Mega 8)
    Von Sauerbruch im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 26.10.2007, 17:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test