Forum: Mikrocontroller und Digitale Elektronik AVR32 UC3A1512 Counter/Interrupt


von Buddler B. (buddler) Benutzerseite


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.
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?

von Buddler B. (buddler) Benutzerseite


Lesenswert?

Keiner eine Idee?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.