Soft-PWM auf ATtiny25

  • Hallo zusammen,


    nach langer Pause hab ich nun auch vor das ein oder andere Projekt wieder anzugehen bzw. weiterzumachen. Gar nicht so einfach, wenn man solange wirklich null in Sachen C und µC gemacht hat. So stehe ich auch schon vor meinem ersten Problem:
    Ich bekomme es nicht hin, meine Soft-PWM-Routine auf einem tiny25 ans Laufen zu bekommen. Vielleicht hat ja hier der ein oder andere nen Tipp oder sieht das Problem.


    Ich initialisiere den Timer mit:

    Code
    TIFR = (1 << TOV0);      	// clear interrupt flag
    	TIMSK = (1 << OCIE0A);   	// enable timer0 output compare match interrupt
    	TCCR0B = (1 << CS01);     	// start timer (ck/8 prescalar)
    	TCCR0A = (1 << WGM01);    	// CTC mode
    	sei();


    Meine ISR lautet:

    Code
    ISR(TIMER1_COMPA_vect)


    Wenn ich das Datenblatt verstanden habe, sollte es so funktionieren, aber es passiert genau nichts.

  • Abend dgoersch,


    welchen Timer möchtest du denn verwenden? Timer0 oder Timer1?
    Habe mal eben drüber geschaut und ich denke folgendes passt nicht zusammen:


    Gehört für mich eher zum Timer0.....

    Code
    TCCR0B = (1 << CS01);     	// start timer (ck/8 prescalar)
    TCCR0A = (1 << WGM01);    	// CTC mode


    Gehört für mich eher zum Timer1....

    Code
    SR(TIMER1_COMPA_vect)


    Habe jetzt nicht nachgeschaut aber vom Gefühl würde ich sagen da könnte der Fehler sein...


    Vielleicht kannst du mal versuchen, ob es so geht:



    Gruß Flo

  • Nur aus Neugier, warum nimmst Du denn den CTC-Mode und nen Prescaler von 8...?


    bei nem Compare Match Interrupt muss im Compare-Register auch ein Wert stehen, mit dem der Timer verglichen wird - habe gerade das DB nicht da, aber kann evtl. sein, dass es nicht geht, wenn da 0 drin steht...


    schreib' doch da einfach mal was rein, also in OCR0A irgendnen Wert != 0...


    ansonsten probier' doch einfach mal, den Timer Overflow interrupt zu nehmen, mit Clock-Prescaler 1, dann hast Du alle 256 Takte die ISR, bei 8-20 MHz Takt passt das ganz gut für ne 8-BitPWM...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Nur aus Neugier, warum nimmst Du denn den CTC-Mode und nen Prescaler von 8...?

    Asche auf meni Haupt, ich habe keinen Grund dazu. Hatte das lediglich woanders gefunden und fand es sah gut aus. Bin echt zu lange aus dem Thema raus...

    schreib' doch da einfach mal was rein, also in OCR0A irgendnen Wert != 0...

    Hat leider auch nichts geändert.

    ansonsten probier' doch einfach mal, den Timer Overflow interrupt zu nehmen, mit Clock-Prescaler 1, dann hast Du alle 256 Takte die ISR, bei 8-20 MHz Takt passt das ganz gut für ne 8-BitPWM...

    Werde ich morgen mal testen, für heute gebe ich auf. Noch ein bissl am TV berieseln lassen und um 5 schreit der Wecker...

  • was mir noch eingefallen ist: Hast Du denn global die Interrupts aktiviert...? - sehe ich anhand des kleinen Ausschnitts nicht... wenn die aus sind, kan natürlich auhc der Timer-Interrupt nicht laufen... in assembler ist's der Befehl "sei", k.A. wie's in C geht...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Die globalen Interrupts sind mit diesem Befehl aktiviert:


    Code
    sei();


    Habe mal ein wenig bei meinen Programmen nach einer Software Pwm gesucht.
    Bin fündig geworden. Allerdings habe ich dieses Prog für den Attiny13 entworfen. Sollte aber ohne große Änderungen auch auf dem Attiny25 laufen.
    Leider habe ich gerade keine Testhardware bereit..... Auf dem Attiny13 hat es aber funktioniert....


    Das Programm geht den HSV Farbkreis durch.
    Es kann die Geschwindigkeit verstellt werden.
    Außerdem kann eine Pause durch Tastendruck hervorgerufen werden.


    PB3 = Geschwindigkeit
    PB4 = Pause/Standfarbe




    Vielleicht hilft es dir ja weiter...


    Gruß Flo

  • ach, heisst ja fast genauso... :D - den hab' ich glatt übersehen! :whistling:

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Moin moin,


    also ich hab die simple PWM mit dem Overflow-Interrupt gestern noch hinbekommen. Allerdings nicht mit timer0 sondern nur mit timer1.
    Und ich hab rausgefunden, wieso ich in der anderen Routine den Compare-Interrupt mit CTC-Mode nutzte. Dort wird anhand des Taktes, der PWM-Schritte und der Anzahl der Kanäle genau berechnet wie lang die Interrupt-Routine läuft und man kann die PWM-Frequenz bestimmen.


    Für das aktuelle Projekt ist das egal, da reicht auch die simple PWM, hauptsache es rennt nu.


    stromflo: Einen solchen HSV-Fader hab ich auch mal geschrieben, sogar für den tiny25. Leider aber damals noch in BASCOM: Mini RGB-Licht


    Da läuft alles im timer0 ab, warum ich den unter C nicht ans Rennen bekomme, verstehe ich nicht. Wenn ich heute Abend wieder am PC bin, poste ich mal den Code.



    //EDIT: Wozu gibt's denn Teamviewer, VNC, RD & Co....