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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren