Forum: Mikrocontroller und Digitale Elektronik Servo nach 2 Tagen 2 Minuten in Endposition


von Leopold S. (leopold)


Angehängte Dateien:

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

von peter (Gast)


Lesenswert?

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?

von Tobi W. (todward)


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

von peter (Gast)


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

von peter (Gast)


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

von Tobi W. (todward)


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

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.