PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : servoansteuerung mit ATTINY13



stupsi
23.02.2007, 15:33
ich hab einen servotester gebaut, der mit dem ATTINY13 arbeiten soll.
Über 2 potis sollen die Servos eingestellt werden. Dazu gehört dieses Programm. In den Fuse-Einstellungen ist der Teiler des Oszillators OFF.
Die LED blinkt mit ca 5 Hz, die Servos rühren sich aber nicht.

Vielleicht ist jemand so nett und schaut mal über das Programm, ob ein grober fehler drinne ist.

Besten Dank, Stupsi



'micro : ATTINY13
'Analogeingänge sind ADC2 und ADC3
'LED ist PB2
'Servo-anschlüsse sind PB0 und PB1
'-----------------------------------------------------------------------------------------
$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space

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

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Led Alias Portb.2

Config Adc = Single , Prescaler = Auto
Dim A As Word
Dim B As Word

Start Adc
Do
A = Getadc(2)
B = Getadc(3)
Servo(1) = A / 4
Servo(2) = B / 4
Toggle Led
Waitms 100
Loop


End

stupsi
23.02.2007, 18:25
ich hab die Werte für Servo(x) mal mit festen Werten geprüft... und das servo wird richtig angesteuert. daher liegt der Fehler im Auslesen des AD-Wandlers.
er soll ja Werte 0... 1024 auslesen. Die teile ich durch 4, um auf 0...255 zu kommen. Im Simulator geht beim Teilen etwas schief... aber was?

Mosi
23.02.2007, 18:31
Versuche, die Teilung in mehrere Schritte zu zerlegen:
So etwa:
A=Getadc
A=A/4
Servo=A
Bascom will oft keine Zuweisungen, die erst noch in der selben Zeile berechnet werden müssen.
Gruß, Rene

linux_80
23.02.2007, 18:46
Hallo,
Du kannst dir mal die Ausgabe des Compilers ansehen, welche Adresse die Variablen usw. haben, (Ctrl+W)
denn der T13 hat nur 64Byte SRAM, und Deine Werte für hw-/swstack, und frame sind zusammen schon grösser.
Weiss allerdings auch nicht immer wann frame angelegt wird. :-k
steht aber alles im Wiki.

stupsi
23.02.2007, 19:08
ja, besten Dank für die antworten. Die Berechnungen müssen einzeln durchgeführt werden. Die stack-definitionen werd ich mir noch mal reinziehen.

jetzt funktioniert das Programm. Das Ergebnis:


'-----------------------------------------------------------------------------------------
'name : tiny13_servo_joystick-1.bas
'copyright : (c) 2007,helvo
'purpose : Joystick-STEUERUNG einer Kamera mit 2 Servos
'micro : ATTINY13
'Analogeingänge sind ADC2 und ADC3
'LED ist PB2
'Servo-anschlüsse sind PB0 und PB1
'-----------------------------------------------------------------------------------------
$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 5
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Led Alias Portb.2

Dim A As Word
Dim B As Word
Dim I As Byte

Enable Interrupts
Start Adc

Do

A = Getadc(2) / 4
B = Getadc(3) / 4
Servo(1) = A
Servo(2) = B

Toggle Led
Waitms 20

Loop

End

Gruss Helmut

magic33
24.02.2007, 10:11
wieso wird der adc wert durch 6 geteilt durch 4 müsste doch den byte wert ergeben

stupsi
25.02.2007, 07:14
mit dem Teilerfaktor (hier 6) hab ich gleich die Mittelstellung des Servos durch Probieren eingestellt. Ein Wert von 5,8 wäre für die Mini-Servos von Conrad noch genauer.
Wieso das so ist, weiss ich nicht, aber es funktioniert so. Mittelstellung und Endausschlag stimmen.

Gruss Helmut

magic33
25.02.2007, 14:59
und wieviele zwischenwerte bekommst du dann wenn du die 10bit durch 6 teilst doch max 127

nicht die vollen 255

stupsi
25.02.2007, 19:21
mit dem Teiler 6 kommt man auf ca. 180.

magic, Besten Dank für deinen Einwand. Da hab ich doch mal ins manual geschaut und lieber doch mit den Reload-zeiten als mit dem Teiler gespielt.

Der Teiler 4 muss genommen werden und die Reload-Zeit auf 5 oder 6 runtergesetzt werden. dann passt es.

helmut