PIC: Två saker samtidigt?
Hej, jag får det inte att fungerar med interrupt riktigt, vet inte var det är fel.
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?
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
Någon som kan hjälpa mig?
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
>> XorXaX
Du har väl inte aktiverat interrupten för USARTen.
...borde vara ett steg till i rätt rikting...
Du har väl inte aktiverat interrupten för USARTen.
Kod: Markera allt
INTCON = %11000000
PIE1.5 = 1
Använder den här koden nu:
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
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
Tror jag behöver mer hjälp

ANvänder följande kod:
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...
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
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.
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.
>> 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.
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.