mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM


Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe immer noch ein Problem mit PWM, ich will es einfach 
verstehen, hier meine Testroutine:

\\\
.include "m32def.inc"           ;Binding Definitionsfile for 
Processortype

.def temp       = R16

;Interruptvector-Table
.org 0x00
    RJMP Reset                  ;Reset
.org ICP1addr
    RJMP    TIMER1_Capt         ;Interrupt Timer1 Capture
.org OC1Aaddr
    RJMP    TIMER1_CompA        ;Interrupt Timer1 Compare Match A
.org OC1Baddr
    RJMP    TIMER1_CompB        ;Interrupt Timer1 Compare Match B
.org OVF1addr
    RJMP    TIMER1_Overflow     ;Interrupt Timer1 Overflow

Reset:

    ;Stack
    LDI     temp, HIGH(RAMEND)
    OUT     SPH, temp
    LDI     temp, LOW(RAMEND)
    OUT     SPL, temp

    LDI     temp, 0xFF
    OUT     DDRC, temp

Timer1_Init:
    ;Mode 14, no prescaling
    LDI     temp, 0x20
    OUT     OCR1AL, temp

    LDI     temp, 0x40
    OUT     OCR1BL, temp

    LDI     temp, 0x60
    OUT     ICR1L, temp

    LDI     temp, 1<<WGM11 | 1<<COM1A0 | 1<<COM1A1 | 1<<COM1B0 | 
1<<COM1B1
    OUT     TCCR1A, temp
    LDI     temp, 1<<WGM13 | 1<<WGM12 | 1<<CS10
    OUT     TCCR1B, temp

    ;Enable Timer1 interrupts
    LDI     temp, 1<<TICIE1 |1<<TOV1| 1<<OCIE1A  | 1<<OCIE1B
    OUT     TIMSK, temp

    SEI                         ;Enable Interupts

MainLoop:

RJMP MainLoop

TIMER1_Capt:
    LDI     temp, 0x04
    Out     PORTC, temp
RETI

TIMER1_CompA:
    LDI     temp, 0x01
    Out     PORTC, temp
RETI

TIMER1_CompB:
    LDI     temp, 0x02
    Out     PORTC, temp

RETI

TIMER1_OverFlow:
    LDI     temp, 0x08
    Out     PORTC, temp
RETI
///

Erwartet hätte ich jetz das nach 32 Takten, der Timer1 Compare Match A 
Interrupt gefeuert wird, Nach weiteren 32 Takten der Timer1 Compare 
Match B Interrupt und letzendlich nach weiteren 32 Takten der Timer 
Capture Interrupt. Dabach sollte der Timer eigentlich zurückgesetzt 
werden aber das passiert nicht, da der Timer Overflow Interrupt auch 
gefeuert wird. Irgendwas haut da überhaupt nicht hin.
Hier vielleicht was ich erreichen will.

Alle 32 Takte soll ein Interrupt gefeuert werden. Ich brauche aber 3 
Interrupts, so das ich 3 mal hintereinander alle 32 Takte ein Interrupt 
bekomme, sprich nach 96 Takten der Vorgang von neuem beginnt. Was 
vielleicht noch anzumerken ist: Die 32 Takte sind jetzt nur als Beispiel 
gedacht. Später ist das Eintreten des 1. Interrupts variabel, der 
Zeitpunkt der beiden anderen Interrupts ist dann dementsprechend zu 
verschieben. Erstmal will ich aber überhaupt die drei Schaltpunkte 
haben.

Danke für jede Hilfe und ggf. Korrektur meiner Testanwendung.
--
Gruß Karsten

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>da der Timer Overflow Interrupt auch gefeuert wird.

Der Overflow-Interrupt wird beim erreichen des Top-Wertes ausgelöst. Und 
das ist beim Timermode 14 ICR1.

> Dabach sollte der Timer eigentlich zurückgesetzt werden aber das passiert
>nicht,...

Falls du den Simulator benutzt, da funktioniert das wirklich nicht. Es 
Werden nur PWM-Modi mit fester Top-Adresse unterstützt. Also 8-Bit,9-bit 
und 10-Bit.

MfG Spess

Autor: Karsten Sosna (scottyrebel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>da der Timer Overflow Interrupt auch gefeuert wird.

> Der Overflow-Interrupt wird beim erreichen des Top-Wertes ausgelöst. Und
> das ist beim Timermode 14 ICR1.

Es war halt verwirrend, das der Overflow-Interrupt auch gefeuert wird. 
Habe Ihn jetzt disabled(brauche ich ja eignetlich auch nicht), war nur 
zu Testzwecken enabled um zu sehen was da kommt. Das mit dem Simulator 
hattest Du mir schon gepostet.

Also scheinen meine Einstellungen doch so weit zu stimmen, dann habe ich 
bestimmt noch einen Bug in meiner Anwendung, bestimmt wieder irgendwo 
ein Register falsch geladen.

Danke
--
Gruß Scotty

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.