PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom- Atmega 8- Analoge Eingänge zum steuern eines Servos



rocketman123
27.01.2008, 14:12
Hallo,

ich hab gerade zwei servos bekommen und möchte einen kleinen Roboterarm basteln. ich hab jetzt ein Programm geschrieben mit dem ich die Position der Arme mit dem Poti über den analogeingang des atmega8 steuern kann.
leider bringt mir bascom eine Fehlermeldung. weiss jemand eine lösung???
Wenn ich die hälfte des Programms des zweiten servos lösche funktionierts.
Gibts da ne andere möglichkeit sowas zu programmieren

AD1 erster Servo, AD zweiter Servo
Unterteilung der 180° in ca.5°


$regfile "m8def.dat"

$crystal = 1000000

Dim Ad As Word
Dim Ad1 As Word

Config Portb = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc

Do
Ad1 = Getadc(1)
If Ad1 <= 32 Then
Portb.1 = 1
Waitus 600
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 32 And Ad1 <= 64 Then
PortB.1 = 1
Waitus 656
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 64 And Ad1 <= 96 Then
PortB.1 = 1
Waitus 712
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 96 And Ad1 <= 128 Then
PortB.1 = 1
Waitus 768
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 128 And Ad1 <= 160 Then
PortB.1 = 1
Waitus 824
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 160 And Ad1 <= 192 Then
PortB.1 = 1
Waitus 880
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 192 And Ad1 <= 224 Then
PortB.1 = 1
Waitus 936
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 224 And Ad1 <= 256 Then
PortB.1 = 1
Waitus 992
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 256 And Ad1 <= 288 Then
PortB.1 = 1
Waitus 1048
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 288 And Ad1 <= 320 Then
PortB.1 = 1
Waitus 1104
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 320 And Ad1 <= 352 Then
PortB.1 = 1
Waitus 1160
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 352 And Ad1 <= 384 Then
PortB.1 = 1
Waitus 1216
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 384 And Ad1 <= 416 Then
PortB.1 = 1
Waitus 1272
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 416 And Ad1 <= 448 Then
PortB.1 = 1
Waitus 1328
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 448 And Ad1 <= 480 Then
PortB.1 = 1
Waitus 1384
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 480 And Ad1 <= 512 Then
PortB.1 = 1
Waitus 1440
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 512 And Ad1 <= 544 Then
PortB.1 = 1
Waitus 1496
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 544 And Ad1 <= 576 Then
PortB.1 = 1
Waitus 1552
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 576 And Ad1 <= 608 Then
PortB.1 = 1
Waitus 1608
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 608 And Ad1 <= 640 Then
PortB.1 = 1
Waitus 1664
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 640 And Ad1 <= 672 Then
PortB.1 = 1
Waitus 1720
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 672 And Ad1 <= 704 Then
PortB.1 = 1
Waitus 1776
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 704 And Ad1 <= 736 Then
PortB.1 = 1
Waitus 1832
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 736 And Ad1 <= 768 Then
PortB.1 = 1
Waitus 1888
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 768 And Ad1 <= 800 Then
PortB.1 = 1
Waitus 1944
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 800 And Ad1 <= 832 Then
PortB.1 = 1
Waitus 2000
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 832 And Ad1 <= 864 Then
PortB.1 = 1
Waitus 2056
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 864 And Ad1 <= 896 Then
PortB.1 = 1
Waitus 2168
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 896 And Ad1 <= 928 Then
PortB.1 = 1
Waitus 2224
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 928 And Ad1 <= 960 Then
PortB.1 = 1
Waitus 2280
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 960 And Ad1 <= 992 Then
PortB.1 = 1
Waitus 2336
PortB.1 = 0
Waitus 20000
Elseif Ad1 > 992 And Ad1 <= 1024 Then
PortB.1 = 1
Waitus 2392
PortB.1 = 0
Waitus 20000
End If

Ad = Getadc(0)
If Ad <= 32 Then
Portb.2 = 1
Waitus 600
Portb.2 = 0
Waitus 20000
Elseif Ad > 32 And Ad <= 64 Then
Portb.2 = 1
Waitus 656
Portb.2 = 0
Waitus 20000
Elseif Ad > 64 And Ad <= 96 Then
Portb.2 = 1
Waitus 712
Portb.2 = 0
Waitus 20000
Elseif Ad > 96 And Ad <= 128 Then
Portb.2 = 1
Waitus 768
Portb.2 = 0
Waitus 20000
Elseif Ad > 128 And Ad <= 160 Then
Portb.2 = 1
Waitus 824
Portb.2 = 0
Waitus 20000
Elseif Ad > 160 And Ad <= 192 Then
Portb.2 = 1
Waitus 880
Portb.2 = 0
Waitus 20000
Elseif Ad > 192 And Ad <= 224 Then
Portb.2 = 1
Waitus 936
Portb.2 = 0
Waitus 20000
Elseif Ad > 224 And Ad <= 256 Then
Portb.2 = 1
Waitus 992
Portb.2 = 0
Waitus 20000
Elseif Ad > 256 And Ad <= 288 Then
Portb.2 = 1
Waitus 1048
Portb.2 = 0
Waitus 20000
Elseif Ad > 288 And Ad <= 320 Then
Portb.2 = 1
Waitus 1104
Portb.2 = 0
Waitus 20000
Elseif Ad > 320 And Ad <= 352 Then
Portb.2 = 1
Waitus 1160
Portb.2 = 0
Waitus 20000
Elseif Ad > 352 And Ad <= 384 Then
Portb.2 = 1
Waitus 1216
Portb.2 = 0
Waitus 20000
Elseif Ad > 384 And Ad <= 416 Then
Portb.2 = 1
Waitus 1272
Portb.2 = 0
Waitus 20000
Elseif Ad > 416 And Ad <= 448 Then
Portb.2 = 1
Waitus 1328
Portb.2 = 0
Waitus 20000
Elseif Ad > 448 And Ad <= 480 Then
Portb.2 = 1
Waitus 1384
Portb.2 = 0
Waitus 20000
Elseif Ad > 480 And Ad <= 512 Then
Portb.2 = 1
Waitus 1440
Portb.2 = 0
Waitus 20000
Elseif Ad > 512 And Ad <= 544 Then
Portb.2 = 1
Waitus 1496
Portb.2 = 0
Waitus 20000
Elseif Ad > 544 And Ad <= 576 Then
Portb.2 = 1
Waitus 1552
Portb.2 = 0
Waitus 20000
Elseif Ad > 576 And Ad <= 608 Then
Portb.2 = 1
Waitus 1608
Portb.2 = 0
Waitus 20000
Elseif Ad > 608 And Ad <= 640 Then
Portb.2 = 1
Waitus 1664
Portb.2 = 0
Waitus 20000
Elseif Ad > 640 And Ad <= 672 Then
Portb.2 = 1
Waitus 1720
Portb.2 = 0
Waitus 20000
Elseif Ad > 672 And Ad <= 704 Then
Portb.2 = 1
Waitus 1776
Portb.2 = 0
Waitus 20000
Elseif Ad > 704 And Ad <= 736 Then
Portb.2 = 1
Waitus 1832
Portb.2 = 0
Waitus 20000
Elseif Ad > 736 And Ad <= 768 Then
Portb.2 = 1
Waitus 1888
Portb.2 = 0
Waitus 20000
Elseif Ad > 768 And Ad <= 800 Then
Portb.2 = 1
Waitus 1944
Portb.2 = 0
Waitus 20000
Elseif Ad > 800 And Ad <= 832 Then
Portb.2 = 1
Waitus 2000
Portb.2 = 0
Waitus 20000
Elseif Ad > 832 And Ad <= 864 Then
Portb.2 = 1
Waitus 2056
Portb.2 = 0
Waitus 20000
Elseif Ad > 864 And Ad <= 896 Then
Portb.2 = 1
Waitus 2168
Portb.2 = 0
Waitus 20000
Elseif Ad > 896 And Ad <= 928 Then
Portb.2 = 1
Waitus 2224
Portb.2 = 0
Waitus 20000
Elseif Ad > 928 And Ad <= 960 Then
Portb.2 = 1
Waitus 2280
Portb.2 = 0
Waitus 20000
Elseif Ad > 960 And Ad <= 992 Then
Portb.2 = 1
Waitus 2336
Portb.2 = 0
Waitus 20000
Elseif Ad > 992 And Ad <= 1024 Then
Portb.2 = 1
Waitus 2392
Portb.2 = 0
Waitus 20000
End If

Loop


schon mal danke

mfg

PicNick
27.01.2008, 15:15
Ich hab das mit Cut'n'Paste in den Bascom geschoben, der bringt keine Fehlermeldung ?

PicNick
27.01.2008, 15:20
Ahja, noch was: Wenn du beide Servos machst, hast du 2 x 20 mS, da fangen Servos schon mal zu zappeln an.

Sauerbruch
27.01.2008, 15:34
Gibts da ne andere möglichkeit sowas zu programmieren

Sehr elegant für solche "Serien-Bedingungsabfragen" ist der befehl "Select Case" (wie alle anderen Befehle auch gut in der Bascom-Hilfe beschrieben).

Am besten kann man Servos aber mit PWM ansteuern - supergenau und extrem codesparend. Die Beschäftigung damit lohnt sich für jeden Servo-Verwender: https://www.roboternetz.de/wissen/index.php/Bascom_und_PWM O:)

Aber welche Fehlermeldung bringt Bascom denn bei Dir überhaupt?

rocketman123
27.01.2008, 16:44
habs auch gerade nochmal kopiert und da bringt mir bascom

folgende Fehlermeldung

ERROR: 999 line: 340 DEMO/BETA only supports 4096 bytes of code

kann es sein das ich nur eine demoversion habe???
Ist die Vollversion umsonst?

kannst du mir ein kurzes Beispiel geben wie ich das mit slect case schreiben kann?

danke
mfg

PicNick
27.01.2008, 16:56
Fehlermeldung: alles klar, logisch. Vollversion kostet ~80 € (weiss nicht genau)



Dim Us As Word

Do
Ad1 = Getadc(1)
Select Case Ad1
Case Is < 32 : Us = 600
Case Is < 64 : Us = 656
Case Is < 96 : Us = 712
Case Is < 128 : Us = 768
.....
End Select

Portb.1 = 1
Waitus Us
Portb.1 = 0
Waitus 20000




versuch mal, ob das noch geht.


ausserdem glaub' ich, daß man die Zeit auch errechnen könnte
us = ad1 * faktor + basis

Sauerbruch
27.01.2008, 18:17
Hmmm... in der Bascom-Hilfe steht, dass waitus nicht mit variablen geht. Kann ich aus eigener Erfahrung auch bestätigen.

Außerdem würde ich zu bedenken geben, dass wenn Ad1 z.B. 50 sei, alle Bedingungen (< 64, < 96, < 128 etc.) erfüllt sind.

Vielleicht geht´s ja so:





Ad1 = Getadc(1)
Portb.1=1

Select case Ad1
Case is < 32: Waitus 600
Case 32 to 63: Waitus 656
Case 64 to 95: Waitus 712

...

Case is > 992: Waitus 2392
End select

Portb.1=0

Waitms 20



(auch wenn ich noch ein ziemlich kleines Bascom-Licht bin... :-b )

Gruß,

Daniel

rocketman123
01.02.2008, 17:51
erstmal danke für die antworten.
also ich habs auch mit den codes probiert jedoch ohne erfolg.
jetzt wollt ich fragen ob es eine günstigere alternative zu bascom gibt.
Ist es vielleicht besser wenn ich das in c++ schreib und dann mit programmers notepad compiliere.
wenn ja kann mir jemand einen link geben wo ich das lernen kann?

mfg