Lichtsteuerung pralelle Programme

OP (Firma: Mapi Modellbau) #4072092
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
Gast #4072103
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
#4072259
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.
Gast #4072455
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.