- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 3 von 3

Thema: XMega Event System & DMA -- Taster & Timer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    XMega Event System & DMA -- Taster & Timer

    Hallo,

    nachdem ich mein erstes Problem mit dem XMega erfolgreich gelöst habe, taucht jetzt das nächste auf:
    Ich möchte mithilfe des Event-Systems und des DMAs eine PWM einlesen, sodass ich keine Interrupts benötige. Vorgestellt habe ich mir das folgendermassen:

    -EventSystem Channel0 reagiert auf die PWM (fallende Flanke, momentan noch ein Taster an PortE.0)
    -EventSystem Channel1 reagiert auf den TimerC0 Overflow (momentan noch 8Bit)
    -DMA Channel0 wird von EventSystem Channel1 getriggert und der Timer wird wieder mit dem richtigen Start Wert vorgeladen
    -DMA Channel1 wird von EventSystem Channel0 getriggert und der aktuelle Timer Wert wird in eine Variable (pwm_input) geschrieben

    Mein Problem ist jetzt folgendes:
    Wenn ich den Taster EINMALIG betätige wird die Interrupt Routine von DMA Channel1 unendlich oft aufgerufen (obwohl das nur 1mal passieren sollte). Diese ISR dient mir momentan nur zu debug Zwecken und wird später dann entfernt, sobald ich dieses Problem gelöst habe.
    Hier mein Code:
    Code:
    $regfile = "xm64a3def.dat"
    $crystal = 32000000
    $framesize = 100
    $hwstack = 100
    $swstack = 100
    
    
    $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
    
    
    Config Osc = Disabled , 32mhzosc = Enabled
    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
    
    
    
    Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
    Open "COM2:" For Binary As #1
    
    
    Dim Timer0_reload_value As Byte
    Timer0_reload_value = 100
    
    Dim Pwm_input As Byte
    Pwm_input = 0
    
    
    Config Tcc0 = Normal , Prescale = 1024 , Resolution = 8
    Tcc0_per = Timer0_reload_value
    
    
    Config Dma = Enabled , Doublebuf = Disabled , Cpm = Ch01rr23
    
    Config Dmach0 = Enabled , Burstlen = 1 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , Sar = Burst , Sam = Fixed , Dar = Burst , Dam = Fixed , Trigger = &H02 , Btc = 1 , Repeat = 0 , Sadr = Varptr(timer0_reload_value) , Dadr = Varptr(tcc0_per)
    Config Dmach1 = Enabled , Burstlen = 1 , Chanrpt = Enabled , Tci = Lo , Eil = Lo , Singleshot = Enabled , Sar = Burst , Sam = Fixed , Dar = Burst , Dam = Fixed , Trigger = &H01 , Btc = 1 , Repeat = 0 , Sadr = Varptr(tcc0_per) , Dadr = Varptr(pwm_input)
    
    On Dma_ch1 Timer_ovf_int
    
    
    Config Porte.0 = Input
    Porte_pin0ctrl = &B00_011_010                               'enable pullup, react on falling edge
    
    
    Config Event_system = Dummy , Mux0 = Porte.0 , Digflt0 = 8 Mux1 = Tcc0_ovf
    
    
    'Settings:
    'DMACH0: Trigger = EV_SYS_CH1 (TCC0_OVF) , timer0_reload_value --> tcc0_per
    'DMACH1: Trigger = EV_SYS_CH0 (PORTE.1) , tcc0_per --> pwm_input
    
    
    Enable Interrupts
    Config Priority = Static , Vector = Application , Lo = Enabled
    
    Print #1 , "START"
    Print #1 ,
    
    
    
    Do
    
    
    
    
    
    Loop
    
    Timer_ovf_int:
    
       Print #1 , "Taster betätigt!"
    
    Return
    
    End
    Weiß jemand, warum die ISR so oft aufgerufen wird und wie ich es verhindern kann, sodass PRO Tasterdruck nur EIN dma Transfer durchgeführt wird?

    Vielen Dank & Gruß
    Chris

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ist nur ne Idee und ohne jetzt in den Code zu gucken. Löscht du in der ISR auch das Interruptflag?
    Weil beim UART Rx-Interrupt z.B. musst du auch den Buffer leeren, sonst wird die ISR andauernd aufgerufen.
    Sonst lösch das Interruptbit mal manuell.....vielleicht löst das ja das Problem.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo,

    danke, das wars Ich hatte mir vorher sogar noch ein paar Beispiele angesehen, wo das Flag auch gelöscht wurde, aber irgendwie habe ich das wieder vergessen... Dankeschön!
    Jedoch gibts jetzt schon das nächste Problem:
    Folgende Zeile
    Code:
    Config Event_system = Dummy , Mux0 = Porte.0 , Digflt0 = 8 Mux1 = Tcc0_ovf
    funktioniert (ohne Komma zwischen Digflt0 = 8 & Mux1 = Tcc0_ovf), diese nicht:
    Code:
    Config Event_system = Dummy , Mux0 = Porte.0 , Digflt0 = 8 , Mux1 = Tcc0_ovf
    Aber ich denke mal, das ist ein Bug?!
    Mit der ersten Zeile wird die DMA Channel1 ISR aufgerufen, bei der zweiten Zeile jedoch nicht... Aber damit kann ich Leben, wenn ichs weiß

    Nächstes Problem:
    Wenn ich mir in der DMA Channel1 ISR die PWM_Input Variable ausgeben lasse, trägt diese immer den Wert von Timer_Reload_Value... Ich glaube, der Timer läuft noch nicht... Mal sehen

    Vielen Dank & Gruß
    Chris

    EDIT:
    1. Ich habe die Register vertauscht!! Das Register, in dem der aktuelle Zählerstand steht, heißt TCC0_CNT.
    2. Gerade habe ich gesehen, dass man mit dem Timer auch direkt die PWM Pulsweite messen kann... Somit wird mir der Umweg über den DMA usw... erspart... Trotzdem ein sehr interresantes Kapitel

    EDIT2:
    Also: PWM einlesen mit TCE0 CaptureA funktioniert, mit CatpureB jedoch nicht... Weiß jemand Rat?
    Das funktioniert:
    Code:
    $regfile = "xm64a3def.dat"
    $crystal = 32000000
    $framesize = 100
    $hwstack = 100
    $swstack = 100
    
    
    $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
    
    
    Config Osc = Disabled , 32mhzosc = Enabled
    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
    
    
    Dim X As Word
    
    
    Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
    Open "COM2:" For Binary As #1
    
    
    Config Porte.0 = Input
    Porte_pin0ctrl = &B00_011_010
    
    Config Event_system = Dummy , Mux0 = Porte.0 , Digflt0 = 1
    
    Config Tce0 = Normal , Prescale = 1 , Capturea = Enabled , Event_source = E0 , Event_action = Pwc , Resolution = 16
    
    
    
    Config Tcd0 = Pwm , Prescale = 1 , Comparea = Enabled , Resolution = 16
    Tcd0_cca = 30000
    
    
    Enable Interrupts
    Config Priority = Static , Vector = Application , Lo = Enabled
    
    
    Do
    
    
       Incr X
       If X = 65500 Then X = 0
       Tcd0_cca = X
       Print #1 , Tce0_cca
    
    
    Loop
    
    End
    Das funktioniert nicht:
    Code:
    $regfile = "xm64a3def.dat"
    $crystal = 32000000
    $framesize = 100
    $hwstack = 100
    $swstack = 100
    
    
    $lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
    
    
    Config Osc = Disabled , 32mhzosc = Enabled
    Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
    
    
    Dim X As Word
    
    
    Config Com2 = 38400 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8
    Open "COM2:" For Binary As #1
    
    
    Config Porte.1 = Input
    Porte_pin1ctrl = &B00_011_010
    
    Config Event_system = Dummy , Mux0 = Porte.1 , Digflt0 = 1
    
    Config Tce0 = Normal , Prescale = 1 , Captureb = Enabled , Event_source = E0 , Event_action = Pwc , Resolution = 16
    
    
    
    Config Tcd0 = Pwm , Prescale = 1 , Comparea = Enabled , Resolution = 16
    Tcd0_cca = 30000
    
    
    Enable Interrupts
    Config Priority = Static , Vector = Application , Lo = Enabled
    
    
    Do
    
    
       Incr X
       If X = 65500 Then X = 0
       Tcd0_cca = X
       Print #1 , Tce0_ccb
    
    
    Loop
    
    End
    Geändert von Che Guevara (05.03.2012 um 01:36 Uhr)

Ähnliche Themen

  1. XMega mit periodischem Timer Interrupt
    Von Superhirn im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 19.02.2012, 18:35
  2. Xmega - Timer configuration
    Von Duesentrieb7 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 09.12.2009, 22:56
  3. Timer-Taster
    Von orion42 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 27.05.2008, 20:01
  4. Taster / Timer / Relais ???
    Von Papsi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 10.09.2007, 01:13
  5. Mit Taster einen Timer starten ?
    Von Enterprise im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 15.11.2005, 20:56

Berechtigungen

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

Labornetzteil AliExpress