-         

Ergebnis 1 bis 8 von 8

Thema: Bascom- Atmega 8- Analoge Eingänge zum steuern eines Servos

  1. #1

    Bascom- Atmega 8- Analoge Eingänge zum steuern eines Servos

    Anzeige

    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°
    Code:
    $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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich hab das mit Cut'n'Paste in den Bascom geschoben, der bringt keine Fehlermeldung ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ahja, noch was: Wenn du beide Servos machst, hast du 2 x 20 mS, da fangen Servos schon mal zu zappeln an.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    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: http://www.roboternetz.de/wissen/ind...Bascom_und_PWM

    Aber welche Fehlermeldung bringt Bascom denn bei Dir überhaupt?

  5. #5
    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

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Fehlermeldung: alles klar, logisch. Vollversion kostet ~80 € (weiss nicht genau)
    Code:
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    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:


    Code:
    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... )

    Gruß,

    Daniel

  8. #8
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •