Forum: Mikrocontroller und Digitale Elektronik ATMega16 mit Betriebsystem


von Daniel P. (penzi)


Lesenswert?

Hallo ich bin neu hier wollte wissen ob jemand von euch schon Erfahrung 
mit einem RTOS auf dem ATMega16 hat.

Hätte da auch eine Bitte oba jemand ein funktionierendes BSP. für das 
RTOS AVRX hat und er mir dieses hier posten könnte!

Mittlerweile habe ich schon ein funktionierendes Programm auf dem 
ATMega16, dass unter dem Betriebssystem FreeRTOS.

mfg Danke im Voraus Penzi

von Daniel P. (penzi)


Lesenswert?

Ich bins nochmal habe jetzt hier mein Test Programm für das AvrX RTOS im 
Dateianhang! Vielleich findet jemand von euch den Fehler in meinem 
Programm!

Das kompilen für den ATMega16 funktioniert ohne Fehler auch das 
Programmieren funktioniert einwandfrei, doch danach tut sich nichts!

danke mfg Penzi

von Rahul D. (rahul)


Lesenswert?

Kein Anhang da.

von Daniel P. (penzi)


Angehängte Dateien:

Lesenswert?

Das hab ich auch schon bemerkt weis aber nicht warum!

neuer Versuch!!!

von Klaus F. (kfalser)


Lesenswert?

Bei uns funktionierts auf einem ATmega32, wir machen es aber ein bischen 
anders.
Die Tasks werden mit AVRX_GCC_TASKDEF() definiert, z.B.

AVRX_GCC_TASKDEF(task1, 100, 2)
{
  DDRB = 0xFF;
  PORTB = 0xFF;

      while(1)
        {
          AvrXWaitSemaphore(&TimerSemaphore);
          PORTB ^= _BV(PORTB0);
        }
}

Und AvrXRunTask bekommt den TCB als Parameter, also :
AvrXRunTask(TCB(task1));

Grüße
Klaus

von Daniel P. (penzi)


Angehängte Dateien:

Lesenswert?


Also habe das jetzt versucht! Programm nochmals im Anhang falls sich
jemand dafür interessiert!!!

Bin schön langsam am verzweifeln vieleicht könnte mir jemand ein
funktionierendes Programm posten danke

von Daniel P. (penzi)


Angehängte Dateien:

Lesenswert?

Ich bins nochmal so bin jetzt soweit, dass zumindes PORTB0 leuchtet dies 
bringt mich schon mal eine große Schritt nach vorne!
Schaut euch bitte das Programm von mir an und versucht den Fehler 
zufinden, denn eigenlich sollte auch PORTB1 leuchten oder verstehe ich 
hier etwas falsch?

mfg Daniel

von Peter (Gast)


Lesenswert?

Müsstest Du nicht noch irgendwo mit der cli(); Anweisung die Interrups 
freigeben...??? (vor oder nach Epilog)

MfG  Peter

von Klaus Falser (Gast)


Lesenswert?

Ich habe jetzt am Wochenende keinen Zugang zu dem Quellcode, aber ich 
denke nicht daß IntProlog() und Epilog() in der Interrupt routine nötig 
sind.

Das EndCriticalSection() ist auch eher falsch, das sollte immer 
paarweise mit BeginCritical() auftauchen.
In diesem Fall reaktiviert es die Interrupts, keine gute Idee.

Klaus

von Klaus Falser (Gast)


Lesenswert?

Entschuldigung, habe gerade gesehen, daß das im Tutorial genauso 
angegeben ist. Wird also doch stimmen.

Klaus

von Klaus Falser (Gast)


Lesenswert?

Deine Tasks geben die Kontrolle nie ab.
Außerdem haben beide die selbe Priorität, weiss nicht ob das richtig 
ist.
Bau einmal eine Wartezeit in deine Tasks ein, so wie folgt

AVRX_TASKDEF(myTask, 10, 3)
{
    TimerControlBlock MyTimer;

    while (1)
    {
        AvrXDelay(&MyTimer, 10); // 10ms delay
        // Hier die Ports togglen
    }
}

Klaus

von A.K. (Gast)


Lesenswert?

(1) Dein
1
while(AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT)
2
AvrXIntSetSemaphore(&TimerSemaphore);
3
AvrXIntSetSemaphore(&TimerSemaphore);
wird der Compiler so sehen:
1
while(AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT) {
2
  AvrXIntSetSemaphore(&TimerSemaphore);
3
}
4
AvrXIntSetSemaphore(&TimerSemaphore);

Ausserdem ist es höchst unsauber, in Interrupts zu warten.

(2) Das Statement
1
PORTB ^= _BV(PORTB0);
ist nicht Interrupt-fest, folglich auch in einem preemptiven RTOS bei 
eingeschalteten Interrupts nicht nicht korrekt.

(3) Der Port sollte genau 1x initialisiert werden. NIcht in jeder Task.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

A.K. wrote:
> (2) Das Statement
>
1
> PORTB ^= _BV(PORTB0);
2
>
> ist nicht Interrupt-fest, folglich auch in einem preemptiven RTOS bei
> eingeschalteten Interrupts nicht nicht korrekt.

Wieso? Das ergibt cbi PORTB, 0.

von A.K. (Gast)


Lesenswert?

> Wieso? Das ergibt cbi PORTB, 0.

Bei XOR auf einem Mega16? Kaum.

von A.K. (Gast)


Lesenswert?

Das wird ohne Abschalten der Interrupts nur sicher, wenn man einen 
neueren Controller (z.B. Mega644) nimmt, und daraus
1
PINB=_BV(PORTB0)
 macht.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Ups, da hab ich '&' statt '^' gelesen.

von Daniel P. (penzi)


Lesenswert?

@ Klaus Falser
Habe das mit den warte zeiten ausprobiert jetzt leuchtet tut sich 
garnichts mehr. Wenn ich jetzt die Wartezeit des jeweiligen Tasks 
auskommentiere leuchtet dieser wider.

@ All danke für die schnellen antworten auch wenn sie mir nicht 
weiterhelfen

mfg Daniel

von Klaus Falser (Gast)


Lesenswert?

Ich denke, daß der Timer nicht korrekt funktioniert.
Hast Du die Initialisierung des Timer selbst ausgerechnet oder nur das 
Beispiel abgeschrieben? Du mußt den Timer so setzen, daß er mit deiner 
Oszillatorfrequenz alle 1 ms einen Interrupt erzeugt.

Kannst Du das ganze nicht auch im AVR Studio simulieren?

Klaus

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.