C. 2 Prozesse gleichzeitig. (uC)

  • Themenstarter Themenstarter Ev0luti0n
  • Beginndatum Beginndatum
E

Ev0luti0n

Guest
Hey Leute.
Ich bin seit ein paar Tagen an meinem neu erstandenem Experimentierboard dran und hab nach langem versuchen (drecks Freeware ;)) den Compiler zum Laufen gebracht.
Ich hab jetzt auch schon etwas mit den LED`s herumgespielt und bin auf ein Problem gestoßen. Ich wollte , dass "LED4" im 150ms-Takt toggelt , wohingegen die LED's 1-3 im 500ms Takt toggeln. (Diese können auch über DIP Schalter ausgeschaltet werden).
Das Problem : Die Prozesse laufen nicht gleichzeitig. Wie kann ich das Problem lösen (forken?).
Hier das Script:
Code:
#include "testoplatine.h" //kleine Header für Taktrate etc.
[S]//#include <math.h>[/S]
void main(void);
void pin3toggeln(void) {    // Das ist die Funktion für das Toggeln der
    if(1) {                    // LED3 am Pin3 von Port1.
        p1_3=1;
        waitms(150);
        p1_3=0;
        waitms(150);
        } } 
void pin02toggeln(void) {     //Die Funktion für das Toggeln der LED`s 1-3
        if(p1_6==1) {        //If ist für an- und ausschalten durch den
            p1_0=0;            //DIP-Schalter , welcher mit port 6 verbunden
            p1_1=1;            //ist.
            p1_2=0;
            [S]//p1_3=1;[/S]
            waitms(500);
            p1_0=1;
            p1_1=0;
            p1_2=1;
            [S]//p1_3=0;[/S]
            waitms(500);
        }
        else {                //Wenn der DIP-Schalter auf 0 ist , dann soll
            p1_0=1;            //alles ausgeschaltet werden.
            p1_1=1;
            p1_2=1;
            p1_3=1;
        }
}
void main(void)                //Main ist hoffentlich selbsterklärend ;)
{
    [S]//int a;[/S]
    
    init();                    //Initialisiert den uC.
    pd1=0x0F;                //Legt die pins 0-3(port1) als Ausgänge fest
    [S]//pd0=0x02;
    //p0_1=0;[/S]
    p1_6=1;                    //Spannung an dem Dip-Schalter.
    p1_0=1;                    //Spannung an LED1 (aus, weil pin0 Ausgang)
    p1_1=0;                    //Keine Spannung an LED2(an)
    p1_2=1;                    //siehe oben
    p1_3=0;
    [S]//p0_1=0;
    //a=analogwert(1);[/S]
    waitms(500);
    
    while(1) {
        pin3toggeln();        //Funktionen von oben sollten gleichzeitig
        pin02toggeln();        //ausgeführt werden. Hier liegt das
        [S]/*if(1) {            //Problem.
            p1_3=1;
            waitms(150);
            p1_3=0;
            waitms(150);
            }
        if(p1_6==1) {
            p1_0=0;
            p1_1=1;
            p1_2=0;
            //p1_3=1;
            waitms(500);
            p1_0=1;
            p1_1=0;
            p1_2=1;
            //p1_3=0;
            waitms(500);
        }
        else {
            p1_0=1;
            p1_1=1;
            p1_2=1;
            p1_3=1;
        }*/[/S]
        
    }
}

Bitte nicht flamen. Ich habe erst vor ein paar wenigen Tagen mit Programmieren angefangen.

LG Ev0luti0n
 
Zuletzt bearbeitet von einem Moderator:
das problem an dieser stelle ist, dass die gänigen microcontroller nur einen kern und einen thread haben ...

lösungsmöglichkeit:

timer & interrupt ... programmiere einen (hardware) timer, der einen interrupt auslösen kann ... die ISR(interrupt service routine / interrupt handler) sollte dann registerzustände und co sichern, und die register für einen anderen thread vorbereiten ... kurzum, du baust dir deine eigene kleine thread management umgebung

du kannst natürlich auch gleich die aufgaben von ISRs erledigen lassen die du regelmäßig per timer anspringen lässt ... in deinem beispiel: finde den größten gemeinsamen teiler deiner blink intervalle (hier 50ms) und lasse einen timer in diesem takt eine ISR auslösen ... die ISR zählt ihre aufrufe, und entscheidet anhand des zählerstands ob und welche LEDs umgeschaltet werden sollen ...

//edit

oder ganz platt ... spar dir den HW timer und lass deine hauptschleife zählen wie oft die 50 ms um sind ...
 
Zuletzt bearbeitet:
das problem an dieser stelle ist, dass die gänigen microcontroller nur einen kern und einen thread haben ...

lösungsmöglichkeit:

timer & interrupt ... programmiere einen (hardware) timer, der einen interrupt auslösen kann ... die ISR(interrupt service routine / interrupt handler) sollte dann registerzustände und co sichern, und die register für einen anderen thread vorbereiten ... kurzum, du baust dir deine eigene kleine thread management umgebung

du kannst natürlich auch gleich die aufgaben von ISRs erledigen lassen die du regelmäßig per timer anspringen lässt ... in deinem beispiel: finde den größten gemeinsamen teiler deiner blink intervalle (hier 50ms) und lasse einen timer in diesem takt eine ISR auslösen ... die ISR zählt ihre aufrufe, und entscheidet anhand des zählerstands ob und welche LEDs umgeschaltet werden sollen ...

//edit

oder ganz platt ... spar dir den HW timer und lass deine hauptschleife zählen wie oft die 50 ms um sind ...

An sich wurde die Antwort gegeben.
Aber zur Info: Gängige Sprachen für Mikrocontroller sind ASM bzw C und diese besitzen grundsätzlich keine Unterstützung für Multithreading. Auch auf PC Systemen (egal ob x86, x64, SPARC ...) kümmert sich das Betriebssystem um (Multi)Threading.
Jedes Betriebssystem bietet individuelle Schnittstellen um Threads zu erzeugen. Die Forkbomb ist ein absolutes Paradebeispiel ;)
 
Ähm. Ok wie lasse ich den Prozess für das Zählen gleichzeitig ablaufen :D. Das öffnet ein Problem in meinem Problem.
Könnte jemand ein Beispiel posten ?
 
Ähm. Ok wie lasse ich den Prozess für das Zählen gleichzeitig ablaufen :D. Das öffnet ein Problem in meinem Problem.
Könnte jemand ein Beispiel posten ?

Hä? Das hat GZ doch gar nich gesagt,
zählt ihre aufrufe, und entscheidet anhand des zählerstands ob und welche LEDs umgeschaltet werden sollen [...] lass deine hauptschleife zählen wie oft die 50 ms um sind ...
Also:
Du hast ne Hauptschleife, die 50 ms wartet und nen Zähler.
Wenn der Teiler vom Zähler durch 10 eine ganze Zahl ist, schaltest du die zweite LED um. Wenn der Teiler vom Zähler durch 3 eine ganze Zahl ist, schaltest du die erste LED um.
 
Hab mir alles nochmal durchgelesen und hab's auch kapiert. Funktioniert perfekt ;).
Also vielen Dank GrafZahl.
 
Zurück
Oben