Also... Ich hab es so umgesetzt und auch getestet.
Auf meinem MyAvr Board funktioniert es so einwandfrei.
Hab sogar das Oszi drangehangen und es ist wirklich bestens möcht ich behaupten.
Du musst es nurnoch anpassen auf deine Bedürfnisse.
Ist soweit alles Ausdokumentiert und ich meine es ist auch alles recht Verständlich gemacht.
Wichtig ist den Maximalwert für das PWM evtl. anzupassen (Manche Treiber mögen es nicht, wenn 100% PWM ankommt)
Fürs Bremsen hab ich jetzt einfach mal beide Motorkanäle auf 0 stehen falls das wer braucht.
und die Ports/Pins richtig zu setzen.
Drehrichtung hab ich schon implementiert... allerdings jetzt "manuell" auf linkslauf gestellt.
Aufgefallen ist mir vor allem, das meine Funke im Standardzustand NICHT den ganzen Bereich von 950 bis 2050 abgedeckt hat.
Dazu musste ich erst ins Menü und die Anschläge der Servos ganz hochdrehen.
Getestet hab ich mit MX-16S und R16Scan und die Ausgabe der PWM-Signale geprüft.
Einzig ob die Ports der Motorkanäle richtig schalten hab ich nicht kontrolliert... aber sollte soweit passen.
Ich übernehm keine Verantwortung... fürs anpassen und etwaige Fehler ausbessern ist jeder selber zuständig.

Code:
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Programmname: RCKanal-abfrage-PulseIn.bas
'
'Letzte Änderung: 09.01.2013
'
'Funktion: Abfrage von RC-Kanälen mittels PulseIn
' und Ausgabe über "Print" an die Konsole.
' Inclusive Subroutine für MotorSteuerung über PWM
'
'
'Mikrocontroller: Mega8
'
'Input: D2 - RC-Kanal 1
' D3 - RC-Kanal 2
' D4 - RC-Kanal 3
' D5 - RC-Kanal 4
'
'Output: D6 - Motor1 links
' D7 - Motor1 rechts
' B1 - Motor1 PWM
' B2 - Motor2 PWM
' B3 - Motor2 links
' B4 - Motor2 rechts
'
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Den Atmega mit den passenden Daten füttern.
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" ' eingesetzter Mikrocontroller
$crystal = 8000000 ' eingestellte Taktfrequenz (8MHz)
$hwstack = 100 ' Standardwert
$swstack = 100 ' Standardwert
$framesize = 100 ' Standardwert
'-------------------------------------------------------------------------------
'Ports/Pins konfigurieren.
'-------------------------------------------------------------------------------
Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Pind.4 = Input ' Signal 3(c) vom RC-Empfänger
Config Pind.5 = Input ' Signal 4(d) vom RC-Empfänger
Config Portd.6 = Output ' Motor 1 links
Config Portd.7 = Output ' Motor 1 rechts
Config Portb.1 = Output ' PWM Motor 1
Config Portb.2 = Output ' PWM Motor 2
Config Portb.3 = Output ' Motor 2 links
Config Portb.4 = Output ' Motor 2 rechts
'-------------------------------------------------------------------------------
'Timer/OCR/PWM/INT usw. setzen
'-------------------------------------------------------------------------------
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1 ' ergibt 1.000.000 ticks/sekunde
'-------------------------------------------------------------------------------
'Variablen
'-------------------------------------------------------------------------------
Dim Rckanal_a As Word
Dim Rckanal_b As Word
Dim Rckanal_c As Word
Dim Rckanal_d As Word
Dim Motor As Byte ' 1=Motor1 / 2=Motor2 /...
Dim Drehrichtung As Byte ' 0= Bremsen / 1=links / 2=rechts
Drehrichtung = 1 ' Drehrichtung >>>jetzt manuell auf Links gestellt <<<
Dim Geschwindigkeit As Word ' Motorgeschwindigkeit
Geschwindigkeit = 0 ' Motorgeschwindigkeit anfangs auf 0
Declare Sub Motorsteuerung(byval Motor As Byte , Byval Drehrichtung As Byte , Byval Geschwindigkeit As Word)
'-------------------------------------------------------------------------------
'Hauptprogramm
'-------------------------------------------------------------------------------
Do
' Wert vom RC-Empfänger abfragen und weitergeben
Pulsein Rckanal_a , Pind , 2 , 1 ' Wert vom Kanal 1...Motor 1.
Motor = 1
Geschwindigkeit = Rckanal_a
Call Motorsteuerung(motor , Drehrichtung , Geschwindigkeit) 'Daten an Subroutine/Motorsteuerung übergeben
' Subroutine hat Motor bearbeitet... weiter zum nächsten
' Wert vom RC-Empfänger abfragen und weitergeben
Pulsein Rckanal_b , Pind , 3 , 1 ' Wert vom Kanal 2...Motor 2.
Motor = 2
Geschwindigkeit = Rckanal_b
Call Motorsteuerung(motor , Drehrichtung , Geschwindigkeit) 'Daten an Subroutine/Motorsteuerung übergeben
' Subroutine hat Motor bearbeitet... weiter zum nächsten
Pulsein Rckanal_c , Pind , 4 , 1 ' z.B. für weitere Funktionen
Pulsein Rckanal_d , Pind , 5 , 1 ' z.B. für weitere Funktionen
Loop
End
'-------------------------------------------------------------------------------
'Subroutinen
'-------------------------------------------------------------------------------
Sub Motorsteuerung(byval Motor As Byte , Byval Drehrichtung As Byte , Byval Geschwindigkeit As Word)
Geschwindigkeit = Geschwindigkeit - 85 'Wenn der Wert vom RC-Kanal etwa 90 bis 210 beträgt ...
Geschwindigkeit = Geschwindigkeit * 2 ' ... grob umrechnen um innerhalb 0 bis 255 zu sein fürs PWM-Signal
Select Case Geschwindigkeit ' sicherstellen, das keine Falschen Werte durchkommen
Case Is >= 255 : Geschwindigkeit = 255 ' maximalwert 255
Case Is <= 15 : Geschwindigkeit = 0 ' Untere Schwelle, das der Motor auch wirklich still stehen kann
End Select
Select Case Motor ' Welcher Motor soll gesteuert werden ?
Case 1 : Select Case Drehrichtung ' wenn Motor1, in welche richtung soll er drehen ?
Case 0 : Portd.6 = 0 ' Ports für Drehrichtung setzen
Portd.7 = 0
Case 1 : Portd.6 = 1
Portd.7 = 0
Case 2 : Portd.6 = 0
Portd.7 = 1
Case Else
Print "Fehler bei Drehrichtung Motor1" ' bei ungültigen Werten fehler anzeigen
End Select
Pwm1a = Geschwindigkeit ' Geschwindigkeit Motor 1 regeln
Case 2 : Select Case Drehrichtung ' wenn Motor2, in welche richtung soll er drehen ?
Case 0 : Portb.3 = 0 ' Ports für Drehrichtung setzen
Portb.4 = 0
Case 1 : Portb.3 = 1
Portb.4 = 0
Case 2 : Portb.3 = 0
Portb.4 = 1
Case Else
Print "Fehler bei Drehrichtung Motor2" ' bei ungültigen Werten fehler anzeigen
End Select
Pwm1b = Geschwindigkeit ' Geschwindigkeit Motor 2 regeln
Case Else
Print "Fehler bei Auswahl des Motors" ' bei ungültigen Werten fehler anzeigen
End Select
Print "->Motor=" ; Motor ; " ->Richtung=" ; Drehrichtung ; " ->Geschwindigkeit=" ; Geschwindigkeit 'Werte anzeigen als Kontrolle
End Sub
- - - Aktualisiert - - -
Select Case Lala
Case 90 To 140
Portb.0 = 1
Portb.1 = 0
Portd.5 = 1
Pwm1b = 600
Waitms 10
Case 160 To 200
Portb.0 = 1
Portb.1 = 0
Portd.5 = 1
Pwm1b = 600
Waitms 10
Case Else
Portb.0 = 0
Portb.1 = 1
Portd.5 = 0
Waitms 10
End Select
...und ...
>an sich schon... aber da bei "Select Case Rckanal" alle 3 Fälle die selbe Motorrichtung
haben wundert mich nicht, wenn er nur in eine Richtung läuft.
>Das ist doch egal ,da ich in Case Else ja den Motor abgeschaltet habe will ,was aber leider nicht funktioniert.
da ist mir vorhin doch noch aufgefallen, was nicht vieleicht nicht Stimmt und warum der motor nichtmehr aus geht.
Wenn der Motor aus sein soll legt man "normalerweise" beide Kanäle auf 0 und auch das PWM-Signal auf 0.
Hier hast du einen Motorkanal angelassen in ALLEN Case-Fällen und das PWM nicht auf 0 gemacht.

Also so:
Code:
Case Else
Portb.0 = 0 'Motorkanal 1
Portb.1 = 0 'Motorkanal 2
Portd.5 = 0 'PWM
Pwm1b=0 'Vorsichtshalber
Ich frag mich dabei, ob das PWM-Signal trotzdem am Port anliegt, trotz das dieser auf 0 Steht.
Wäre interessant zu wissen
Lesezeichen