-         

Ergebnis 1 bis 4 von 4

Thema: Timer triggert DMA, aber Overflow Flag wird nicht zurück gesetzt

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405

    Timer triggert DMA, aber Overflow Flag wird nicht zurück gesetzt

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,

    ich denke die Überschrift sagt schon alles.
    Ich habe einen Timer TCC0 der in regelmäßigen Abständen überläuft.
    Parallel hierzu wurde ein DMA Kanal eingerichtet um vom Überlauf des TCC0 getriggert zu werden um Daten in den DAC zu schreiben.
    Das bewirkt aber ein permanentes Triggern des DMA's, da der DMA nach dem Trigger den Overflow-Flag das Timers nicht löscht.

    Da das ganze ausschließlich in der Hardware realisiert werden soll, ist ein" software" Interrupt nicht möglich, welches natürlich den Flag löschen würde...

    Alternativ habe ich schon gesehen, dass das Eventsystem den Flag automatisch löscht. Wenn ich dieses "dazwischen schalte" funktioniert das ganze.
    Aber ich dachte mir, dass das ganze unötig sei, dass Eventsystem nur dafür zu missbrauchen...
    Code:
    void SetupSinusChannel( DMA_CH_t * dmaChannel )
    {
        DMA_SetupBlock(    dmaChannel,
                        SinusSignal,
                        DMA_CH_SRCRELOAD_BLOCK_gc,
                        DMA_CH_SRCDIR_INC_gc,
                        (void *) &DACA.CH0DATA,
                        DMA_CH_DESTRELOAD_BURST_gc,
                        DMA_CH_DESTDIR_INC_gc,
                        SinusSignalResolution * 2,
                        DMA_CH_BURSTLEN_2BYTE_gc,
                        0,
                        true );
    
        DMA_EnableSingleShot( dmaChannel );
        DMA_SetTriggerSource( dmaChannel, DMA_CH_TRIGSRC_EVSYS_CH0_gc );
    }
    Code:
    TCC0.PER = PER_TCC0;
    EVSYS.CH0MUX = EVSYS_CHMUX_TCC0_OVF_gc;
    Es muss doch möglich sein, dass der DMA den Flag löscht oder? Leider wird in den Application Notes nichts dazu geschrieben (AVR1304, AVR1514).
    In der XMEGA A Manual wird im DMA auf die Einstellungen des Timers verwiesen, dort finde ich aber leider keine Hinweise.

    Auf der Suche im WWW bin ich aber auch schon darauf gestoßen, dass andere das Eventsystem ebenfalls hierzu genutzt haben.

    Da das ganze für meine Bachelor Arbeit ist, würde ich den Code gerne so einfach und sauber wie möglich schreiben.

    Es würde mich freuen, wenn mir jemand einen nützlichen Hinweis hierzu geben könnte.

    Gruß Erik
    Meine Projekte auf Youtube

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hi,

    ich glaube, ich hatte vor kurzer Zeit das gleiche Problem!
    Ich hab mich dafür entschieden, einen EventSystem Kanal dafür zu nutzen, dort kann man ja auch einen Prescaler einstellen.
    Was mir gerade einfällt, wäre, den Interrupt des Timers zu deaktivieren, müsste man mal probieren.
    Falls nötig kannst du ja nach der Transaktion auch durch den DMA einen Int auslösen lassen.

    Gruß
    Chris

    EDIT:
    Hab gerade mal im DB gekuckt:
    Code:
    Bit 0 – OVFIF: Overflow/Underflow Interrupt Flag
    This flag is set either on a TOP (overflow) or BOTTOM (underflow) condition, depending on the WGMODE setting.
    OVFIF is automatically cleared when the corresponding interrupt vector is executed. The flag can also be cleared
    by writing a one to its bit location.
    OVFIF can also be used for requesting a DMA transfer. A DMA write access of CNT, PER, or PERBUF will then
    clear the OVFIF bit.
    Da bleibt wohl nur der Umweg übers Eventsystem oder eben die in-Kaufnahme des zusätzlichen ISR.
    Geändert von Che Guevara (22.08.2014 um 11:00 Uhr)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405
    Dankeschön,
    ja dann habe ich wenigtens noch einen NAchweis dafür. Ich finde es schade, dass es dafür keine Funktion in der Hardware gibt.
    Da ich durch den extrem hohen Rechenaufwand keine Ressourcen für ein ISR habe muss ich wohl das Eventsystem verwenden...
    Meine Projekte auf Youtube

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hi,

    ja, ich finds auch sehr Schade! Aber es gibt ja gott-sei-dank genügend EventSystem Kanäle, zumindest ich hab noch nie mehr als 4 gleichzeitig gebraucht und so bleibt auch der Timer für eventuelle andere Aufgaben frei (PWM, Freq, etc..).

    Gruß
    Chris

Ähnliche Themen

  1. Timer Overflow funktioniert nicht [erledigt]
    Von robo junior im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 19.11.2008, 18:15
  2. Ausgang wird nicht richtig gesetzt
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 18.09.2006, 21:02
  3. PWM mit Timer 0 und 2 geht, aber nicht mit Timer 1 (mega64)
    Von popi im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.06.2006, 17:00
  4. PORTD,4 wird nicht auf HIGH gesetzt
    Von Pitt1986 im Forum PIC Controller
    Antworten: 15
    Letzter Beitrag: 25.02.2006, 20:23
  5. Antworten: 8
    Letzter Beitrag: 18.05.2005, 22:21

Stichworte

Berechtigungen

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