PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ( Bascom ) Servo ansteuern und danach Impuls ausschalten



Sven Löffler
06.04.2013, 13:54
Hallo zusammen,

ich habe ein großes Problem und finde einfach keine Lösung dazu. Ich möchte mit einem Tiny13 einen Servo ansteuern. Es gibt 2 Stellungen - auf und zu. Diese werden durch 2 Taster angefahren. Nun soll es aber so sein, dass wenn das Servo die Position erreicht hat, das Servo Signal weg sein soll, damit es nicht brummt.

Ich habe mir überlegt, es mit Enable und Disable Interrupts zu machen. Nach dem ersten Einschalten funktioniert das auch einwandfrei. Das Servo fährt in die Position ( hier 66 ) und ich kann es von Hand bewegen. Sobald ich jedoch die Abfrage der Taster einbaue, funktioniert das Ausschalten des Servo Signals nicht mehr. Das Servo Signal ist IMMER da. Ich weiß bald nicht mehr weiter .... :( Es muss noch eine möglichkeit geben, das Signal mittels Software auszuschalten.

Vielen Dank im Voraus !!! ;)



'************************************************* ************************************************
'* *
'* Servo Tiny Kieswerk *
'* *
'* Controller ist ein Tiny13 *
'* *
'************************************************* ************************************************

$regfile = "Attiny13.dat" ' Controller ist ein Tiny13
$crystal = 4800000 ' 4,8 Mhz Takt

$hwstack = 10
$framesize = 10
$swstack = 20

Config Pinb.0 = Input ' Ein- / Ausgänge definieren
Config Pinb.1 = Input
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output

Taster_zu Alias Pinb.0
Taster_auf Alias Pinb.1
Gruen Alias Portb.3
Rot Alias Portb.4

Enable Interrupts


Config Servos = 1 , Servo1 = Portb.2 , Reload = 10

Portb.0 = 1 ' Interne Pullups ein
Portb.1 = 1
Portb.3 = 1

' Werte von 40 - 75 = 90° Drehung


Servo(1) = 66
Gruen = 0

Waitms 100

Disable Interrupts


Taster_abfrage_zu:
Do
If Taster_auf = 0 Then
Enable Interrupts
Servo(1) = 66
Rot = 1
Gruen = 0
Waitms 100
Disable Interrupts
Else
Goto Taster_abfrage_auf
End If

Loop


Taster_abfrage_auf:
Do
If Taster_zu = 0 Then
Enable Interrupts
Servo(1) = 95
Rot = 0
Gruen = 1
Waitms 100
Disable Interrupts
Else
Goto Taster_abfrage_zu
End If
Loop

End

HeXPloreR
06.04.2013, 16:54
Hallo Sven,

ja, soweit wie ich das sehe... wäre es doch gut wenn man einfach sagt: "PortB.2 = 0 wenn tasterX gedrückt" oder PortB.2 als Eingang umschalten < sollte ja kein Strom/Puls vom Servo zurück kommen. Übernehme keine Gewähr.

Sonst könnte man auch die Stromversorgung selbst trennen...aber das ist immer unsauber, weil es dann bei einschalten Pulsspitzen geben kann wobei der Servo unkontrolliert zuckt.

Ein Problem sehe ich: Es ist auf den ersten Blick nicht günstig Interrups und waits gleichzeitig auch zu benutzen.
Vorallem da die Interrups hier wohl nur für die Steuerung des Servos vorgesehen sind.

Den Programmablauf würde ich grundsätzlich nochmal überdenken. Das geht sehr viel übersichtlicher anstatt mit "if-else" mit "if-elseif-else" - und dann ohne Goto und ohne den 2.loop.

Du könntest auch einfach mit "Pulsout" auf PortB.2 arbeiten... dann wäre die Neutralstellung etwa 1500 (+- 450). Das ist aber auch abhängig vom der Crystalfrequenz > könnte man ausprobieren ;)

Sauerbruch
07.04.2013, 23:12
Ich habe Deinen Code mal in einen ATMega8 gebrannt (da ich gerade keinen Tiny13 da habe), mit minimalen Änderungen: Erstens habe ich das ganze mit einem Takt von 8 MHz laufen lassen, und zweitens die Wait-Phase auf 1000 ms verlängert (damit man das Signal auf dem Oszi etwas länger sehen kann) - und es funktioniert einwandfrei!


Das Servo Signal ist IMMER da.

Woran machst Du das denn fest - hast Du Dir das Signal auf einem Oszi angesehen?