Hallo,
Ich klinke mich mal hier ein,da ich ein ähnliches Problem habe,und hier auf ähnliche Lösungen gestoßen bin ...
Ich will eine Art Servomischer bauen mit größtmöglicher Auflösung,und dann die Servosignale parallel wieder ausgeben. Mit 8 Mhz habe ich jetzt zum einlesen 140 Schritte und zum ausgeben 1000. Timer0 zum einlesen,Timer1 für die Ausgabe.
Code:
'======================================================
'System-Einstellungen
'======================================================
$regfile "m8def.dat"
$crystal = 8000000
$framesize = 64
$swstack = 64
$hwstack = 64
$baud = 57600
'======================================================
'Konfigurationen
'======================================================
Config Timer1 = Timer , Prescale = 8
Config Timer0 = Timer , Prescale = 64
Config Int0 = Falling
Config Portb = Output
Config Portc.0 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Rc_kanal1 Alias Portd.4
Rc_kanal2 Alias Portb.6
Rc_kanal3 Alias Portb.7
Rc_kanal4 Alias Portd.5
Rc_kanal5 Alias Portd.6
Rc_kanal6 Alias Portd.7
Rc_kanal7 Alias Portb.0
Dim Servo(10) As Word
Dim Empf(10) As Byte
Dim Empf_mw(10) As Byte
Dim Meanrx(10) As Word
Dim Kanal As Byte
Dim Channel As Byte
Dim Kanal1 As Integer
Dim Kanal2 As Word
Dim Kanal3 As Word
Dim Kanal4 As Word
Dim Kanal5 As Word
Dim Kanal6 As Word
Dim Kanal7 As Word
Dim X As Word
Dim R As Word
Dim N As Byte
Dim I As Byte
'-------------------------------------------------------------------------------
Enable Interrupts
Timer1 = 63000
Enable Timer0
Enable Timer1
Enable Int0
Start Timer0
Start Timer1
On Timer1 Rc
On Timer0 Sync Nosave
On Int0 Messen Nosave
'-------------------------------------------------------------------------------
Do
For I = 1 To 5
Meanrx(i) = Meanrx(i) * 3
Meanrx(i) = Meanrx(i) + Empf(i) '"lowpass filter" of the RC signal
Shift Meanrx(i) , Right , 2 ' (=divide by 4)
Empf_mw(i) = Meanrx(i)
Next
Kanal1 = Empf_mw(1) - 100
Kanal1 = Kanal1 * 7
Servo(1) = 64000 + Kanal1
Servo(2) = 63500 + X
Servo(3) = 64500
Servo(4) = 64100
Waitms 10
If X = 1000 Then R = 1
If X = 0 Then R = 0
If R = 1 Then X = X - 5 Else X = X + 5
'(
Print Empf(1) ; " CH1"
Print Empf(2) ; " CH2"
Print Empf(3) ; " CH3"
Print Empf(4) ; " CH4"
Print Empf(5) ; " CH5"
Print Empf(6) ; " CH6"
Print " "
Waitms 100
')
Loop
End
Messen: 'Timer0 läuft bei jedem Kanal über (Preload 150)
!PUSH R16
!IN R16, SREG 'Dadurch höhere Auflösung (100+-70 Schritte -> 140)
!PUSH R16
!LDS R16, {channel}
!INC R16
!STS {channel}, R16
!SUBI R16, 2
!CPI R16, 8
!BRCC NotInRange
!PUSH XL
!PUSH XH
Loadadr Empf(1) , X
!ADD XL, R16
!CLR R16
!ADC XH, R16
!IN R16, TCNT0
!ST X, R16
!POP XH
!POP XL
!NotInRange:
!LDI R16, 0
!sts {N},r16
!LDI R16, 150
!OUT TCNT0, R16
!POP R16
!OUT SREG, R16
!POP R16
'( So sieht der asm Teil in Basccom aus
If Channel > 0 And Channel < 8 Then
Empf(channel) = Timer0
End If
Timer0 = 150
Incr Channel
N = 0
')
Return
Sync: 'Synchronimpuls Auswertung
Push r24
in r24,sreg
push r24
lds r24,{N}
inc r24
cpi r24,2 'wennkleiner 2 ist
BRLO no_sync
Channel = 0
No_sync:
sts {N},r24
pop r24
!out sreg,r24
pop r24
Return
Rc: 'Servosignalausgabe
Incr Kanal
Rc_kanal1 = 0
Rc_kanal2 = 0
Rc_kanal3 = 0
Rc_kanal4 = 0
Timer1 = Servo(kanal)
Select Case Kanal
Case 1 : Rc_kanal1 = 1
Case 2 : Rc_kanal2 = 1
Case 3 : Rc_kanal3 = 1
Case 4 : Rc_kanal4 = 1
Case 5 : Timer1 = 50000
Kanal = 0
End Select
Return
So. Und das alles funktioniert dank Inline asm fast Jitterfrei. Jetzt würde ich aber gerne die Servoausgabe auch in asm schreiben - in der Hoffnung das dann die sporadischen Zucker (alle 3-5s) weg sind.
Code:
Rc: 'Servosignalausgabe
Incr Kanal
Rc_kanal1 = 0
Rc_kanal2 = 0
Rc_kanal3 = 0
Rc_kanal4 = 0
Timer1 = Servo(kanal)
Select Case Kanal
Case 1 : Rc_kanal1 = 1
Case 2 : Rc_kanal2 = 1
Case 3 : Rc_kanal3 = 1
Case 4 : Rc_kanal4 = 1
Case 5 : Timer1 = 50000
Kanal = 0
End Select
Return
Ich habe auch schon eine Idee und würde das mit meinen begrenzten asm Kenntnissen auch irgendwie hinbekommen,nur habe ich bei der Übersetzung folgender Zeile Probleme (Word Array) und weiß nicht wie ich vorgehen soll:
Code:
Timer1 = Servo(kanal)
f. programme bitte "CODE"-Tags verwenden (QUoTE ist für Zitate)PicNick Mod
Gruß
Andreas
Lesezeichen