Salvador
01.06.2008, 12:27
Hi,
ich komm' nicht mehr weiter bei folgendem Problem:
An einem Modellflugempfänger wird das Summensignal abgegriffen (siehe Bild):
http://gallery.mikrokopter.de/main.php?g2_view=core.DownloadItem&g2_itemId=1289&g2_serialNumber=2
Nun benötige ich den Wert der ersten vier Impulse (= Kanäle)
Und nach einigen Versuchen hab' ich folgendes Programm geschrieben:
$baud = 9600
$crystal = 16000000
$regfile "m32def.dat"
Config Portc.2 = Output
Vorne Alias Portc.2
Config Portc.1 = Output
Hinten Alias Portc.1
Config Portc.0 = Output
Links Alias Portc.0
Config Portd.7 = Output
Rechts Alias Portd.7
Config Timer0 = Timer , Prescale = 1024 'konfiguriere Timer0
Enable Timer0
Stop Timer0
Config Int0 = Rising 'configuriere Int0 Auf Low Level
Enable Interrupts 'einschalten der Interrupts
Enable Int0 'einschalten Von Interrupt Int0
On Int0 Summensignalmessung 'springe Zu einstellen_von _int0
Dim Pitch As Byte
Dim Gier As Byte
Dim Roll As Byte
Dim Nick As Byte
Dim Messung As Bit
Dim Kanal As Byte
Dim Zaehler As Byte
Do
Links = 1
Links = 0
Loop
Summensignalmessung:
Rechts = 1
If Messung = 0 And Kanal = 0 And Timer0 < 50 Then
Stop Timer0
Tcnt0 = 0
Start Timer0
End If
If Messung = 0 And Kanal = 0 And Timer0 > 50 Then
Stop Timer0
Tcnt0 = 0
Start Timer0
Messung = 1
Incr Kanal
End If
If Messung = 1 And Kanal = 1 Then
Stop Timer0
Timer0 = Pitch
Tcnt0 = 0
Start Timer0
Incr Kanal
End If
If Messung = 1 And Kanal = 2 Then
Stop Timer0
Timer0 = Gier
Tcnt0 = 0
Start Timer0
Incr Kanal
End If
If Messung = 1 And Kanal = 3 Then
Stop Timer0
Timer0 = Roll
Tcnt0 = 0
Start Timer0
Incr Kanal
End If
If Messung = 1 And Kanal = 4 Then
Stop Timer0
Timer0 = Nick
Tcnt0 = 0
Start Timer0
Messung = 0
Kanal = 0
End If
Incr Zaehler
If Zaehler = 250 Then
Print Pitch
Print Gier
Print Roll
Print Nick
Zaehler = 0
End If
Rechts = 0
Return
End
Sorry für die nicht vorhandenen Kommentare, aber ich schreib' die immer erst am Schluss rein :-k
Die Ausgänge sind die Servoimpulsausgänge für die vier Regler, die später angesteuert werden (daher kann Timer1 nicht verwendet werden)
Was ich in dem Programm versucht habe: Summensignal ist am Interrupt- Pin0 angeschlossen (Pind.2 glaub ich), bei einer steigenden Flanke geht der MC in ein Unterprogramm, in dem je nach gesetztem KanalByte und Messungsbit der Zähler gestartet oder gestoppt wird. Wenn das Kanalbyte zwischen 1 und 4 ist werden entsprechende Variablen mit dem Wert des Timers überschrieben, sie Stellen also die Position der Knüppel am Sender dar.
Nur das Problem an der Sache: Angefangen hab ich mit einem Prescaler von 1024, wollte sehen wie hoch der Zähler denn kommt. Aber beim Befehl "print" kam nur 0 raus. Laut meinen Berechnungen müsste der Timer aber bei einer Impulsdauer von 2ms bis knapp über 30 zählen. Als ich direkt den Timerwert ausgelesen hab' kamen dann 36 bei "roll" raus, aber der Wert änderte sich nicht bei verändern der Impulsdauer (also wenn man den Knüppel am Sender bewegt).
Bei einem Versuch, einen 1 Sekundentakt herzustellen fiel mir auf dass der berechnete Wert garnicht stimmte. Vll. auch ein Programmfehler von mir.
Ich wäre euch sehr dankbar wenn ihr mir beim Thema Timer weiterhelfen würdet, komme auch mit den Infos aus dem RN-Wissen nicht weiter. Hab mich bis jetzt noch nicht allzu sehr damit beschäftigt.
ich komm' nicht mehr weiter bei folgendem Problem:
An einem Modellflugempfänger wird das Summensignal abgegriffen (siehe Bild):
http://gallery.mikrokopter.de/main.php?g2_view=core.DownloadItem&g2_itemId=1289&g2_serialNumber=2
Nun benötige ich den Wert der ersten vier Impulse (= Kanäle)
Und nach einigen Versuchen hab' ich folgendes Programm geschrieben:
$baud = 9600
$crystal = 16000000
$regfile "m32def.dat"
Config Portc.2 = Output
Vorne Alias Portc.2
Config Portc.1 = Output
Hinten Alias Portc.1
Config Portc.0 = Output
Links Alias Portc.0
Config Portd.7 = Output
Rechts Alias Portd.7
Config Timer0 = Timer , Prescale = 1024 'konfiguriere Timer0
Enable Timer0
Stop Timer0
Config Int0 = Rising 'configuriere Int0 Auf Low Level
Enable Interrupts 'einschalten der Interrupts
Enable Int0 'einschalten Von Interrupt Int0
On Int0 Summensignalmessung 'springe Zu einstellen_von _int0
Dim Pitch As Byte
Dim Gier As Byte
Dim Roll As Byte
Dim Nick As Byte
Dim Messung As Bit
Dim Kanal As Byte
Dim Zaehler As Byte
Do
Links = 1
Links = 0
Loop
Summensignalmessung:
Rechts = 1
If Messung = 0 And Kanal = 0 And Timer0 < 50 Then
Stop Timer0
Tcnt0 = 0
Start Timer0
End If
If Messung = 0 And Kanal = 0 And Timer0 > 50 Then
Stop Timer0
Tcnt0 = 0
Start Timer0
Messung = 1
Incr Kanal
End If
If Messung = 1 And Kanal = 1 Then
Stop Timer0
Timer0 = Pitch
Tcnt0 = 0
Start Timer0
Incr Kanal
End If
If Messung = 1 And Kanal = 2 Then
Stop Timer0
Timer0 = Gier
Tcnt0 = 0
Start Timer0
Incr Kanal
End If
If Messung = 1 And Kanal = 3 Then
Stop Timer0
Timer0 = Roll
Tcnt0 = 0
Start Timer0
Incr Kanal
End If
If Messung = 1 And Kanal = 4 Then
Stop Timer0
Timer0 = Nick
Tcnt0 = 0
Start Timer0
Messung = 0
Kanal = 0
End If
Incr Zaehler
If Zaehler = 250 Then
Print Pitch
Print Gier
Print Roll
Print Nick
Zaehler = 0
End If
Rechts = 0
Return
End
Sorry für die nicht vorhandenen Kommentare, aber ich schreib' die immer erst am Schluss rein :-k
Die Ausgänge sind die Servoimpulsausgänge für die vier Regler, die später angesteuert werden (daher kann Timer1 nicht verwendet werden)
Was ich in dem Programm versucht habe: Summensignal ist am Interrupt- Pin0 angeschlossen (Pind.2 glaub ich), bei einer steigenden Flanke geht der MC in ein Unterprogramm, in dem je nach gesetztem KanalByte und Messungsbit der Zähler gestartet oder gestoppt wird. Wenn das Kanalbyte zwischen 1 und 4 ist werden entsprechende Variablen mit dem Wert des Timers überschrieben, sie Stellen also die Position der Knüppel am Sender dar.
Nur das Problem an der Sache: Angefangen hab ich mit einem Prescaler von 1024, wollte sehen wie hoch der Zähler denn kommt. Aber beim Befehl "print" kam nur 0 raus. Laut meinen Berechnungen müsste der Timer aber bei einer Impulsdauer von 2ms bis knapp über 30 zählen. Als ich direkt den Timerwert ausgelesen hab' kamen dann 36 bei "roll" raus, aber der Wert änderte sich nicht bei verändern der Impulsdauer (also wenn man den Knüppel am Sender bewegt).
Bei einem Versuch, einen 1 Sekundentakt herzustellen fiel mir auf dass der berechnete Wert garnicht stimmte. Vll. auch ein Programmfehler von mir.
Ich wäre euch sehr dankbar wenn ihr mir beim Thema Timer weiterhelfen würdet, komme auch mit den Infos aus dem RN-Wissen nicht weiter. Hab mich bis jetzt noch nicht allzu sehr damit beschäftigt.