Forum: Mikrocontroller und Digitale Elektronik Lichtsteuerung pralelle Programme


von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

Hallo an alle,

ich habe folgendes Problem...
Die folgenden Programmzeile sind so problemlos lauffähig.
Die Zeile werden immer von oben nach unten abgearbeitet.
Jetzt möchte ich aber das während des Ablauf dieser Zeilen
Prarell zu den LED 1 un 2 zb. die Ausgänge 3 und 4 in einem anderem
Muster oder Geschwindigkeit abgearbeitet werden... wie mache ich dies. 
Ist dies überhaupt möglich?

LG Marcel


$regfile = "attiny24.dat"
$crystal = 80000
Config Porta = Output
$swstack = 10
Dim Zaehler As Word

Led1 Alias Porta.0
Led2 Alias Porta.1
Led3 Alias Porta.2
Led4 Alias Porta.3
Led5 Alias Porta.4
Led6 Alias Porta.5
Led7 Alias Porta.6
Led8 Alias Porta.7


Do

 for  Zaehler = 1 to 10
   Led1 = 1
   Wait 1
   Led2 = 1
   Wait 1


   Led1 = 0
   Wait 1
   Led2 = 0
   Wait 1

 next Zaehler

 for  Zaehler = 1 to 10
   ' hier wieder was neues, usw. usw.
 next Zaehler


Loop

End

von Thomas D. (thomasderbastler)


Lesenswert?

Ich würde die Muster einfach in eine Tabelle schreiben..und keine Waits 
verwenden.

von Sven (Gast)


Lesenswert?

Klaar geht das nach dem Prinzip Multitasking.

Do

  'Aufgabe 1
  Incr Zeit1
  if zeit1 > xxx Then
  Incr aufgabe1
  Select Case aufgabe1
    case 1
      Led
    Case 2
      Led
...
    Case 6
      Aufgabe1 = 0
   End Select
   zeit1 = 0


  'Aufgabe 2
  Incr Zeit2
  if zeit2 > xxx Then
  Incr aufgabe2
  Select Case aufgabe2
    case 1
      Led
    Case 2
      Led
...
    Case 6
      Aufgabe2 = 0
   End Select
   zeit2 = 0
Loop


So in der Art

von obstacle (Gast)


Lesenswert?

Is ja pralle.

von Falk B. (falk)


Lesenswert?

Siehe Multitasking, das geht auch in BASCOM.

von Thomas D. (thomasderbastler)


Lesenswert?

Falk Brunner schrieb:
> Siehe Multitasking, das geht auch in BASCOM.

Du glaubst wohl, daß Dein Link den TO helfen wird ? Wenn so eine 
Aufgabenstellung schon mal problematisch für ihn ist, dann Deine Hilfe, 
was reines C ist...naja..

von Falk B. (falk)


Lesenswert?

@Thomas der Bastler (thomasderbastler)

>Du glaubst wohl, daß Dein Link den TO helfen wird ?

Ich hoffe es.

>Wenn so eine
>Aufgabenstellung schon mal problematisch für ihn ist, dann Deine Hilfe,
>was reines C ist...naja..

Ersten gibt es dort auch normalen Text, den auch BASCOMer verstehen. 2. 
Ist das C, das in den Beispielen verwendet wird, SEHR einfach. Da hab 
ich auch die Hoffnung, dass ein gewillter BASCOMer das versteht und dann 
in BASCOM anwenden kann.

von oldmax (Gast)


Lesenswert?

Hi
Um noch ein wenig weiter zu verwirren, wäre jetzt noch Assembler ( das 
kann ich..) möglich. Aber in einem Punkt gebe ich Falk recht; es kommt 
nicht auf die Sprache, sondern auf das Verständnis, wie ein Controller 
arbeitet, an. Ein Wait ist in vielen Fällen einfach nur eine sinnlose 
kleine Programmschleife, die den Prozessor aufhält.
Und leider fehlt dieses Verständnis nicht selten auch den Lehrern, die 
ihren Schülern gern mal etwas "modernes" beibringen wollen. Manche 
kommen von der PC Programmierung und glauben, einen Controller 
gleichsetzen zu können. Da werden unzähliche Codezeilen geschrieben, 
ohne auf verfügbaren Speicher zu achten. Oft genug waren hier Beispiele 
von dynamischer Speicherbelegung und den Berichten, das Programme auf 
unerklärliche Weise Blödsinn veranstalten. Das sind halt so die kleinen 
Nebensächlichkeiten, die eine Hochsprache so mit sich bringt. In 
Assembler, ohne es zu favorisieren, fallen solche Fehler halt etwas 
besser auf. Wenn ein Programm zeit verplempert, wird da sehr schnel 
ersichtlich, warum nichts anderes mehr erledigt wird..
1
  Wait:
2
     LDS r16, zaehler1     ; Variable Innere Schleife Laden 2 Takte
3
     INC r16               ; erhöhen                        1 Takt
4
     STS zaehler1, r16     ; wieder ablegen                 2 Takte
5
     CPI r16, 200          ; Vergleich  200 durchläüfe      1 Takt
6
     BRLO Wait             ; kleiner 200 2 takte , sonst    1 Takt
7
     CLR r16               ; zaehler innen auf 0            1 Takt  
8
; Innere Sschleife 9 Takte 
9
; Bei 200 Durchläufen und 8 MHz 9*125 ns *200=225 µs
10
     STS  zaehler1, r16    ; wieder ablegen                 2 Takte  
11
     LDS  r16, zaehler2    ; zaehler Außenschleife laden    2 Takte
12
     INC  r16              ; erhöhen                        1 Takt
13
     STS  zaehler2, r16    ; ablegen                        2 Takte
14
     CPI  r16, 100         ; 100  mal durchlaufen?          1
15
     BRLO Wait             ; nein, dann nochmal von vorn    2/1
16
; 10 Takte Außenschleife = 1,25 µs
17
Gesamtzeit = (225 µs +1,25 µs) *100 =  22,65 ms 
18
     CLR r16               ; r16 auf 0                      1
19
     STS  zaehler2, r16    ; Schleifenzähler außen auf 0    2
20
21
   RET
22
23
   .....
24
   RCALL Wait
25
   .....

 Hinzu kommen noch ein paar Takte für den Aufruf und die Aktualisierung 
vom Außenzähler. Das ergibt im Endeffekt eine berechenbare 
Zeitverzögerung. Aber es ist auch ersichtlich, das der Controller keine 
andere Aufgabe übernehmen kann, da er mit seinen SChleifen beschäftigt 
ist. Will man da raus, muss es über Timer und Interrupt abgearbeitet 
werden. Nur ein Interrupt kann den Controller aus seiner Bahn holen, 
einen kleinen Job zwischenschieben und dann zum Programm zurückkehren. 
Wie gesagt, auch mit einer Hochsprache lösbar, aber eben nicht mit 
Warteschleifen, sondern immer mit einem Timer Interrupt.
Gruß oldmax

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.