PIC: Två saker samtidigt?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg av XorXaX »

Jodå, det verkar finnas USART på den. Men hur ska jag använda det då?
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg av XorXaX »

Ja det låter ju vettigt, får ta och kolla lite mer på det...
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg 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?
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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...
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg av XorXaX »

Nu har jag tcå olika bud på vad INTCON ska ha för värde, vilket är det rätta? :?:
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg 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 :)
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Min INTCON va bara ett exempel!

on interrupt goto ReadValue ska du ha _innan_ INTCON

//Rille
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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...
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg 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...
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg 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
XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Inlägg 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.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg 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.
Skriv svar