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.

Kod: Markera allt

INTCON = %11000000              
PIE1.5 = 1
...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å :wink:
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.