• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Servo mit ATtiny13 steuern

Es ist eigentlich nur eine Frage die mich interessiert aber wenn es gehen würde wäre es eine nette Spielerei.

Ich möchte gerene eine Servo mit einen ATtiny13 ansteuern es reicht mir dabei auch aus wenn ich ihn vom einen Endpunkt zum anderen fahren kann.
Geht das überhaupt?

Bei Bascom habe ich einen Code gefunden der extra für servos seien soll aber irgendwie bewegt sich mein servo null.

Der Code ist der hier:
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10

Config Portb = Output

Enable Interrupts

Servo(1) = 100
Servo(2) = 100
waitms 1000


Ich habe denn Tiny und denn servo mit 4,8 V versorgt und denn steurkabel vom servo auf einen der Ports vo
tiny gelegt aber da tut sich dann nicht...
Was mach ich falsch? Hat jemand von euch mit sowas Erfahrung???

Vielen dnak schon mal in vorraus netway
 

thomas_st

Geowizard
Netway schrieb:
Es ist eigentlich nur eine Frage die mich interessiert aber wenn es gehen würde wäre es eine nette Spielerei.

Ich möchte gerene eine Servo mit einen ATtiny13 ansteuern es reicht mir dabei auch aus wenn ich ihn vom einen Endpunkt zum anderen fahren kann.
Geht das überhaupt?
Sollte gehen - ein Servo wird mit einer PWM angesteuert (IIRC im 50 Hz Bereich) - das kann der Tiny erzeugen.

Netway schrieb:
Bei Bascom habe ich einen Code gefunden der extra für servos seien soll aber irgendwie bewegt sich mein servo null.
Hast Du die Möglichkeit Dir das Signal auf dem Steuerpin anzusehen (Oszi)? Dann sollten da alle 20 ms Impulse variabler Breite auftauchen.

Netway schrieb:
Der Code ist der hier:
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10

Config Portb = Output

Enable Interrupts

Servo(1) = 100
Servo(2) = 100
waitms 1000
Funktioniert das mit Bascom so oder fehlt da noch eine Endlosschleife am Ende?

Viele Grüße,
Thomas(_st)
 

Marcel123

Geocacher
Ich benutze bei einer Stage eines Nachtcaches von mir auch 2 Servos.
Bei deinem Code fehlt:
Definition des Chips, wirst du denke ich aber in deinem Script drin haben.
Do/Loop um die Servobedingung
Der Servo muss auf einem PWM fähigem Port liegen.

viel Spaß
Marcel
 
OP
KannNix und WeissNix
Marcel123 schrieb:
Ich benutze bei einer Stage eines Nachtcaches von mir auch 2 Servos.
Bei deinem Code fehlt:
Definition des Chips, wirst du denke ich aber in deinem Script drin haben.
Do/Loop um die Servobedingung
Der Servo muss auf einem PWM fähigem Port liegen.

viel Spaß
Marcel
Ok Definition hab ich do und Loop auch aber ein pwm fähiger Port??? Welche Ports sind den pwm fähig oder wie mache ich einen port pwm fähig??
 

thomas_st

Geowizard
Marcel123 schrieb:
Do/Loop um die Servobedingung
Der Servo muss auf einem PWM fähigem Port liegen.
Warum dieses Beides? Entweder ist es eine Software-PWM die mit der Do/Loop-Schleife realisiert wird - dann würde aber jeder Port funktionieren, oder eine Hardware-PWM, dann sollte sie aber auch ohne ständiges Neuladen der Position, diese halten können.

Nur wenn man die Position des Servos ständig ändern will, wäre beides nötig - der OP will aber eigentlich erstmal nur eine Position anfahren und dann halten.

Viele Grüße,
Thomas(_st)
 
OP
KannNix und WeissNix
Also aus irgendeinen Grund klappt das bei mir nicht der servo zuckt nur manchmal....

ich habe denn code so geschrieben:
$regfile = "ATtiny13.DAT"
$crystal = 113000
$hwstack = 6

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

Config Portb = Output

Enable Interrupts

Do
Servo(1) = 50
Waitms 3000
Servo(1) = 150
Waitms 3000
Loop

End

Eigentlich müsste der servo doch so von einer endstellung zur anderen springen alle 3 sec. oder???
oder ist da noch ein andere fehler?
bei der verkabelung kann man ja auch nicht alszuviel falschmachen den tiny genauso wie denn servo habe ich beiden 4,8V gegeben und denn steuerkabel vom servo habe ich auf pin 5 also portb.0 gelegt...

könnt ihr mir sagen was ich falsch gemacht habe????

vielen dank netway
 

stonewood

Geowizard
Hast Du schon überprüft wie der Tiny getaktet ist? Hoffentlich auf 128 Khz, ohne Teilung? Zumindest sollte das laut $crystal so sein.
 

thomas_st

Geowizard
stonewood schrieb:
Hast Du schon überprüft wie der Tiny getaktet ist? Hoffentlich auf 128 Khz, ohne Teilung? Zumindest sollte das laut $crystal so sein.
Ich will ja nicht nörgeln, aber dort steht 113000 und nicht 128000.

@OP: Es wäre mal einen Versuch wert, das zu korrigieren

Viele Grüße,
Thomas(_st)
 

BenniGotchi

Geonewbie
Die 113 vs. 128kHz kommen glaub' ich ganz gut hin.
Es heißt zwar immer, dass der Attiny13 einen 128kHz intern hat, aber wenn man das Datenblatt anschaut, läuft der in Wirklichkeit um einiges langsamer als mit 128kHz (Größenordnung 110-115kHz) ...

Der benutzte Ausgang muss wohl kein Timer-Ausgang sein, da laut Hilfe das Servos in Bascom bis zu 14 (oder waren's 16?) Servos unterstützt. Der Timer wird 'nur' benutzt, um einen internen Takt aufzubauen und in der ISR werden dann für alle Servos geschaut, ob der zugehörige Ausgang ein- oder ausgeschalten werden soll.

Was mir noch einfallen würde zu dem Thema - nachdem Du anscheinend kein Oszi zur Verfügung hast, könntest Du mal statt dem Servo eine LED mit entsprechendem Vorwiderstand an den Ausgang hängen. Dann solltest Du mit Deinem Testprogramm eigentlich sehen, dass die LED im 3s Rhythmus heller und dunkler leuchtet. Damit könntest Du schon mal die Clocksettings überprüfen.

Gruß
BenniGotchi
 
OP
KannNix und WeissNix
Ok was heust entsprechendem testprogram Wenn ich eine LED vorm Servo Klemme leuchtet sie ca jede Sekunde oder auch jede zweite sie geht aber immer an und aus und nicht wie du sagt's das sie heller aufleuchtet....
 

BenniGotchi

Geonewbie
Mit Testprogramm habe ich den Code gemeint, den Du als letztes gepostet hast. Darin wird ja jeweils nach 3sec zwischen 50 und 150 gewechselt. Und das sollte man an der LED als 3sec dunkel-leuchten, 3sec hell-leuchten usw sehen.

Aber ich glaube das Problem liegt an dem niedrigen Prozessortakt. Das Servomodul ist so konfiguriert, dass alle 10us ein Interrupt ausgelöst werden soll. mit 128kHz Clock, ist ein Clockcycle der CPU aber bereits 7,8us lang. D.h. das beißt sich total.

Probier' mal, den Tiny auf den internen 9,6MHz Clock umzukonfigurieren (und natürlich auch die Settings im Bascom) und schau mal, ob's damit dann funzt.

Gruß
BenniGotchi
 
OP
KannNix und WeissNix
BenniGotchi du bist mein Persönlicher HELD :gott: :gott: :gott: es klappt ganz super so!!!

aber jetzt hab ich noch ne andere frage wenn ich jetzt mit 9,6MHz arbeit und dann bei Bascom waitms 1000 eingebe ist das ja jetzt keine secunde mehr oder kann ich das auch noch irgendwie korigieren???
 

thomas_st

Geowizard
BenniGotchi schrieb:
Die 113 vs. 128kHz kommen glaub' ich ganz gut hin.
Es heißt zwar immer, dass der Attiny13 einen 128kHz intern hat, aber wenn man das Datenblatt anschaut, läuft der in Wirklichkeit um einiges langsamer als mit 128kHz (Größenordnung 110-115kHz) ...
Ok, da hast Du natürlich Recht - so spitzfindig war ich diesmal gar nicht. :p So gesehen ist die Verwendung des 9,6 MHz Takt sogar besser, weil IIRC dieser stabiler und genauer ist.

BenniGotchi schrieb:
Der benutzte Ausgang muss wohl kein Timer-Ausgang sein, da laut Hilfe das Servos in Bascom bis zu 14 (oder waren's 16?) Servos unterstützt.
Ok, diese Hilfe habe ich nicht, da ich kein Bascom nutze.


BenniGotchi schrieb:
Aber ich glaube das Problem liegt an dem niedrigen Prozessortakt. Das Servomodul ist so konfiguriert, dass alle 10us ein Interrupt ausgelöst werden soll. mit 128kHz Clock, ist ein Clockcycle der CPU aber bereits 7,8us lang. D.h. das beißt sich total.
Stehen die 10µs in der Hilfe zum Modul?

Dann werde ich wohl in Zukunft nicht mehr/kaum noch auf Bascom-Fragen antworten, da sie mit dem Datenblatt-Wissen nicht/kaum zu beantworten sind.

Aber meckern muss ich dann doch noch: das könnte ein Compiler aber auch mitbekommen: er muss ja den Wert, bei dem der Timer einen IRQ auslösen soll, berechnen. Wenn dieser nahe 1 liegt, sollte eigentlich klar sein, dass es Probleme gibt - dann könnte man zumindest eine Warnung auswerfen.

Viele Grüße,
Thomas(_st) - schön dass es funktioniert
 

stonewood

Geowizard
Netway schrieb:
aber jetzt hab ich noch ne andere frage wenn ich jetzt mit 9,6MHz arbeit und dann bei Bascom waitms 1000 eingebe ist das ja jetzt keine secunde mehr oder kann ich das auch noch irgendwie korigieren???
Genau dafür ist die $crystal-Zeile da. Daran errechnet Bascom wieviele Takte beim waitms gewartet werden soll, und das muß mit dem realen Takt des Tiny übereinstimmen.

Kurzes Testprogramm: LED an einen Portpin, einschalten, per waitms 10000 10 sekunden warten, LED ausschalten. Und dabei mit einer Stoppuhr nachprüfen ob das auch wirklich 10 Sekunden sind.
 
OP
KannNix und WeissNix
Also ich muss echt mal sagen ich kenne glaube ich kein Forum wo jemanden so gut und schnell geholfen wird wie hier von der angenehm freundlichen Stimmung ganz abgesehen.


Aber ich hab da noch ein Problem ich mochte das der servo eine bestimmte Position einnimmt wenn ich einen Taster drücke aber wenn ich schreibe
If pinb.3 = 0 then
Servo(1) = 55
Else
Servo(1) = 235
End if
Klappt das nicht dann zuckt er wieder...

Woran liegt das denn???
 

thomas_st

Geowizard
Netway schrieb:
Aber ich hab da noch ein Problem ich mochte das der servo eine bestimmte Position einnimmt wenn ich einen Taster drücke aber wenn ich schreibe
If pinb.3 = 0 then
Servo(1) = 55
Else
Servo(1) = 235
End if
Klappt das nicht dann zuckt er wieder...
Du schreibst "zuckt wieder". Wie äußert sich das: fährt er die neue Position an und zuckt dann um diese herum?
Da könnte ich mir zwei Gründe vorstellen: 1.) Störungen auf der Leitung (kürzen, Stromversorgung abblocken (Keramik- oder Folienkondensator im nF-Bereich zwischen Vcc und GND / bitte nicht die Signalleitung abblocken ;) ) 2.) der Tiny erzeugt kein 100% stabiles PWM-Signal (sofern noch möglich: Takt erhöhen / Was für einen Takt hast Du: 9,6 MHz mit oder ohne CKDIV8-Fuse ?)

... oder fährt der Servo die neue Position nicht mehr an? Da könnte [! Spekulation bzgl. Bascom] der Wertebereich des Servomoduls überschritten sein [/Spekulation]

Achso: wie sieht Dein Aufbau am Taster aus? Einfach nur ein Taster zwischen Pin und Vcc? Dann bitte noch ein Widerstand im kOhm-Bereich (ist nicht kritisch, ich würde 100k nehmen) zwischen Pin und GND. ... oder den Taster zwischen Pin und GND und den Internen Pull-Up-Widerstand im Tiny aktivieren.

HTH,
Thomas(_st)
 
OP
KannNix und WeissNix
Ok stimmt ich habe das Problem ein bischen ungenau beschieben.... Schuldigung.
der Takt ist 9,6MHz ohne CKDIV8-Fuse.
Der Servo geht in eine feste stellung und sobalt ich den Taster drücke will der Servo in die andere stellung bewegt sichauch geht dann aber wieder ein stück zurück und dann wieder ein stück vorwärts als ob ich denn schalter ganz oft drücken und loslassen würde....
Er ereicht aber nie die zweite Stellung sobalt ich loslasse geht er dann mehr oder weniger schnell in die Ausgangssitutation.
Ich habe keinen kondensator drin werde ich aber jetzt mal mit ausprobieren.

Denn Wertebereich des Servos habe ich vorher ausprobiert, wenn ich
Do
Servo(1) = 55
waitms 3000
Servo(1) = 235
waitms 3000
loop
schreibe fährt er von einen endpunkt zum anderen ohne irgenwelche Probleme und das genau alle drei Sekunden.

Als Taster benutze ich, ja schande über mich :p nur einen Taster auch da werde ich mal einen Wiederstand einbauen so das ich dann einen Taster mit Wiederstand zwischen pin und GND habe.

Wenn ich mit denn Veränderungen fertig bin melde ich mich nocheinmal.

Vielen Dank für die Hilfe schonmal...

Aber der IF befehl so sollte doch klappen oder???
 
Oben