Forum: Mikrocontroller und Digitale Elektronik AVR Pseudo Multitasking


von Pascal (Gast)


Lesenswert?

Hallo,

nachdem ich mitlerweile sämtliche Foren und auch Google abgegrast habe 
komme ich leider trozdem nicht wirklich weiter. Mir geht es darum ich 
habe einen ATMega8 mit Bascom programmiert das dieser einen 
Temperatursensor ausließt und ausgibt.

Nun würde ich nebenbei noch wollen das eine LED am PortB.1 blinkt. 
Leider kann der Prozessor ja kein Multitasking und wenn der Controller 
in einer wait_ms Anweisung hängt wartet er ja und da blinkt woanders 
nichts mehr!.

Währe es möglich das die Codes (Sub1 und Sub2) wirklich gleichzeitig 
ausgeführt werden?

von Anonymous (Gast)


Lesenswert?

Dazu sind Timers da...

von Pascal (Gast)


Lesenswert?

Ich weis nur ich hab noch nicht so richtig Begriffen gerade auch in 
Bascom wie das funktionieren soll wenn er z.B. gerade in der Wait 
Anweisung steckt dann würde er ja zu Sub2 springen und dann wieder alles 
von ganz vorne????

von Anonymous (Gast)


Lesenswert?


von Sigint 112 (sigint)


Lesenswert?

@Pascal:
   Wie kommst du darauf, daß der AVR kein Multitasking kann? Zugegeben, 
mit BASCOM wird das wahrscheinlich nix, aber in ASM ist das durchaus 
machbar:

http://www.barello.net/avrx/

Gruß,
  SIGINT

von vielleicht so (Gast)


Lesenswert?

Der Witz des Multitasking ist die unbenutzte Zeit der CPU richtig zu 
verteilen. Dh es gibt generell kein polling, sei das nun fuer ein Delay 
oder ein Wait. Sobald ein Prozess warten muss geht die restliche Zeit an 
den Kernel, und der macht mit einem anderen Prozess weiter.

von Pascal (Gast)


Lesenswert?

Achso! Danke mitlerweile funktioniert es :-D. Ich hab schon gelesen das 
es für die Mega32 Serie extra Betriebssysteme geben soll aber bei mir 
ist es mehr Spielerei :-)

von Falk B. (falk)


Lesenswert?

@ Sigint 112 (sigint)

>   Wie kommst du darauf, daß der AVR kein Multitasking kann? Zugegeben,
>mit BASCOM wird das wahrscheinlich nix,

Nöö, BASCOM kann das problemlos. Aber einge Programmierer vielleicht 
nicht.

@ Pascal (Gast)

Der Trick des Multitasking ist, dass man EBEN NICHT wartet, sondern 
prüft, ob eine bestimmte Teilaufgabe bearbeitet werden muss. Wenn ja, 
dann macht man das. Wenn nein, geht man zu nächsten Teilaufgabe weiter. 
Das nennt man dan kooperatives Multitasking. Das kann man mit Timern 
lösen. Für den ersten, einfachen Ansatz kann man das aber auch mit 
kleinen Häppchen von wait_ms machen. Also anstatt wait_ms(1000) macht 
man eine Schleife mit 1000 mal wait_ms(1). In dieser Schleife zählt man 
eine Variable hoch. Ist sie 1000, lässt man die LED blinken 
(umschalten). In den 1000 Durchläufen kann man aber 1000 mal prüfen, ob 
der Temperatursensor ausgelesen werden muss. Damit "klemmt" nix, wenn 
die LED blinken soll.

MFG
Falk

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.