BlaueLed
05.12.2008, 20:54
Hallo,
ich lese mit hilfe des Int0 und Timer1 einen RC-Kanal ein. Wenn ich mir den berechneten wert über die serielle schnittstelle an den PC schicke, dann kommen die werte je nach Knüppelstellung sauber ohne ausbrecher an. Sobald ich aber ein servo konfiguriere ( über config servos=1 ... ) , dann zucken die werte ( und das Servo ) immer 1-2 nach oben oder unten. An was kann das liegen ?
hier der Code:
$regfile "m88def.dat"
'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000
$baud = 9600
Config Portc = Output
Config Portd = Input
'Angabe der Display-Größe
Config Lcd = 20 * 4
'Konfiguration des Timer1
Config Timer1 = Timer , Prescale = 1
'Konfiguration des INT0
'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change
'================================================= =====
'Deklarationen
'================================================= =====
Dim Reading As Bit
Dim Rc_value As Word
Dim Calc As Word
Dim Location As Word
Dim Error As Bit
'================================================= =====
'Initialisierungen
'================================================= =====
'Zuweisung der Interrupt-Service-Routinen
On Int0 Rc_read
On Timer1 Rc_error
'Timer-Freigabe
Enable Timer1
Stop Timer1
'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts
'Ports initialisieren
Portc = &B11111111
'================================================= =====
'Hauptprogramm-Schleife
'================================================= =====
Do
'LED an bei Fehler (Timer-Überlauf)
Portc.2 = Not Error
Calc = Rc_value - 7000
Calc = Calc / 100
Print Calc
Loop
'Programmende (nur formal)
End
'================================================= =====
'ISR für INT0 - R/C-Kanal lesen
'================================================= =====
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 Then
Start Timer1
Reading = 1
Toggle Portc.0
'Den Timer stoppen mit fallender Flanke
Else
Stop Timer1
Rc_value = Timer1
Timer1 = 0
Reading = 0
Toggle Portc.1
End If
'Error-Bit rücksetzen
Error = 0
Return
'================================================= =====
'ISR für Timer1 - Fehlerhandling
'================================================= =====
Rc_error:
'Error-Bit setzen
Error = 1
Reading = 0
Stop Timer1
Rc_value = 6300
Return
Gruß Kay
ich lese mit hilfe des Int0 und Timer1 einen RC-Kanal ein. Wenn ich mir den berechneten wert über die serielle schnittstelle an den PC schicke, dann kommen die werte je nach Knüppelstellung sauber ohne ausbrecher an. Sobald ich aber ein servo konfiguriere ( über config servos=1 ... ) , dann zucken die werte ( und das Servo ) immer 1-2 nach oben oder unten. An was kann das liegen ?
hier der Code:
$regfile "m88def.dat"
'Angabe der Taktfrequenz (8Mhz)
$crystal = 8000000
$baud = 9600
Config Portc = Output
Config Portd = Input
'Angabe der Display-Größe
Config Lcd = 20 * 4
'Konfiguration des Timer1
Config Timer1 = Timer , Prescale = 1
'Konfiguration des INT0
'Interrupt bei jedem Flankenwechsel (0->1 und 1->0)
Config Int0 = Change
'================================================= =====
'Deklarationen
'================================================= =====
Dim Reading As Bit
Dim Rc_value As Word
Dim Calc As Word
Dim Location As Word
Dim Error As Bit
'================================================= =====
'Initialisierungen
'================================================= =====
'Zuweisung der Interrupt-Service-Routinen
On Int0 Rc_read
On Timer1 Rc_error
'Timer-Freigabe
Enable Timer1
Stop Timer1
'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts
'Ports initialisieren
Portc = &B11111111
'================================================= =====
'Hauptprogramm-Schleife
'================================================= =====
Do
'LED an bei Fehler (Timer-Überlauf)
Portc.2 = Not Error
Calc = Rc_value - 7000
Calc = Calc / 100
Print Calc
Loop
'Programmende (nur formal)
End
'================================================= =====
'ISR für INT0 - R/C-Kanal lesen
'================================================= =====
Rc_read:
'Den Timer starten mit steigender Flanke
If Reading = 0 Then
Start Timer1
Reading = 1
Toggle Portc.0
'Den Timer stoppen mit fallender Flanke
Else
Stop Timer1
Rc_value = Timer1
Timer1 = 0
Reading = 0
Toggle Portc.1
End If
'Error-Bit rücksetzen
Error = 0
Return
'================================================= =====
'ISR für Timer1 - Fehlerhandling
'================================================= =====
Rc_error:
'Error-Bit setzen
Error = 1
Reading = 0
Stop Timer1
Rc_value = 6300
Return
Gruß Kay