Hier das Bascom-Programm:
hab ihn gerade bei meinem ATMega8 ausprobiert. da ging er.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.
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.








Zitieren

Lesezeichen