mikrocontroller.net

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


Autor: Leopold S. (leopold)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tobi W. (todward)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte es vielleicht in etwa so aussehen?
'--------------------------------------------------------------------------
'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

Const Startwert = 50
Const Endwert = 150

Do                         ' 2 Tage - 2 Minuten
   For L = 1 To 47         ' warte 47 Stunden
      GoSub Wait_Stunde
   Next
   For I = 1 To 58         ' und nochmals 58 Minuten
      Wait 60
   Next
   Servo(1) = Startwert    'Startposition einnehmen
   For Neue_position = Startwert To Endwert Step 20
      Servo(1) = Neue_position
      Waitms 300           ' 10 x 300 ms = 1.5 s   
   Next Position
   wait 117                ' nochmals 117 s warten => 2 Minuten
   For Neue_position = Endwert To Startwert Step -20
     Servo(1) = Neue_position
     Waitms 300            ' 10 x 300 ms = 1.5 s   
   Next I
Loop

Wait_tag:
   For I = 1 To 60
      Wait 60
   Next
Return

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur...
'--------------------------------------------------------------------------
'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
Dim Neue_position  As Word

Const Startwert = 50
Const Endwert = 150

Do                         ' 2 Tage - 2 Minuten
   For L = 1 To 47         ' warte 47 Stunden
      GoSub Wait_Stunde
   Next
   For I = 1 To 58         ' und nochmals 58 Minuten
      Wait 60
   Next
   Servo(1) = Startwert    'Startposition einnehmen
   For Neue_position = Startwert To Endwert Step 20
      Servo(1) = Neue_position
      Waitms 300           ' 10 x 300 ms = 1.5 s   
   Next Position
   wait 117                ' nochmals 117 s warten => 2 Minuten
   For Neue_position = Endwert To Startwert Step -20
     Servo(1) = Neue_position
     Waitms 300            ' 10 x 300 ms = 1.5 s   
   Next I
Loop

Wait_Stunde:
   For I = 1 To 60
      Wait 60
   Next
Return


Autor: Tobi W. (todward)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.