www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega16 mit Betriebsystem


Autor: Daniel Penzenauer (penzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Penzenauer (penzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Anhang da.

Autor: Daniel Penzenauer (penzi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich auch schon bemerkt weis aber nicht warum!

neuer Versuch!!!

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Penzenauer (penzi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Penzenauer (penzi)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

MfG  Peter

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (Gast)
Datum:

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

Klaus

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(1) Dein
while(AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT)
AvrXIntSetSemaphore(&TimerSemaphore);
AvrXIntSetSemaphore(&TimerSemaphore);  
wird der Compiler so sehen:
while(AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT) {
  AvrXIntSetSemaphore(&TimerSemaphore);
}
AvrXIntSetSemaphore(&TimerSemaphore);  

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

(2) Das Statement
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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Wieso? Das ergibt cbi PORTB, 0.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wieso? Das ergibt cbi PORTB, 0.

Bei XOR auf einem Mega16? Kaum.

Autor: A.K. (Gast)
Datum:

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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, da hab ich '&' statt '^' gelesen.

Autor: Daniel Penzenauer (penzi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.