PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prob mit servo timer und adc



mki
10.10.2007, 13:45
hi,
habe ein prob. mit den servos in bascom, der irq wird zwar ausgelöst aber inerhalb des irqs funktionieren die servos nicht :-(





$regfile = "m32def.dat"
$crystal = 14745600
$baud = 115200

$framesize = 32
$swstack = 256
$hwstack = 128


Config Timer1 = Timer , Prescale = 256
On Timer1 Ontimer1
Enable Timer1
Timer1 = 7935

'servo
Config Servos = 2 , Servo1 = Portc.2 , Servo2 = Portc.3 , Reload = 10 ', Timer = Timer2
Config Pinc.3 = Output
Config Pinc.2 = Output

'ADC
Config Adc = Single , Prescaler = Auto , Reference = Avcc , Timer = Timer2

Config Pinb.0 = Output


Enable Interrupts

Declare Sub Stopleft
Declare Sub Stopright
Declare Sub Stopfull
Declare Sub Forwardleft
Declare Sub Forwardright
Declare Sub Rewardleft
Declare Sub Rewardright
Declare Sub Turnleft
Declare Sub Turnright

Declare Sub Ausweichen

Dim Dist1 As Integer
Dim Speed As Integer
Speed = 50

Stopfull


'Now give power to the chip
Start Adc

'Waitms 5000

'Forwardleft
'Forwardright
Waitms 2000
Stopfull

Speed = 10
Do

' W = Getadc(0)

Forwardleft
Waitms 2250
Stopfull
Forwardright
Waitms 2250
Stopfull
Forwardleft
Forwardright
Waitms 2000
Stopfull
Turnleft
Waitms 2000
Stopfull

Waitms 2000
Stopfull

Loop

End

Sub Ausweichen
Dist1 = Getadc(0)
Print "0 value: " ; Dist1
If Dist1 > 19 Then
Print "trunright " ; Dist1
' Stopfull
Turnright
Portb.0 = 1

Do
Waitms 500
Dist1 = Getadc(0)
Print "ausweichen: " ; Dist1
If Dist1 < 19 Then
Stopfull
Portb.0 = 0
Return
Else
Turnright
End If
Loop
End If
End Sub

OnTimer1: 'Interrupt-Routine
Timer1 = 7935
Ausweichen
Return



Sub Stopleft
Servo(1) = 100
End Sub

Sub Stopright
Servo(2) = 100
End Sub

Sub Stopfull
Servo(1) = 100
Servo(2) = 100
End Sub

Sub Forwardleft
Servo(1) = Speed + 100
End Sub

Sub Forwardright
Servo(2) = 100 - Speed
End Sub

Sub Rewardleft
Servo(1) = 100 - Speed
End Sub

Sub Rewardright
Servo(2) = Speed + 100
End Sub


Sub Turnleft
Servo(1) = 100 - Speed
Servo(2) = 100 - Speed
End Sub

Sub Turnright
Servo(1) = Speed + 100
Servo(2) = Speed + 100
End Sub

linux_80
10.10.2007, 22:16
Hallo,


...aber inerhalb des irqs funktionieren die servos nicht :-(

stimmt,
denn der Servo wird von einer eigenen ISR gesteuert, die nicht aktiv werden kann, solange ein anderer IRQ läuft.
Deshalb soll man so lange Programmteile nicht in einer ISR selber erledigen. [-X

Um das zu umgehen, eine Variable als Flag anlegen, die von der Timer-Isr gesetzt wird, und vom Hauptprogramm abgefragt wird (und später wieder zurückgesetzt), und wenn der richtige Wert erkannt wird, wird die gewünschte Routine ausgeführt (vom Hauptprogramm aus).

mki
11.10.2007, 10:15
Hi,
danke für deine Antwort, sowas habe ich mir schon fast gedacht.

dann muß ich das halt anders lösen....

mal ne frage wie kommt ein linuxer zu bascom???

linux_80
11.10.2007, 22:54
Hallo,

zu Bascom ... einfach runterladen :mrgreen:
man hat doch auch eine Windose hier stehen so als Softwaredeveloper :-)
geht ja leider nicht anders. 8-[