ATmega32 PWM + FreeRTOS Multitasking

Gast #2417393
Lesenswert?
• ▲
▼
Einen wunderschönen guten Tag.

habe da ein Problem und komme nicht weiter. Versucht habe ich mit einem 
ATmega32 auf dem STK500 zwei Led's per PWM zu dimmen (task2) und 
nebenher einen zweiten Task (task1) laufen zu lassen, der eine andere 
Led toggelt. Das Problem ist, das nur funktioniert, wenn ich den Ausgang 
OCR1AL benutze (PortD 5).
Sobald ich aber das Vergleichsregister OCR1BL beschreibe (so wie unten 
im Quelltext angegeben) wird der LED-Toggle Task (task1 mit der 
niedrigeren Priorität) nicht mehr ausgeführt. Die Led's werden aber 
gedimmt. Wenn nur eine LED gedimmt werden soll, also OCR1AL gesetzt 
wird, funktioniert das ganze einwandfrei.

Also geschrieben ist das mit AVR-Studio 5, der ATmega32 (16 MHz) sitzt 
auf einem STK500 und FreeRTOS ist Version 7.0.1.

Hat jemand eine Idee woran das liegen könnte?

Vielen Dank und viele Grüße
maddde

[c]
//FreeRTOS include files

#include "FreeRTOS.h"

#include "FreeRTOSConfig.h"

#include "task.h"



void task1(){

  const portTickType freq1 = 150;

  portTickType lastwake1 = xTaskGetTickCount();



  for(;;){

    vTaskDelayUntil(&lastwake1, freq1);

    PORTD |= (1<<PD7);

    vTaskDelay(50);

    PORTD &= ~(1<<PD7);

  }

}



void task2(){

  int i = 0;



  TCCR1A = 0xB1;

  TCCR1B = 0x01;



  OCR1AL = 255;

  OCR1BL = 0;



  const portTickType freq2 = 10;

  portTickType lastwake2 = xTaskGetTickCount();



  for(;;){ //LED blinken

    vTaskDelayUntil(&lastwake2, freq2);



    ++i;



    if(i > 150){

      i = 0;

    }



     OCR1AL = 255-i;

    OCR1BL = i;

  }

}







void main(){



  DDRD = 0B11110000;

  PORTD = 0B00001111;



  xTaskCreate(task1, (signed portCHAR *)"task1", 
configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);


        xTaskCreate(task2, (signed portCHAR *)"task2", 
configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2, NULL);



  vTaskStartScheduler();

}



[\c]
#2417441
Lesenswert?
• ▲
▼
Und wie so häufig kommt die Lösung allein, wenn man das jemand anderem 
erzählt.

Nachdem ich die Zeile "  TCCR1B = 0x01;  " auskommentiert habe läufts. 
Allerdings ist mir nicht ganz klar warum. TCCR1B ist laut Datenblatt für 
die Einstellungen des Prescalers verantwortlich. So sollte der Timer 
eigentlich gar nicht laufen. Werd dann nochmal die Datenblätter 
durchwälzen...

Hat trotzdem jemand eine Idee was ich falsch mache?


Viele Grüße,
maddde
#2423572
Lesenswert?
• ▲
▼
Ja danke, das war ein guter Tipp ;)

FreeRTOS hat die "TICKS" über den Timer 1 generiert, den ich dann für 
mein PWM-Signal verwenden wollte. Komischerweise hat sich das aber nicht 
in einem großen Knall geäußert, sondern wäre vermutlich nur bei einer 
genauen Beobachtung mit einem Oszi zu erkennen gewesen.

Hab jetzt Timer0 des Atmega für die Ticks genommen. OCRO auf 124 und 
Prescaler 64 müsste bei einer Takfrequenz von 16MHZ 1000HZ ergeben. 
Diese Änderungen werden in der port.c von Freertos vorgenommen.

Vielen Dank nochmal und viele Grüße,

Mattis

Antwort schreiben

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.

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.