Servo nach 2 Tagen 2 Minuten in Endposition

OP #2081330
Lesenswert?

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
Angehängte Dateien:
#2081343
Lesenswert?

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
Gast #2081345
Lesenswert?

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
Gast #2081347
Lesenswert?

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
#2081367
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren