- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 12

Thema: XMEGA: Zeitproblem mit zwei parallel sehr schnell laufenden Timern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    406

    XMEGA: Zeitproblem mit zwei parallel sehr schnell laufenden Timern

    Hallo,

    ich versuche grade eine Messung aufzubauen, bekomme jedoch Probleme bezüglich der Timer.
    Für die Messung verwende ich ein Atmel XPLAINED Board mit einem XMEGA128A1. Der Prozessor läuft für diese Aufgabe mit dem internen 32 MHz-Takt.
    Der XMEGA soll zeitlich getaktet ein Signal mit Hilfe des DACs generieren und parallel ein AD-Wandler mit einer 16-Bit Parallelschnittstelle auslesen. Das Signal soll mit ca. 40 Samples bei 10 kHz ausgegeben werden - damit ergibt sich ein Takt von 2,5 µs für den ersten Timer. Der AD-Wandler soll parallel 800 kSamples aufnehmen, welche alle 1,25 µs mit Hilfe des DMAs ausgelesen werden sollen.
    Beides bekomme ich einzeln zum laufen - die Zeiten liegen dann in dem gewünschten Bereich. Für Versuchszwecke gebe ich das Signal als Sinus mit dem DAC aus und anstatt den AD-Wandler auszulesen gebe ich Flanken an einem Port aus (Der AD-Wandler ist Hardwareseitig noch nicht vorhanden) und lasse mir diese auf einem Oszilloskop anzeigen.
    Aktiviere ich aber beide Timer, so kommt es mindestens bei einem Timer zu erheblichen Verzögerungen oder der Timer arbeitet deutlich schneller als eingestellt oder gar unregelmäßig.

    Ich verwende die 16 Bit Timer TCC0 und TCC1. Für Versuche habe ich das Interrupt leer gelassen und erhalte schon im Simulator (Atmel Studio 6.1) abweichende Zeiten. Auch bei der Ausgabe und dem Einlesen der Spannungen mit dem Oszilloskop sieht es nicht anders aus.
    Auch das Spielen mit den Interrupt-Levels der Timer hat mir nicht weiter geholfen. Weiterhin ist mir aufgefallen, dass die Optimierungs-Einstellung im Atmel Studio ebenfalls negativen Einfluss auf die Zeiten hat.
    Leider finde ich keinen Ansatzpunkt wo ich nun mit der Fehlersuche weiter vorgehen soll.
    Ich hoffe es findet sich wer, der mir einen guten Hinweis geben kann. Ich bin mir bewusst, dass ich bezüglich der Anforderungen an die Schnelligkeit mit dem XMEGA an die Grenzen stoße, bin aber optimistisch, dass ich die Aufgabe mit den funktionierenden Timern lösen kann.

    Mein Problem besteht grundsätzlich daraus, zwei 16-Bit Timer so einzustellen, dass diese im µs-Bereich exakt arbeiten ohne sich gegenseitig zu stören.

    Gruß Erik
    Meine Projekte auf Youtube

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

    du willst also 2 Timer verwenden, um mit dem einen alle 2.5us und mit dem anderen alle 1.25us einen Interrupt zu generieren. Richtig?
    Wenn wir mal von 1.25us bei 32MHz ausgehen, wäre da ein Interrupt alle 40 Takte. Mit Register sichern und tralala, kommt man da ggf schon über diese 40 Takte. Dann kommt irgendwann auch noch der 2. Timer, dessen Interrupt schon lange pendet und sofort in die ISR springt.
    Was hast du den vor? Evtl. gäbe es ja einfachere Wege, um deine Aufgabe zu verwirklichen, so wird das denke ich mal nichts.
    Evtl. könntest du die 2 Timer ja auch durch 1 ersetzen, der alle 1.25us triggert und bei jedem 2. mal hast du dann auch deine 2.5us.

    Gruß
    Chris

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Erik,

    Mit Interrupts wird das so nichts werden!
    Es dauert jedesmal etwas Zeit, biss der laufende Prozess unterbrochen, gesichert und die Interrupt-Routine aufgerufen ist.
    Die Verzögerungszeit hängt dabei schon mal vom gerade laufenden Befehl ab, von gesperrten IRQs reden wir mal gar nicht!
    Das Problem liegt nicht bei den Timern, sondern in der Software, welche nur endlich schnell ist.

    Die einzige Möglichkeit sehe ich darin, dass du das über die DMA machst.

    Du baust dir z.B. die Sinustabelle auf.
    Dann überträgst du diese Tabelle per DMA zum DAC
    Die DMA triggerst du mit dem einen Timer.

    Umgekehrt geht's beim ADC.
    Hier konfigurierst du alles so, dass die DMA die Messwerte in einer Tabelle, evtl. Ringbuffer. ablegt.
    Hier musst du aber sicherstellen, dass die CPU die Daten auch schnell genug verarbeiten kann.

    Die DMA "stielt" dir dann nur die paar Takte, welche für das Lesen und Schreiben auf dem Bus nötig sind.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    2 so schnelle Aufgaben per Interrupt geht nicht, dafür die die Verzögerungen zu lange. Mit DMA (wenigstens für einen der Aufgaben) gibt es beim Xmega eine elegante Lösung. Möglich wäre sonst noch ein starrer ASM Code der Zyklengenau ausgeklügelt ist - ist aber etwas aufwendig.

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    Hallo!

    @ erik_wolfram

    Damit zwei Timer völlig unabhängig voneinander arbeiten könnten, würde ich dafür zwei µC nehmen, was am einfachsten ist. Sonst müsste man nur mit Flagsetzen für Hauptprogramm, also mit gesperrten Unterbrechungen arbeiten (als ASMan habe ich k.A. über "Cäh").
    Geändert von PICture (09.07.2014 um 19:43 Uhr)
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Crazy Harry
    Registriert seit
    15.01.2006
    Ort
    Raum Augsburg - Ulm
    Beiträge
    1.308
    Ich bin kein C-Programmierer und kann dir auch nichts zu deiner Frage sagen, aber wenn du mehr Power brauchst, warum taktest du den XMega nicht mit 64MHz ?
    Ich programmiere mit AVRCo

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    32MHz = 31,25 ns / Takt
    1,25 µs = ~40 Takte

    Selbst wenn du nur den 1,25 µs Timer laufen lässt, ist das fast nicht möglich. (Bei 40 Takten für eine ISR darfst du im Prinzip gar nichts berechnen um noch mitzukommen)

    mfg

Ähnliche Themen

  1. Zeitproblem mit 7-Segmentanzeige
    Von Der Einsteiger im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 05.02.2014, 21:37
  2. Zwei Boost-Converter parallel schalten
    Von exaware im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 08.12.2010, 18:33
  3. zwei Stromquellen parallel oder in reihe
    Von The Man im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 09.01.2007, 11:06
  4. Laser sehr schnell umlenken
    Von Zeroeightfifteen im Forum Elektronik
    Antworten: 51
    Letzter Beitrag: 09.12.2006, 22:59
  5. Error 152 ??? Hilfe schnell dringend sehr wichtig
    Von AEWE im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 17.07.2005, 11:38

Berechtigungen

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

Labornetzteil AliExpress