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
Ich würde die Muster einfach in eine Tabelle schreiben..und keine Waits verwenden.
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
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..
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.