AVR32 UC3A1512 Counter/Interrupt

OP Persönliche Seite #1375317
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.
1
void PWM(int channel)
2
{
3
  AVR32_PM.pbamask = AVR32_PM.pbamask | (1 << 12); //Enable PWM clock
4
  AVR32_PWM.mr = (1 << 0) //DIVA set, clock selected by PREA
5
          | (0x0 << 8); //PREA set, divider  = 1
6
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr | (0x0 << 0); //Pre-scaler 1
7
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr &(~(1 << 8)); //period left-aligned (calg)
8
  AVR32_PWM.channel[channel].cprd = 10; //period
9
  AVR32_PWM.channel[channel].cdty = 5; //pulsewidth (duty cycle)
10
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr | (1 << 9); //Polarity of output (cpol)
11
  AVR32_PWM.channel[channel].cmr = AVR32_PWM.channel[0].cmr &(~(1 << 10)); //cupd will update duty cycle (cdty)
12
  AVR32_PWM.ena = (1 << channel); //PWM for channel x enabled
13
  AVR32_GPIO.port[1].gperc = (1 << (channel + 19)); // Use PB19+x as function, disable setting as a periphal pin
14
  AVR32_GPIO.port[1].pmr0c = (1 << (channel + 19)); //Function A (PWM) selected through setting
15
  AVR32_GPIO.port[1].pmr1c = (1 << (channel + 19)); //(pmr0c, pmr1c) = 00
16

17
}


Wer kann helfen, evtl. Tipps zur Herangehensweise geben?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.