PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum Pulsein Befehl



Der Einsteiger
02.01.2013, 17:07
Hallo Leute,
ich habe mal versucht den Pulsein Befehl zu nutzen,um meinen RC Empfänger auszuwerten.Das hat mit einem Kanal auch super geklappt,doch funktioniert es einfach nicht mit dem Zweiten.

Könntet ihr mir weiterhelfen ?? Kann man überhaupt zwei auswerten ??

HeXPloreR
02.01.2013, 17:13
Ja, natürlich kann man zwei auswerten...mache das selber so mit vier Kanälen ;)

Moment ich lade mal deinen code runter...

Was hat denn da geklappt? - RC Signal war das sicher nicht.

Es fehlt:
Config PortD.2 = Input 'Eingang RC Signal
PortD.2 = 1 'PullUp für PD2 an

Zweiten Kanal einfach genauso machen. Sollte klappen.
Vielleicht reicht eine Byte-Variable aus?

Viel Erfolg

Der Einsteiger
02.01.2013, 18:17
Danke für deine Antwort,
aber mit dem : Config PortD.2 = Input 'Eingang RC Signal PortD.2 = 1 'PullUp für PD2 an
zeigt mir das Display nur Null an.
Ich habe hier übrigens den falschen Code hochgeladen.Ich habe es eben noch mal mit zwei Kanälen mit meinem Code von oben probiert.Da funktioniert es.
Ich komme also zum Entschluss ,dass es etwas mit der Motoransteuerung zu tun haben muss ,dass es nicht funktioniert.

Hier noch mal der nicht funktionierende Code ,den ich wirklich hochladen wollte:

HeXPloreR
02.01.2013, 18:32
Das erste Programm von oben geht also nicht? - hast Du Masse (Board und Empfänger) verbunden und den richtige PIN als Signaleingang ausgesucht? Signal kommt am Empfänger an - Gegenprobe ggf mit Servo?
Es iein einfaches Programm, das sollte so gehen.

Ist da auch ein Display mit dran? Möchtest Du ausgaben darauf haben, also erwartest Du da was?

Wenigstens hier könntest Du nun die Änderungen von oben mit rein nehmen - der Code vorher mit LCD war gut zum testen...der neue nicht -weil zwar Baud drin ist, aber keine Ausgabe programmiert.
Ausserdem ist PortD.7 zweimal = Output gesetzt ??
Und die anderen Outputs sind auch "komisch" definiert ;)

Das Goto kann man machen ;)

Der Einsteiger
02.01.2013, 18:53
Ne ,so meinte ich es nicht.Der Code in Beitrag Nr. 1 funktioniert ja, aber der von Beitrag 3 nicht ! Wenn ich in den Code von 1 deine Sachen einfüge funktioniert aber auch der Code nicht mehr.Also muss das schon mal falsch sein.

HeXPloreR
02.01.2013, 19:01
Ach so - so einfach ist das?
Zeigst mir nochmal den neuen geänderten Code von Post 1.

Wie war das nochnmal: Nach dem reseten des µC sind alle Pins Ausgänge oder Eingänge?

Der Einsteiger
02.01.2013, 19:21
Also: RC-Auswertung funktioniert.Das andere nicht! Frage :Warum??

Wie war das nochnmal: Nach dem reseten des µC sind alle Pins Ausgänge oder Eingänge?
Hä??? Was ??

HeXPloreR
02.01.2013, 19:26
Also weil Du schon mal nicht zuhörst: Deine Pins (Zeilen 10 bis 15) für den Motor müssen Ports sein.
Zeile 9 ist doppelt!??

Der Einsteiger
02.01.2013, 19:39
Entschuldigung (auch für die Ausrufezeichen,die waren ein bisschen falsch verstanden geworden).Das mit den Pins und Ports ist egal.Dies habe ich vom RN-Control-Beispiel übernommen und auch getestet.Das funktionier auch mit den Pins.

Jetzt habe ich auch noch mal das Programm :RC-Fernbedienung mit Motoren-2.bas getestet und habe festgestellt,dass die Motoren beim ersten Kanal funktionieren,doch wenn ich die Position des zweiten Kanals ändere ,die Motoren nur zucken.

HeXPloreR
02.01.2013, 19:46
Kein Problem wegen Ausrufezeichen - hab ich garnicht geshen ;)

Tja, mit den Pins hast du wohl recht bzw steht es bei mir auch noch so drin...

Den ersten Motor würde ich dann, nachdem er ja anscheinend funktioniert mit dem Signal, einfach abklemmen. Hört sich nämlich so an als wenn die Spannung einbricht. Am Empfänger, am µC oder am Motor selbst. Dann nochmal testen.
Da du keine LED zur Anzeige des "run" vom µC in diesem Programm hast, sieht man eventuell auch nicht das er mitresetet??

Das Motor-Testprogramm welches ich für meine RN-Control geflasht hatte lief so nicht - mußte erst ein paar dinge ändern. hmm...ich schau da nochmal gelegntlich drauf...wegen den Config Pins.
Ach so, da sollten keine einfachen Motoren ran, eher Getriebemotoren oder gehacktes Servo - wegen Rückstrom des drehenden Motors vermute ich - hat damals meinen Motortreiber gegrillt ;) ...trotz Freilaufdioden :(

Wäre eine LED und eine kleine "an/aus Pause" vor der Schleife - bringt Sicherheit und beschleunigt die Fehlersuche.

Der Einsteiger
02.01.2013, 20:04
Den ersten Motor würde ich dann, nachdem er ja anscheinend funktioniert mit dem Signal, einfach abklemmen.
Also ich steuer ein rp5 Chassis an.Dies bedeutet ,dass ich beim ersten Kanal zwei Motoren drehe (für vor und zurück).Desshalb kann ich nicht einen Motor abklemmen.


hat damals meinen Motortreiber gegrillt
Meiner wird auch schon sehr warm. :)


Da du keine LED zur Anzeige des "run" vom µC in diesem Programm hast, sieht man eventuell auch nicht das er mitresetet??
Habe ich nicht dafür den Summer (PortD.7) ???

Was soll ich jetzt machen?? Der resettet nicht automatisch.

HeXPloreR
02.01.2013, 20:21
ja...der Summer tuts wohl an der Stelle auch :oops:

Dann programmiere den doch einfach raus.

Ich würde die Pausen beim einlesen des signals noch auskommentieren.

Ich weiß sonst auch nicht weiter.

Der Einsteiger
03.01.2013, 14:35
Also ich habe die Pausen noch mal weggemacht,doch es tritt keine Änderung ein.
Also noch mal die Problemstellung ,damit mir andere vielleicht auch helfen können:Wenn ich den Code RC-Fernsteuerung mit Motoren lade ,funktioniert Kanal 1(Rckanal) langsamer ,als wenn ich nur einen Kanal im Programm habe, und der zweite Kanal (Lala) zuckt nur.
Zur Information :ich benutze ein rp5 Cassis mit den zwei Motoren.Das bedeutet ,der Kanal 1 ist für vor und zurück ,und der Kanal 2(Lala) ist für das Drehen.
Frage warum funktionert das nicht??

HeXPloreR
03.01.2013, 15:37
Also wenn Du mich immer noch fragst, dann meine ich solltest Du die Kanäle trennen - also der eine sagt das es vor oder zurück geht, und der andere Kanal wird zu dem anderen mit eingerechnet um ein drehen zu ermöglichen.

Jetzt scheint es mir so zu sein, als wenn deine beiden Kanäle sich überschneiden weil sie beide auf PWM1a und PWM1b direkt wirken.

Der Einsteiger
03.01.2013, 16:33
Ja ich habe sie jetzt mal so ähnlich getrennt.Ich habe bei Case Rckanal nur die Sachen für PWM 1a gelassen und bei Lala nur PWM 1b.
Jetzt funktionieren beide Kanäle doch wenn ich gleichzeitig betreibe dreht der eine Motor auf einmal anders herum . Warum ????
Wie meinst du das mischen sonst ??Hättest du einen Code ??

HeXPloreR
03.01.2013, 18:25
Poste mal den jetzigen Code hier per codeeinfügefunktion bei erweiterte Antwort - dann braucht man sich den nicht runterladen.

Leider habe ich keine Code - habe auch nur den von der RN-Control...

Der Einsteiger
03.01.2013, 18:49
Hier :


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output
Config Portd.7 = Output
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output
Config Pind.5 = Output
'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8

Dim Rckanal As Word
Dim Lala As Word

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

Main:

Waitms 10
Pulsein Rckanal , Pind , 2 , 1 'Messung Zeit zwischen 1 und 0 Pegel
Waitms 10
Pulsein Lala , Pind , 3 , 1 'Messung Zeit zwischen 1 und 0 Pegel
Waitms 10

Select Case Rckanal

Case 90 To 140
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1

Pwm1a = 600
Waitms 10

Case 160 To 200
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1

Pwm1a = 600
Waitms 10

Case Else
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1

Pwm1a = 0
Waitms 10

End Select

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 = 1
Pwm1b = 0
Waitms 10

End Select
Goto Main

HeXPloreR
03.01.2013, 19:54
Versuche mal jeweils im case else die Portd.4 + 5 = 0 zu setzen. PWM ist dann nicht nur 0, sondern ganz am Port aus.

Wenn das klappt dann denke ich ist es das gleiche was ich mal hatte. Der Zähler vom PWM zählt irgendwie falschrum - glaube so kann man das sagen ;)
Bei 0 volle Pulle ;)

Hängt irgendwie zusammen mit:

Compare A Pwm = Clear Up, Compare B Pwm = Clear Up

...aber so weit bin ich noch nicht.

Der Einsteiger
04.01.2013, 10:40
wenn ich das so mache :

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output
Config Portd.7 = Output
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output
Config Pind.5 = Output
'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8

Dim Rckanal As Word
Dim Lala As Word

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

Main:

Waitms 10
Pulsein Rckanal , Pind , 2 , 1 'Messung Zeit zwischen 1 und 0 Pegel
Waitms 10
Pulsein Lala , Pind , 3 , 1 'Messung Zeit zwischen 1 und 0 Pegel
Waitms 10

Select Case Rckanal

Case 90 To 140
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1

Pwm1a = 600
Waitms 10

Case 160 To 200
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1

Pwm1a = 600
Waitms 10

Case Else
Portc.6 = 1
Portc.7 = 0
Portd.4 = 0

Waitms 10

End Select

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
Goto Main

und dann einmal den Kanal 1 bewege ,dann läuft der Motor zwar an,aber ich kann ihn nicht mehr stoppen .Genau so läuft es mit Kanal 2 auch . Häää ??????

JoeM1978
04.01.2013, 14:23
Lass doch einfach mal die Werte von den 2 Kanälen über Print an die Konsole zurückgeben und schau dir
an, was die für Werte annehmen... sowas hilft ungemein bei der Fehlersuche.
;)
Sowas kannst auch mit den anderen werten mal machen um die zu kontrollieren.


wenn ich das so mache :


Waitms 10
Pulsein Rckanal , Pind , 2 , 1 'Messung Zeit zwischen 1 und 0 Pegel
Print Rckanal
Waitms 10
Pulsein Lala , Pind , 3 , 1 'Messung Zeit zwischen 1 und 0 Pegel
Print Lala
Waitms 10




und bei...

Compare A Pwm = Clear Up
müssen da nicht unterstriche zwischen die wörter ? meckert der nicht beim kompilieren ?

D.7 ist doppelt configuriert ganz am Anfang.

... und die ausgänge der motoren...

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
sind die absichtlich bei 2 Servostellungen identisch geschaltet ?

Der Einsteiger
04.01.2013, 15:29
Also ,das Anzeigen von Werten funktioniert tadellos.Es kommen je nach dem immer Werte von 100 bis 200 raus.

müssen da nicht unterstriche zwischen die wörter ? meckert der nicht beim kompilieren ?
Was für Unterstriche ?? Funktionier bei mir ohne ,ohne Probleme .

D.7 ist doppelt configuriert ganz am Anfang.
stört doch nicht .

...sind die absichtlich bei 2 Servostellungen identisch geschaltet ?
ist doch egal oder ??

JoeM1978
04.01.2013, 17:31
ist doch egal oder ??

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.

Noch was... wenn der Wert für Nullstellung nicht genau zwischen 140 und 160 liegt aufgrund
irgendwelcher tolleranzen bekommst du den Motor nie zum stehen und hast keine Kontrolle, ob es funktioniert.

Ausserdem wäre es sicher interessant für dich zu kontrollieren, wo Max und Min deines Signals liegen und ob die
Mittelstellung überhaupt in diesem vorgegebenen Bereich (140-160) liegt.

Der Einsteiger
04.01.2013, 18:21
Mittelstellung überhaupt in diesem vorgegebenen Bereich (140-160) liegt.
natürlich ,dass habe ich doch vorher getestet.

Noch was... wenn der Wert für Nullstellung nicht genau zwischen 140 und 160 liegt aufgrund
irgendwelcher tolleranzen bekommst du den Motor nie zum stehen und hast keine Kontrolle, ob es funktioniert.
Es liegt in dem Bereich ,doch wenn ich einen Hebel einmal bewege ,dann hört der Motor nicht mehr auf. Warum ??

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.

JoeM1978
06.01.2013, 09:39
Mhm langsam weiss ich auch nicht weiter.
Ich würd noch versuchen in die "Case Else" noch ein Pwm1X=0 einzufügen.
Vieleicht überlagert der Timer irgendwie das.

Wenn ich ende diese Woche wieder zu hause bin teste ich das selbst mal aus.

Ich würde es allerdings direkt anderst aufbauen.
Die Motoransteuerungen direkt in Sub-Routinen auslagern und
vieleicht die Pausen zwischen den Messungen deitlich verkürzen
oder gleich auf eine Interruptroutine legen. 20ms sind ne recht lange zeit für den Controller.
Da kann man einiges an Programm abarbeiten in den Pausen zwischen den Messungen.

Der Einsteiger
06.01.2013, 10:58
Das wäre nett.Hättest du vielleicht auch ein Beispiel für den Vorschlag mit den Subroutinen ??
Ich wüsste zwar wie das mit dem Befehl funktioniert nur halt nicht in dem Beispiel.

JoeM1978
09.01.2013, 17:06
Also... die Abfrage über PulseIn hab ich ganz ohne Probleme gemacht...
Habs direkt auf 4 Kanälen getestet mit meiner Funke.
Kann man gut verwenden um den Empfänger zu prüfen. :p

Jetzt werd ich noch sehen, das ich das PWM integriert bekomm und
das Ganze möglichst noch in einzelne Funktionen aufteilen.

Meld mich die Tage wieder.

JoeM1978
09.01.2013, 22:44
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.
;)


'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'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:

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

Der Einsteiger
11.01.2013, 09:02
Hallo JoeM1978,
erst mal vielen Dank für deine Mühe ,aber ich muss dir leider mitteilen ,dass dein Code bei mir noch nicht ganz läuft.Die Motoren summen einfach die ganze Zeit.
Wenn ich die Steuerknüppel bewege sogar ein bisschen (glaube ich ) mehr. Werde noch mal ein bisschen weiter prokeln.
Da ich leider zur Zeit kein keine Rs-232 Auswertung zur Verfügung habe(auf das Thema antwortet mir auch keiner mehr :( ) ,kann ich dir leider auch nicht genau sagen ,was der Fehler ist.

Zu dem anderen Code ganz unten : der funktioniert leider auch nicht ,da ,obwohl ich Pwm ausgeschaltet und Port auf Null gesetzt habe ,trotzdem ein Pwm Signal an den Treiber gesendet wird.
Hoffe du kannst mir helfen :)
Hier noch mal dein von mir übertragener Code:

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Portc.6 = Output 'Motor links
Config Portc.7 = Output 'Motor links
Config Portb.0 = Output 'Motor rechts
Config Portb.1 = Output 'Motor rechts
Config Portd.4 = Output 'PWM links
Config Portd.5 = Output 'PWM rechts

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Dim Rckanal_a As Word
Dim Rckanal_b 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)


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

Loop

End


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 : Portc.6 = 0 ' Ports für Drehrichtung setzen
Portc.7 = 0
Case 1 : Portc.6 = 1
Portc.7 = 0
Case 2 : Portc.6 = 0
Portc.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.0 = 0 ' Ports für Drehrichtung setzen
Portb.1 = 0
Case 1 : Portb.0 = 1
Portb.1 = 0
Case 2 : Portb.0 = 0
Portb.1 = 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

JoeM1978
11.01.2013, 09:25
Scheint soweit alles zu passen....
hast du mal versucht deinen Motortreiber abzuklemmen und die Signale einfach mit dem Multimeter zu messen ?

So ganz ohne Rückmeldung ist das arg schwer... vieleicht könnten wir deinen Summer wenigstens als Statusmelder nutzen.
Gib doch mal in den verschiedenen Fällen für die Geschwindigkeit unterschiedlich hohe Töne über den Summer aus.

Der Einsteiger
11.01.2013, 09:45
Scheint soweit alles zu passen....
hast du mal versucht deinen Motortreiber abzuklemmen und die Signale einfach mit dem Multimeter zu messen ?
Meinst du die Pwm Eingänge vom Motortreiber?

Ich habe jetzt mal den Summer wieder eingebaut.Wenn ich jetzt das Programm starte beginnen die Motoren zu summen. Dann hören die Motoren aber wieder nicht auf und von dem Summer ist auch nichts zu hören.
Aber es ist, wie in deinem Ursprungsprogramm, ein Unterschied zwischen Mittelstellung und Seitenstellung des Knüppels zu hören.
Zu bedenken ist aber ,dass ich nicht den Summer für die Geschwindigkeit ,sondern für die Case Else Fälle eingesetzt habe.
Jetzt probiere ich noch mal wie du das wolltest.

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output
Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Portc.6 = Output 'Motor links
Config Portc.7 = Output 'Motor links
Config Portb.0 = Output 'Motor rechts
Config Portb.1 = Output 'Motor rechts
Config Portd.4 = Output 'PWM links
Config Portd.5 = Output 'PWM rechts

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Dim Rckanal_a As Word
Dim Rckanal_b 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)

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

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

Loop

End


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 : Portc.6 = 0 ' Ports für Drehrichtung setzen
Portc.7 = 0
Case 1 : Portc.6 = 1
Portc.7 = 0
Case 2 : Portc.6 = 0
Portc.7 = 1
Case Else
Sound Portd.7 , 400 , 450 ' 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.0 = 0 ' Ports für Drehrichtung setzen
Portb.1 = 0
Case 1 : Portb.0 = 1
Portb.1 = 0
Case 2 : Portb.0 = 0
Portb.1 = 1
Case Else
Sound Portd.7 , 400 , 250 ' bei ungültigen Werten fehler anzeigen
End Select
Pwm1b = Geschwindigkeit ' Geschwindigkeit Motor 2 regeln
Case Else
Sound Portd.7 , 400 , 600 ' bei ungültigen Werten fehler anzeigen
End Select

Print "->Motor=" ; Motor ; " ->Richtung=" ; Drehrichtung ; " ->Geschwindigkeit=" ; Geschwindigkeit 'Werte anzeigen als Kontrolle
End Sub

JoeM1978
12.01.2013, 02:10
Also... ich hab damit heut auch nochmal etwas ausprobiert...
bin hjetzt eher etwas verwirrt...
Der Pulsein liefert mir seltsamerweise jetzt nurnoch werte 11 bis 18.
Theoretisch sollte es aber das 10-fache sein.
jedenfalls hab ich behelfsmässig die umrechnung der Geschwindigkeitswerte geändert.


Geschwindigkeit = Geschwindigkeit * 10
Geschwindigkeit = Geschwindigkeit - 110
Geschwindigkeit_single = Geschwindigkeit * 1.75
Geschwindigkeit = Geschwindigkeit_single

Select Case Geschwindigkeit
Case Is >= 255 : Geschwindigkeit = 255
Case Is <= 25 : Geschwindigkeit = 0

Dafür muss die Single-Variable noch oben eingefügt werden... die hab ich benutzt um Dezimal zu rechnen.


Meinst du die Pwm Eingänge vom Motortreiber?
Ja die PWM-Signale und die Motor-Ports, die direkt aus deinem RN-control kommen.
Dazu reicht ein multimeter.
das PWM-Signal zeigt (wenns funktioniert) die Spannungsänderung an.
Das Multi misst nämlich Effektivspannung (Durchschnittswert) und die Steigt mit einem höheren PWM-Wert

Versuchen könntest du mal anstadt das RC-Signal auszulesen... vieleicht kontrollhalber
die motoren direkt ein/auszuschalten mit verschiedenen Geschwindigkeiten.
Also testen, ob hardwareseitig alles funktioniert.

Wenn schon keine Konsole hast fürs Fehlersuchen... hast evtl ein LCD, was du anschliessen könntest ?

HeXPloreR
12.01.2013, 20:54
Hallo,

@ Der Einsteiger: Bist du Dir sicher das Du überhaupt ein Signal einliesst?
- Quarzfrequenz wirklich die beschriebenen 16MHz(waren doch 16??)
- KEIN PinD.2 und .3 als input
- ggf Pullup für die Eingänge dazu

Viel Erfolg

EDIT: ach sehe grade das hatte ich ja schon als erste Anwort mal geschrieben...umgesetzt?

JoeM1978
13.01.2013, 00:40
Also... ich hab damit heut auch nochmal etwas ausprobiert...
bin hjetzt eher etwas verwirrt...
Der Pulsein liefert mir seltsamerweise jetzt nurnoch werte 11 bis 18.


Die Verwirrung hat sich aufgelöst, nachdem ich rausfinden musste, das meine Fuse-Bits nicht gestimmt haben.
Der lief auf 1Mhz anstadt den erwarteten 8MHz.

Hab dann diese "behelfsmässige Rechnerei wieder rausgenommen... und alles paletti.

Der Einsteiger
13.01.2013, 10:56
vieleicht kontrollhalber
die motoren direkt ein/auszuschalten mit verschiedenen Geschwindigkeiten.
Also testen, ob hardwareseitig alles funktioniert.
funktioniert.
Messen mit dem Multimeter mache ich noch.

Wenn schon keine Konsole hast fürs Fehlersuchen... hast evtl ein LCD, was du anschliessen könntest ?
Wie du meinem Thema Frage zum rs...... jetzt entnehmen kannst habe ich wieder rs232. Ein LCD habe ich auch ,sonst hätte ich ja gar nicht die ganzen Werte ermitteln können.


@ Der Einsteiger: Bist du Dir sicher das Du überhaupt ein Signal einliesst?
siehe einen Quote weiter oben in diesem Kommentar.

- Quarzfrequenz wirklich die beschriebenen 16MHz(waren doch 16??)
- KEIN PinD.2 und .3 als input
Ja

- ggf Pullup für die Eingänge dazu
Brauche ich nicht.Das empfangen funktioniert ,aber irgend was anderes funktioniert nicht.

Hab dann diese "behelfsmässige Rechnerei wieder rausgenommen... und alles paletti.
Das ist gut zu wissen ,dass es daran lag.

JoeM1978
13.01.2013, 12:04
Na dann lass dir mal werte vom Empfänger anzeigen und auch, was für PWM-Wert vom Timer rauskommt.

Dabei bin ich grad am überlegen... Wenn du 16MHz Takt hast mit Prescale=8 kommt 2MHz raus... nicht wie bei mir 1MHz.

Also Zählt der Timer doppelt so schnell ?

Der Einsteiger
13.01.2013, 12:12
und auch, was für PWM-Wert vom Timer rauskommt.
Wie denn ??

Also Zählt der Timer doppelt so schnell ?
Kann schon sein.

JoeM1978
13.01.2013, 12:26
mhm... du hattest den timer1 glaub auf pwm=10 ? ... dann hat der ne auflösung bis 1024.
dann ist er also die meiste zeit über den angegebenen 255...
entweder das anpassen oder einfach auf 8bit stellen.

nur um missverständnisse auszumärzen

Der Einsteiger
13.01.2013, 13:44
Hallo ,hab jetzt noch mal das Programm geladen von dir geladen :

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output
Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Portc.6 = Output 'Motor links
Config Portc.7 = Output 'Motor links
Config Portb.0 = Output 'Motor rechts
Config Portb.1 = Output 'Motor rechts
Config Portd.4 = Output 'PWM links
Config Portd.5 = Output 'PWM rechts

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Dim Rckanal_a As Word
Dim Rckanal_b 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)

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

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

Loop

End


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 = 600 ' 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 : Portc.6 = 0 ' Ports für Drehrichtung setzen
Portc.7 = 0
Case 1 : Portc.6 = 1
Portc.7 = 0
Case 2 : Portc.6 = 0
Portc.7 = 1
Case Else
Print "Fehler1-Drehrichtung" ' 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.0 = 0 ' Ports für Drehrichtung setzen
Portb.1 = 0
Case 1 : Portb.0 = 1
Portb.1 = 0
Case 2 : Portb.0 = 0
Portb.1 = 1
Case Else
Print "Fehler2-Drehrichtung" ' bei ungültigen Werten fehler anzeigen
End Select
Pwm1b = Geschwindigkeit ' Geschwindigkeit Motor 2 regeln
Case Else
Print "Fehler-Motor" ' bei ungültigen Werten fehler anzeigen
End Select

Print "->Motor=" ; Motor ; " ->Richtung=" ; Drehrichtung ; " ->Geschwindigkeit=" ; Geschwindigkeit 'Werte anzeigen als Kontrolle
End Sub

Und habe bei beiden Motoren nacheinander mal beim Ausgang des L293D ein Multimeter angeschlossen. Bei Mittelstellung zeigt es 1,6V ,bei dem einen Ausschlag 2,2V und beim anderen Ausschlag 0,97 V an . Ist das nicht ganz Falsch ??Sollte nicht bei beiden Endausschlägen ein höherer Wert herauskommen ???

Die Serielle Auswertung hat nur ganz oft :Motor 1 Richtung 1 Geschwindigkeit ca.130
und Motor 2 Richtung 1 Geschwindigkeit 138 angezeigt.

Kannst du damit was anfangen ?????

JoeM1978
13.01.2013, 13:54
dann würd ich mal sagen... wenn der Ausgangswert (also Geschwindigkeit) sich kaum von den 130 wegbewegt....

zurückrechnen... (130/2)+85=150

und 150 wäre genau der wert, der für die mittelstellung der Funke zu erwarten wäre...

Was für ne fernsteuerung hast du ? Funktioniert die richtig ??

Ich würde mal behaupten, das deine Funke oder der Empfänger nicht korrekt arbeiten...
Kann man evtl die Wege der Servos einstellen oder sogar anzeigen lassen ?

Nachtrag:
Wenn ich direkt den Wert abfrage, der von PulseIn geliefert wird....

Meine Funke bringt bei Einstellung > "100% Servoweg" Ergebnisse von : 110<>150<>190
und bei Einstellung > " "150% Servoweg" Ergebnisse von : 90<>150<>210

Der Einsteiger
13.01.2013, 18:19
Was für ne fernsteuerung hast du ? Funktioniert die richtig ??
Ja, funktioniert richtig ,da ich ja sonst keine sinnvollen Ergebnisse herausbekommen würde.

Kann man evtl die Wege der Servos einstellen oder sogar anzeigen lassen ?
Nein.

Meine Funke bringt bei Einstellung > "100% Servoweg" Ergebnisse von : 110<>150<>190
Meine auch in etwa.

Ich habe jetzt mal den Ausprobiert :

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output
Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Portc.6 = Output 'Motor links
Config Portc.7 = Output 'Motor links
Config Portb.0 = Output 'Motor rechts
Config Portb.1 = Output 'Motor rechts
Config Portd.4 = Output 'PWM links
Config Portd.5 = Output 'PWM rechts

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Dim Rckanal_a As Word
Dim Rckanal_b 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)

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

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

Loop

End


Sub Motorsteuerung(byval Motor As Byte , Byval Drehrichtung As Byte , Byval Geschwindigkeit As Word)

Select Case Geschwindigkeit
Case 90 To 140
Geschwindigkeit = 600
Drehrichtung = 1

Case 160 To 200
Geschwindigkeit = 500
Drehrichtung = 2

Case Else
Geschwindigkeit = 0
Drehrichtung = 0

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 : Portc.6 = 0 ' Ports für Drehrichtung setzen
Portc.7 = 0
Case 1 : Portc.6 = 1
Portc.7 = 0
Case 2 : Portc.6 = 0
Portc.7 = 1
Case Else
Print "Fehler1-Drehrichtung" ' bei ungültigen Werten fehler anzeigen
End Select
Pwm1a = Geschwindigkeit
Print "Geschwindigkeit1:_" ; Geschwindigkeit ' Geschwindigkeit Motor 1 regeln
Case 2 : Select Case Drehrichtung ' wenn Motor2, in welche richtung soll er drehen ?
Case 0 : Portb.0 = 0 ' Ports für Drehrichtung setzen
Portb.1 = 0
Case 1 : Portb.0 = 1
Portb.1 = 0
Case 2 : Portb.0 = 0
Portb.1 = 1
Case Else
Print "Fehler2-Drehrichtung" ' bei ungültigen Werten fehler anzeigen
End Select
Pwm1b = Geschwindigkeit
Print "Geschwindigkeit2:_" ; Geschwindigkeit ' Geschwindigkeit Motor 2 regeln
Case Else
Print "Fehler-Motor" ' bei ungültigen Werten fehler anzeigen
End Select
Print "Geschwindigkeit:_" ;
End Sub

Und bekomme keine Fehlermeldung ,doch es läuft nix.Selbst das Summen hat aufgehört. Ich bekomme nur Werte von der Geschwindigkeit je nach Knüppelstellungen angezeigt.

Es funktioniert einfach nicht zusammen. Denn getrennt funktioniert alles.

JoeM1978
13.01.2013, 19:16
hat der M32 wirklich PWM-Kanäle auf D.4 und D.5 ?

Also das Signal vom Timer1=PWM kommt nur auf den Pins raus, die auch mit OC1A und OC1B angegeben sind...
was bei mir am Atmega8 PortB.1 und PortB.2 sind.

Das macht es leider oft sehr schwer, wenn man PWM und Interrupt nur begrenzt zur verfügung hat, weil die nicht an jedem Beliebigen Pin/Port funtionieren.

Der Einsteiger
14.01.2013, 13:52
hat der M32 wirklich PWM-Kanäle auf D.4 und D.5 ?
Ja.

So ,nach langem Probieren klappt es endlich.
Hier mein Code.Mit Kanal 1 fahre ich vor und zurück und mit dazugeschaltetem Kanal 2 drehe ich links und rechts.

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output
Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Portc.6 = Output 'Motor links
Config Portc.7 = Output 'Motor links
Config Portb.0 = Output 'Motor rechts
Config Portb.1 = Output 'Motor rechts
Config Portd.4 = Output 'PWM links
Config Portd.5 = Output 'PWM rechts

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Dim Drehrichtung As Word
Dim Geschwindigkeit As Word
Dim Schub As Word
Dim Gerade As Word
Dim Lala As Word

Declare Sub Motorsteuerung

Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

Do
Pulsein Geschwindigkeit , Pind , 2 , 1 'vor / zurück
Pulsein Drehrichtung , Pind , 3 , 1 'links / rechts
Call Motorsteuerung
Loop
End





Sub Motorsteuerung


Select Case Geschwindigkeit

Case 90 To 140
Schub = 650
Gerade = 8
Print "Vorwärts"


Case 160 To 200
Schub = 650
Gerade = 2
Print "Rückwärts"


Case Else
Schub = 0
Print "Stop"

End Select


Select Case Drehrichtung

Case 90 To 140
Portc.6 = 1
Portc.7 = 0
Portb.0 = 1
Portb.1 = 0

Lala = Schub + 100
Pwm1a = Lala
Pwm1b = Lala

Case 160 To 200
Portc.6 = 0
Portc.7 = 1
Portb.0 = 0
Portb.1 = 1

Lala = Schub + 100
Pwm1a = Lala
Pwm1b = Lala

Case Else

Select Case Gerade

Case 8
Portc.6 = 0
Portc.7 = 1
Portb.0 = 1
Portb.1 = 0

Pwm1a = Schub
Pwm1b = Schub

Case 2
Portc.6 = 1
Portc.7 = 0
Portb.0 = 0
Portb.1 = 1

Pwm1a = Schub
Pwm1b = Schub

Case Else
Portc.6 = 0
Portc.7 = 0
Portb.0 = 0
Portb.1 = 0

Pwm1a = Schub
Pwm1b = Schub

End Select

End Select

End Sub

JoeM1978
14.01.2013, 14:42
schön wenns klappt.
hast du denn auch Ausfindig machen können, was genau jetzt der Haken daran war ?

Der Einsteiger
14.01.2013, 19:43
Bis jetzt ist es mir noch unerklärlich, denn wenn bei dir der Code funktioniert hatte ,hätte er bei mir mit den Anpassungen ja auch funktionieren müssen.Doch irgendwie gings bei mir nicht. Welche Version von Bascom nutzt du ??

JoeM1978
14.01.2013, 20:16
Bascom-AVR Version 2.0.7.1 document build 38


Aber das hat normal nix zu sagen... denn die Befehle usw sind ja die selben

Der Einsteiger
15.01.2013, 20:25
stimmt ,das kann damit nichts zu tun haben .Aber was ist es dann ??

JoeM1978
15.01.2013, 21:45
Kann ich auch nicht sagen... sonst hätten wir ja den Fehler auch gefunden.

Vieleicht liest ja jemand mit und hat die einleuchtende Idee.

Was mich angeht kannst es als erledigt abhaken... wenns funktioniert ist es ja ok.

Steck grade eh voll in meinem anderen code drinn und bin 110% ausgelastet.

:)