Sida 2 av 3
Postat: 11 oktober 2004, 09:12:13
av XorXaX
Jodå, det verkar finnas USART på den. Men hur ska jag använda det då?
Postat: 11 oktober 2004, 09:56:34
av rickeboy
Interrupt.... dvs när du har fått ngt så har du ett interrupt som kollar upp vad det är du har tagit emot... på så sätt slipper du att ha ngt med det kommunicationen i "main" loopen....
//Rille
Postat: 11 oktober 2004, 14:11:12
av XorXaX
Ja det låter ju vettigt, får ta och kolla lite mer på det...
Postat: 11 oktober 2004, 14:18:56
av rickeboy
Problemet är att man inte vet hur långtid interrupt rutinen tog dvs hur långtid det tog att ta emot och kolla vart servona ska... eftersom man helst ska försöka hålla sig inom 20ms sträcket... men visst... känns inte som om det handlar om några ms iaf...
//Rille
Postat: 13 oktober 2004, 19:50:12
av XorXaX
Hej, jag får det inte att fungerar med interrupt riktigt, vet inte var det är fel.
Kod: Markera allt
include "..\INCLUDES\MODEDEFS.BAS"
DEFINE OSC 4
INTCON = %10010000
s0_out var PORTB.1
s1_out var PORTB.2
servo0 var word
servo1 var word
servo0 = 1500
servo1 = 1500
LOW s0_out
low s1_out
Start:
goto MoveServo
MoveServo:
on interrupt goto ReadValue
s0_out = 1
pauseus servo0
s0_out = 0
on interrupt goto ReadValue
s1_out = 1
pauseus servo1
s1_out = 0
on interrupt goto ReadValue
pauseus (20000 - servo0 - servo1)
on interrupt goto ReadValue
goto MoveServo
ReadValue:
serin PORTB.0, N2400, servo0, servo1
INTCON = $80
resume
END
ANvänder denna kod. och så har jag ett vb-program som skickar positionerna till picen.men det händer ingenting på servorna...
Någon som kan hjälpa mig?
Postat: 13 oktober 2004, 21:17:15
av rickeboy
Du ska bara ha en ON INTERRUPT... se koden som följer...
Kod: Markera allt
ON INTERRUPT GOTO myInt
INTCON = %10010000 ;Turn interupt for RB0/INT ON...
;variabler och konstanter etc
;main loopen
...
;main loopen slutar
;-----------
DISABLE
END
myInt:
;NGT
RESUME
ENABLE
Postat: 13 oktober 2004, 22:21:18
av $tiff
>> XorXaX
Du har väl inte aktiverat interrupten för USARTen.
...borde vara ett steg till i rätt rikting...
Postat: 14 oktober 2004, 10:38:57
av XorXaX
Nu har jag tcå olika bud på vad INTCON ska ha för värde, vilket är det rätta?

Postat: 14 oktober 2004, 11:08:40
av XorXaX
Använder den här koden nu:
Kod: Markera allt
include "..\INCLUDES\MODEDEFS.BAS"
DEFINE OSC 4
INTCON = %10010000
PIE1.5 = 1
s0_out var PORTB.1
s1_out var PORTB.2
servo0 var word
servo1 var word
servo0 = 1500
servo1 = 1500
LOW s0_out
low s1_out
Start:
'serin PORTB.0, N2400, servo0, servo1
goto MoveServo
on interrupt goto ReadValue
MoveServo:
s0_out = 1
pauseus servo0
s0_out = 0
s1_out = 1
pauseus servo1
s1_out = 0
pauseus (20000 - servo0 - servo1)
goto MoveServo
DISABLE
END
ReadValue:
serin PORTB.0, N2400, servo0, servo1
resume
enable
När jag startar picen så ställer sig servona i värderna som står i variablerna servo0 och servo1. Men när jag sedan skicka över nya värden så för de sig ca 20 grader åt nåt håll och sen blir de alldeles slappa... Och skickar man värderna igen så rör dig ytterligare några grader.
Tror jag behöver mer hjälp

Postat: 14 oktober 2004, 13:41:26
av rickeboy
Min INTCON va bara ett exempel!
on interrupt goto ReadValue ska du ha _innan_ INTCON
//Rille
Postat: 14 oktober 2004, 16:40:04
av $tiff
I PICBasic finns det ett kommando som grejar USART-mottagning; HSERIN. Prova använda det istället för det vanliga SERIN för att läsa av rätt buffert och allt detdär som jag inte har koll på
Sen måste du väl använda PortC.7 om du ska utnyttja USARTen...
Postat: 15 oktober 2004, 13:59:04
av XorXaX
ANvänder följande kod:
Kod: Markera allt
include "..\INCLUDES\MODEDEFS.BAS"
DEFINE OSC 4
on interrupt goto ReadValue
INTCON = %10010000
'PIE1.5 = 1
s0_out var PORTB.1
s1_out var PORTB.2
servo0 var word
servo1 var word
servo0 = 1500
servo1 = 1500
LOW s0_out
low s1_out
MoveServo:
s0_out = 1
pauseus servo0
s0_out = 0
s1_out = 1
pauseus servo1
s1_out = 0
pauseus (20000 - servo0 - servo1)
goto MoveServo
DISABLE
ReadValue:
SERIN PORTB.0, N2400, servo0, servo1
INTCON.0 = 0
resume
enable
END
Men får det inte att fungera, någon sm kan modda koden så att den blir att fungera? Problemet är samma som i förgående inlägg av mig...
Postat: 15 oktober 2004, 14:11:46
av rickeboy
Vad är det som skapar interruptet?
INTCON.0 = 0 ska inte vara nödvändigt...
kör med HSERIN som $tiff sa...
//Rille
Postat: 15 oktober 2004, 15:10:34
av XorXaX
Detr fungerar ju inge bättre med HSERIN, interruptet är när den seriella signalen kommer in till picen. med hserin måste man ju köra på portc.7 och äd rkan man väl inte använda någon interupt? hur som helst fungerar det inte för mig iaf.
Går det inte att ha en seriell signal som interrupt?
Ni kan inte skriva om koden som ni vill att den ska vara? För uppenbarligen så kan inte jag det.
Postat: 15 oktober 2004, 19:03:09
av $tiff
>> XorXaX
Du hade visst inte uppfattat vitsen med USART. Det är alltså en ingångsbuffert för asynkron seriell överföring (precis vad du sysslar med här) som kan ta emot seriell data och generera ett interrupt av det. Denna egenskap sköts hårdvarumässigt och just därför måste man använda PortC.7. M.a.o körs den i bakgrunden, och man kan på så sätt säga att PICen klarar av att göra två saker samtidigt, ett litet tag iaf. Ingångsbufferten är på en eller två byte, innan dessa fylls måste programvaran tagit hand om interruptflaggan för att tömma bufferten och tolka vad som skickas till PICen. Detta görs alltså via HSERIN-kommandot i Basic, med stöd av att man konfigurerar de tidigare nämna registren rätt och gör en egen interruptruptrutin.