Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

C. 2 Prozesse gleichzeitig. (uC)

Diskussion: C. 2 Prozesse gleichzeitig. (uC) im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hey Leute. Ich bin seit ein paar Tagen an meinem neu erstandenem Experimentierboard dran und hab nach langem versuchen ...

Antwort
Alt 06.03.11, 22:16   #1 (permalink)
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard C. 2 Prozesse gleichzeitig. (uC)

Anzeige

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:

Script   

Code:
#include "testoplatine.h" //kleine Header für Taktrate etc.

//#include <math.h>
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;
            
//p1_3=1;
            waitms(500);
            p1_0=1;
            p1_1=0;
            p1_2=1;
            
//p1_3=0;
            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 ;)
{
    
//int a;
    
    init();                    //Initialisiert den uC.
    pd1=0x0F;                //Legt die pins 0-3(port1) als Ausgänge fest
    
//pd0=0x02;
    //p0_1=0;
    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;
    
//p0_1=0;
    //a=analogwert(1);
    waitms(500);
    
    while(1) {
        pin3toggeln();        //Funktionen von oben sollten gleichzeitig
        pin02toggeln();        //ausgeführt werden. Hier liegt das
        
/*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;
        }*/
        
    }
}


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

LG Ev0luti0n

Geändert von CDW (07.03.11 um 14:00 Uhr) Grund: Code-Tags können auch im Spoiler stehen ;)
Ev0luti0n ist offline   Mit Zitat antworten
Alt 06.03.11, 22:29   #2 (permalink)
Senior Member
 
Registriert seit: 13.07.08
enkore Leistung: K 6-3enkore Leistung: K 6-3enkore Leistung: K 6-3
Likes: 85
Standard

Ganz klarer Fall für: http://www.mikrocontroller.net/forum...ler-elektronik
__________________
"It is the human race! The deterioration of the spirit of man. Man undermining himself, causing a self-willed, self-imposed, self-evident self-destruction."
+++ BREAKING +++ Troll ertrinkt im Planschbecken +++
enkore ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 07.03.11, 01:39   #3 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 210
Standard

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 ...
__________________
Code:
:(){ :|:& };:
Veritas Aequitas

Geändert von GrafZahl (07.03.11 um 01:41 Uhr)
GrafZahl ist offline   Mit Zitat antworten
Alt 07.03.11, 03:52   #4 (permalink)
 
Benutzerbild von blue182
 
Registriert seit: 21.08.10
blue182 Leistung: Facit NTK
Likes: 10
Standard

Zitat:
Zitat von GrafZahl Beitrag anzeigen
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
blue182 ist offline   Mit Zitat antworten
Alt 07.03.11, 14:52   #5 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

Ähm. Ok wie lasse ich den Prozess für das Zählen gleichzeitig ablaufen . Das öffnet ein Problem in meinem Problem.
Könnte jemand ein Beispiel posten ?
Ev0luti0n ist offline   Mit Zitat antworten
Alt 07.03.11, 16:08   #6 (permalink)
Senior Member
 
Registriert seit: 13.07.08
enkore Leistung: K 6-3enkore Leistung: K 6-3enkore Leistung: K 6-3
Likes: 85
Standard

Zitat:
Zitat von Ev0luti0n Beitrag anzeigen
Ähm. Ok wie lasse ich den Prozess für das Zählen gleichzeitig ablaufen . Das öffnet ein Problem in meinem Problem.
Könnte jemand ein Beispiel posten ?
Hä? Das hat GZ doch gar nich gesagt,
Zitat:
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.
__________________
"It is the human race! The deterioration of the spirit of man. Man undermining himself, causing a self-willed, self-imposed, self-evident self-destruction."
+++ BREAKING +++ Troll ertrinkt im Planschbecken +++
enkore ist offline   Mit Zitat antworten
Alt 09.03.11, 18:37   #7 (permalink)
Themenstarter
 
Registriert seit: 06.03.11
Ev0luti0n Leistung: Facit NTK
Likes: 0
Standard

Hab mir alles nochmal durchgelesen und hab's auch kapiert. Funktioniert perfekt .
Also vielen Dank GrafZahl.
Ev0luti0n ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » C. 2 Prozesse gleichzeitig. (uC)
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61