Hallo,
ich bin seit einigen Tagen dabei eine Schaltung für ein RC-Modell zu programmieren. Dabei soll ein Empfängerkanal ausgewertet werden um Funktionen vom Sender aus zu schalten.
Soweit klappt das auch ganz gut, nur die gemessenen Zeiten hauen nicht ganz hin.
Der Impuls ist ja von 1ms bis 2ms lang (Mittelstellung also 1,5ms)
Mit diesem Programm habe ich mir eine kleine Test Schaltung erstellt wo die Werte auf dem LCD angezeigt werden:
Die angezeigten angezeigten Werte sindCode:$regfile = "m16def.dat" $crystal = 8000000 Config PORTB.0 = Output Config portb.1 = Output Config portb.2 = Output Config portB.3 = Output Config portB.4 = Output Config portB.5 = Output Config PORTD.2 = Input Config Timer0 = TIMER , PRESCALE = 8 'Timer0 zur auswertung des Empfängerimpulses Config Lcdpin = Pin , Db4 = PortC.0 , Db5 = PortC.1 , Db6 = PortC.2 , Db7 = PortC.3 , E = Portc.5 , Rs = Portc.4 Config LCD = 20 * 4 Config INT0 = FALLING On OvF0 Tim0_isr 'Routine beim Überlauf Timer0 On Int0 Int0_isr 'Routine für externen Interrupt an Int0 (Empfängerimpuls) Enable Interrupts Enable Timer0 Stop Timer0 Enable INT0 Dim imp_memory1 as Bit Dim imp_memory2 as Bit Dim Imp_Flag as Byte Dim Impulszeit as Byte Dim Impuls as Byte Const Timerwert0 = 245 PortD.2 = 1 'PullUp einschalten Timer0 = Timerwert0 'Vergabe von Aliasnamen Pos_Re_Li Alias PortB.0 ACL_WS_Re Alias PortB.1 ACL_WS_Li Alias PortB.2 ACL_RT_Seitenruder Alias PortB.3 ACL_RT_Rumpf Alias PortB.4 Scheinwerfer Alias PortB.5 'Voreinstellen von Variablen Imp_Flag = 0 LCD_Flag = 0 Impulszeit = 0 InitLCD CLS Locate 1 , 1 LCD " Servoimpulstest" Do 'Auswertung des Servoimpulses zum schalten Kanal 1 If Impulszeit >= 95 and Impulszeit <= 119 and imp_memory1 = 0 then If Scheinwerfer = 0 then Scheinwerfer = 1 else Scheinwerfer = 0 end IF Imp_memory1 = 1 End If 'Auswertung des Servoimpulses zum schalten Kanal 2 If Impulszeit >= 50 and Impulszeit <= 70 and imp_memory2 = 0 then If ACL_RT_Rumpf = 0 then ACL_RT_Rumpf = 1 else ACL_RT_Rumpf = 0 end IF Imp_memory2 = 1 End If 'Auswertung des Servoimpulses zum rücksetzen des Memory Flags If Impulszeit >= 85 and Impulszeit <= 90 then imp_memory1 = 0 imp_memory2 = 0 End If Locate 2 , 1 LCD "Impuls:" Locate 2 , 9 : LCD Impulszeit ; " " Loop 'Interruptrotiene Timer0 Overflow Tim0_isr: Timer0 = Timerwert0 'Timerregister voreinstellen incr Impuls Return 'Interruptrotine Int0 Int0_isr: If imp_flag = 0 then Impuls = 0 imp_flag = 1 Start TIMER0 Config Int0 = Rising else Stop TIMER0 Impulszeit = Impuls imp_flag = 0 Config Int0 = Falling end IF Return End
Pos. 1 = 52
Mitte = 82
Pos.2 = 110
Mit meiner gewählten Timerkonfiguration sollte rechnerisch ein Wertebereich von 100 - 200 erreicht werden.
Wenn ich den Prescale des Timers von 8 auf 1 verringere, dann sollten sich die Werte ja eigentlich verachtfachen, das tun sie leider aber nicht.
Meine Frage ist nun:
Ist mein Code in den Interruptroutinen so Zeitintensiv das dieser Messfehler zustande kommt? Denn wir unterhalten uns ja über einen Bereich von 0,XX ms
Oder mache ich einen anderen Fehler (Denkfehler)
Ich würde mich freuen wenn mir da jemand einen Tipp geben kann.
Danke schon einmal im Voraus







Zitieren

Lesezeichen