mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR32 UC3A1512 Counter/Interrupt


Autor: Buddler B. (buddler) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin sowohl µC- als auch im speziellen AVR32-Einsteiger und stehe vor 
der Problematik, in variablen Zeitabständen (0-300sek) ein Ventil zu 
öffnen (0-2000ms). Als Notvariante habe ich zumindest die Öffnungszeit 
per PWM einmal realisieren können. Allerdings kann ich bei einem 
PWM-Signal nur einen Parameter im laufenden Betrieb ändern (entweder 
Pulsbreite oder Periode). Daher dachte ich an die Verwendung einer 
Funktion, die nur die Parameter Öffnungszeit und Periode in 
Zeiteinheiten übergeben bekommt.

Parallel dazu läuft im Hauptprogramm eine ganze Menge anderer Babel ab, 
weshalb sichergestellt sein müsste, dass die Ventilabsteuerung nabhängig 
davon läuft (also mit Interrupts, wie ich das verstanden habe?). --> 
Timer/Counter nutzen

Bisher habe ich mir das Framework zum UC3A angesehen und für GPIO, ADC 
und PWM die vorgefertigten Methoden zurückverfolgt und sozusagen alles 
im Grundformat (ohne extra eingebundene Header-Dateien) geschrieben. Das 
hat bis dahin geklappt (Dank dem UC3-Manual und Zippi aus dem Forum).

Mit den Header-Files zum Counter bin ich allerdings völlig überfordert, 
weil die in meinen Augen ziemlich aufgeblasen sind und ich bisher noch 
nicht mit Interrupts noch nicht gearbeitet habe.

Hat jemand schonmal ähnliches gemacht und dazu die Frameworkdateien 
entrümpelt oder selbst Methoden geschrieben?

Ich würde am liebsten alles im Stile von meiner PWM-Init machen, ohne 
extra erschaffene Variablen, Structs und ähnlichem.
void PWM(int channel)
{
  AVR32_PM.pbamask = AVR32_PM.pbamask | (1 << 12); //Enable PWM clock
  AVR32_PWM.mr = (1 << 0) //DIVA set, clock selected by PREA
          | (0x0 << 8); //PREA set, divider  = 1
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr | (0x0 << 0); //Pre-scaler 1
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr &(~(1 << 8)); //period left-aligned (calg)
  AVR32_PWM.channel[channel].cprd = 10; //period
  AVR32_PWM.channel[channel].cdty = 5; //pulsewidth (duty cycle)
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr | (1 << 9); //Polarity of output (cpol)
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr &(~(1 << 10)); //cupd will update duty cycle (cdty)
  AVR32_PWM.ena = (1 << channel); //PWM for channel x enabled
  AVR32_GPIO.port[1].gperc = (1 << (channel + 19)); // Use PB19+x as function, disable setting as a periphal pin
  AVR32_GPIO.port[1].pmr0c = (1 << (channel + 19)); //Function A (PWM) selected through setting
  AVR32_GPIO.port[1].pmr1c = (1 << (channel + 19)); //(pmr0c, pmr1c) = 00

}


Wer kann helfen, evtl. Tipps zur Herangehensweise geben?

Autor: Buddler B. (buddler) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner eine Idee?

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.