Hallo! Könnte ein Bascom-Servo Exxperte diesen Bascom-Code ansehen? Ich möchte mit einem Attiny13 ein Servo jeden 2. Tag für 2 min auf Endausschlag bringen?! merci leopold Mein BascomProgramm: '----------------------------------------------------------------------- ------- 'name : WAIT SAMPLE 'micro : Tiny13 '----------------------------------------------------------------------- ------- $regfile = "ATtiny13.dat" $crystal = 1000000 $baud = 19200 $hwstack = 32 $swstack = 8 $framesize = 24 Enable Interrupts Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 Dim I As Word Dim K As Word Dim L As Word Do ' 2 Tage warten PortB2 für 2 min high, For L = 1 To 2 GoSub Wait_tag Next Const Startwert = 50 Const Endwert = 150 'Startposition einnehmen Servo(1) = Startwert Do For Neue_position = Startwert To Endwert Step 20 Servo(1) = Neue_position Waitms 300 Next Position For Neue_position = Endwert To Startwert Step -20 Servo(1) = Neue_position Waitms 300 Next I Loop Wait_tag: For I = 1 To 24 Wait 3600 Next Return
Naja, ich denke das Program macht nicht, das was Du möchtest (wo sind z.B. die 2 Minuten?) aber wozu konkret hast nun eine Frage bzw. Probleme?
Moin, Mal abgesehen davon, dass der code total ineffizient ist, sollte er prinzipiel funktionieren. Aber ein paar Fehler sind trotzdem drin, die müsste dir der Compiler aber unten anzeigen, wenn es versucht zu compilieren. 1) 2x Do aber nur einmal Loop 2) Die Variable Neue_position ist oben nicht erstellt Ich würde entweder mit einem DCF-77 modul arbeiten oder einen Timer so einstellen, dass er dir jede Sekunde einen Interrupt liefert. In der ISR eine Variable um 1 erhöhen, ist diese bei 3600 angelangt, eine andere erhöhen. Sollte diese bei 24 angelangt ein, überprüfen ob ein MArker gesetzt ist. Wenn ja, den servo stellen, den marker zurück setzen und alle beginnt von vorne. Wenn nein, den marker setzten und das gleiche spiel beginnt. Um Strom zu sparen, würde ich einen Portpin opfern und einen Transistor damit schalten um den Servo aus zu schalten, wenn er nicht gebraucht wird. das setzt natürlich vorraus, dass der serco in ruhelage nicht belastet ist. Gruß Tobias
Sollte es vielleicht in etwa so aussehen?
1 | '-------------------------------------------------------------------------- |
2 | 'name : WAIT SAMPLE |
3 | 'micro : Tiny13 |
4 | '-------------------------------------------------------------------------- |
5 | $regfile = "ATtiny13.dat" |
6 | $crystal = 1000000 |
7 | $baud = 19200 |
8 | $hwstack = 32 |
9 | $swstack = 8 |
10 | $framesize = 24 |
11 | Enable Interrupts |
12 | |
13 | Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 |
14 | |
15 | Dim I As Word |
16 | Dim K As Word |
17 | Dim L As Word |
18 | |
19 | Const Startwert = 50 |
20 | Const Endwert = 150 |
21 | |
22 | Do ' 2 Tage - 2 Minuten |
23 | For L = 1 To 47 ' warte 47 Stunden |
24 | GoSub Wait_Stunde |
25 | Next |
26 | For I = 1 To 58 ' und nochmals 58 Minuten |
27 | Wait 60 |
28 | Next |
29 | Servo(1) = Startwert 'Startposition einnehmen |
30 | For Neue_position = Startwert To Endwert Step 20 |
31 | Servo(1) = Neue_position |
32 | Waitms 300 ' 10 x 300 ms = 1.5 s |
33 | Next Position |
34 | wait 117 ' nochmals 117 s warten => 2 Minuten |
35 | For Neue_position = Endwert To Startwert Step -20 |
36 | Servo(1) = Neue_position |
37 | Waitms 300 ' 10 x 300 ms = 1.5 s |
38 | Next I |
39 | Loop |
40 | |
41 | Wait_tag: |
42 | For I = 1 To 60 |
43 | Wait 60 |
44 | Next |
45 | Return |
Korrektur...
1 | '-------------------------------------------------------------------------- |
2 | 'name : WAIT SAMPLE |
3 | 'micro : Tiny13 |
4 | '-------------------------------------------------------------------------- |
5 | $regfile = "ATtiny13.dat" |
6 | $crystal = 1000000 |
7 | $baud = 19200 |
8 | $hwstack = 32 |
9 | $swstack = 8 |
10 | $framesize = 24 |
11 | Enable Interrupts |
12 | |
13 | Config Servos = 1 , Servo1 = Portb.0 , Reload = 10 |
14 | |
15 | Dim I As Word |
16 | Dim K As Word |
17 | Dim L As Word |
18 | Dim Neue_position As Word |
19 | |
20 | Const Startwert = 50 |
21 | Const Endwert = 150 |
22 | |
23 | Do ' 2 Tage - 2 Minuten |
24 | For L = 1 To 47 ' warte 47 Stunden |
25 | GoSub Wait_Stunde |
26 | Next |
27 | For I = 1 To 58 ' und nochmals 58 Minuten |
28 | Wait 60 |
29 | Next |
30 | Servo(1) = Startwert 'Startposition einnehmen |
31 | For Neue_position = Startwert To Endwert Step 20 |
32 | Servo(1) = Neue_position |
33 | Waitms 300 ' 10 x 300 ms = 1.5 s |
34 | Next Position |
35 | wait 117 ' nochmals 117 s warten => 2 Minuten |
36 | For Neue_position = Endwert To Startwert Step -20 |
37 | Servo(1) = Neue_position |
38 | Waitms 300 ' 10 x 300 ms = 1.5 s |
39 | Next I |
40 | Loop |
41 | |
42 | Wait_Stunde: |
43 | For I = 1 To 60 |
44 | Wait 60 |
45 | Next |
46 | Return |
Schreib dir erstmal auf, was das Programm machen soll. Wenn du das gemacht hast, kannst du es programmieren. ABER vorher solltest du dir das hier zu gemüte führen und auch verstehen. -> http://www.rn-wissen.de/index.php/Bascom_und_Timer Damit lässt sich das viel eleganter, effizienter und resourcen schonender machen. Hier mal ein paar denk anstöße 1) Warten bis der Interrupt kommt 2) In die ISR springen 3) Sekunden um 1 erhöhen 4) Prüfen ob 3600 Sekunden erreicht sind -> JA: Stunden um 1 erhöhen, Sekunden auf 0 setzen -> NEIN: Nichts tun 5) Prüfen ob 24 Stunden erreicht sind -> JA: Prüfen ob ein Merker gesetzt wurde -> JA: Servo Stellen, 2 Minuten warten(?), Merker zurücksetzen, Servo in ruhestellung -> NEIN: Merker setzen -> NEIN: Nichts tun Das sollte es doch sein oder? Gruß Tobias
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.