Hier das Bascom-Programm:
Code:
' Remote-Head-Programm für einen ATMega8 (c) AlKi
$regfile = "m8def.dat" ' Damit Bascom weiß, dass es das Programm für einen ATMega8 umwandeln muss (in der Datei stehen Infos über den ATMega8)
$framesize = 40 ' \
$swstack = 40 ' |=> Damit für Variablen Platz gelassen wird
$hwstack = 40 ' /
$crystal = 8000000 ' Damit Bascom weiß, wie schnell der MC getaktet ist
' Anschlüsse als Ausgänge konfigurieren:
Config Portd.6 = Output ' PD6
Motor1a Alias Portd.6 ' und einen aliasnamen zuweißen (zum besseren Verständniss des Programmtextes)
Config Portd.5 = Output ' dasselbe für PD5,
Motor1b Alias Portd.5
Config Portb.7 = Output ' PB7,
Motor2a Alias Portb.7
Config Portb.6 = Output ' und PB6
Motor2b Alias Portb.6
' Variablen deklarieren, damit sie im Programmtext genutzt werden können
Dim Achsea As Long
Dim Achseb As Long
Dim Zaehler As Long
' den Analog-Digital-Wandler einstellen:
Config Adc = Single , Prescaler = 64 , Reference = Avcc
Start Adc ' und aktivieren
Do 'Hauptschleife
Achsea = Getadc(0) ' \ die Werte der Potentiometer auslesen und in den Variablen speichern
Achseb = Getadc(1) ' /
' und jeh nach dem Handeln:
If Achsea < 424 Then
Motor1a = 1 ' (Ausgang auf "high" legen, also +5V, dadurch wird ein Motor in eine Richtung angeschalten)
Zaehler = 380
While Zaehler > Achsea ' hier...
Decr Zaehler
Wend
Motor1a = 0 ' (Den Ausgang wieder auf "low"-Pegel legen, damit wird der Motor ausgeschalten)
Zaehler = 24
While Zaehler < Achsea ' ...und hier sind Verzögerungsschleifen, welche von dem Wert der Variable (hier Achsea)
Incr Zaehler ' abhängig unterschiedlich verzögern. Da die eine kürzer verzögert wenn die andere länger
Wend ' Verzögert, wird nur das An/Aus-Verhältniss verändert. Die gesamte Zeitverzögerung ist
' aber (fast) immer gleich. Das ist PulsWellenModulation (PWM), und zwar software-PWM.
End If
If Achsea > 612 Then ' undsoweiter
Motor1b = 1
Zaehler = 574
While Zaehler < Achsea
Incr Zaehler
Wend
Motor1b = 0
Zaehler = 1000
While Zaehler > Achsea
Decr Zaehler
Wend
End If
If Achseb < 424 Then
Motor2a = 1
Zaehler = 380
While Zaehler > Achseb
Decr Zaehler
Wend
Motor2a = 0
Zaehler = 24
While Zaehler < Achseb
Incr Zaehler
Wend
End If
If Achseb > 612 Then
Motor2b = 1
Zaehler = 574
While Zaehler < Achseb
Incr Zaehler
Wend
Motor2b = 0
Zaehler = 1000
While Zaehler > Achseb
Decr Zaehler
Wend
End If
Loop ' Damit wird wieder bei "Do" angefangen.
hab ihn gerade bei meinem ATMega8 ausprobiert. da ging er.
Ich glaube, ein ATMega8 ist etwas arg überdimensioniert ist (der Programmspeicher ist nur zu etwa 10% gefüllt), aber das stört nicht. (für einen anderen AVR müsste man nur die Portnamen und das Regfile ändern. Darum übrigens auch die Aliasnamen, damit man nicht den ganzen Programmtext ändern muss)
Die Geschwindigkeit der Motoren wird per (pseudo-) Software-PWM gesteuert. Das steht auch in den Kommentaren. Das Programm ist nicht das Optimum, aber es funktioniert. Vlt. schreib ichs noch irgendwann um.
Jeh größer der Ausschlag deines Joysticks, desto schneller die Motoren.
du musst es nur noch per Bascom kompilieren und über nen ISP-Adapter in nen ATMega8 übertragen und den Passend anschließen. falls du nicht an Bascom rankommst, kann ich dir auch das hexfile geben und du kannst es mit Ponyprog übertragen. (n hexfile ist eine Datei, in der der Maschinencode in hexadezimaler Form dargestellt ist (kann man mitm Texteditor öffnen))
EDIT: was ich noch sagen wollte: du hast bei dem joystick nen rel. großen Bereich um die Mittelstellung, in dem nicht gesteuert wird. Kleine Ruckler machen also bei Mittelstellung nichts aus.
Lesezeichen