PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo zuckt beim RC Kanal einlesen



BlaueLed
05.12.2008, 19: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

Willa
05.12.2008, 22:27
Mal so als Anfang: "Print" verlangsamt deinen Code ziemlich stark (fast so wie waitms 1). Wenn du den Print Befehl rausnimmst und statt dessen eine Servoposition stellst, dann könnte es sein dass dein Code einfach zu schnell läuft. Versuchs doch mal ohne den Servobefehl (mit einer eigenen Servo Routine) oder verlangsame deinen Code per Waitms oder so.