PIC avbrott

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
hammond
Inlägg: 10
Blev medlem: 4 december 2007, 19:22:53
Ort: Norrköping

PIC avbrott

Inlägg av hammond »

Hej

Skickar värden till hyperterminalen med seriekommunikation(pin,RC6/TX/DT) det funkar bra. Ska nu ta emot en fil(rättare sagt bara siffran 1 eller 2, för att skifta mellan AN0 och AN1 som A/D ingång). Hur löser man det med avbrott? Avbrott när något kommer in på serie ingången sen läsa av RCREG för att ändra ingång.

Processor PIC18f452
Språk: Assambler, svar med C-kod undanbedes

Mvh Niclas
jbulow
Inlägg: 114
Blev medlem: 22 juni 2006, 21:35:26
Ort: Malmö

Inlägg av jbulow »

Om ingen annan hjälp dyker upp kanske det ändå kan vara till hjälp med lite C-exempel som är på väldigt låg nivå och lätta att mappa direkt på asm: http://www.isk.kth.se/kursinfo/6b4059/comprog/usart.htm
hammond
Inlägg: 10
Blev medlem: 4 december 2007, 19:22:53
Ort: Norrköping

Inlägg av hammond »

Stod inte mycket om avbrott. Mest om initiering av seriekommunikation och det är redan fixat.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Snoka vidare på sidan, har själv använt den.
Den går igen avbrott och enheldel mer, perfekt för nybörjaren som redan kan lite C.

http://www.isk.kth.se/kursinfo/6b4059/kursprogvt07.htm
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Du måste nog precisera Din fråga lite mera. Vad är det som vållar Dig problem?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Hur löser man det med avbrott?

1. Du kollar vilket avbrott som gäller för just USART-RX.
2. Du sätter upp de register som berör avbrott så att avbrottet från USART-RX är "på".
3. Du ser till att ha en avbrottsrutin som tar han om tecknet som kommer
4. Du byter ADC kanal (antingen i ISR'e, eller i huvudkoden).
hammond
Inlägg: 10
Blev medlem: 4 december 2007, 19:22:53
Ort: Norrköping

Inlägg av hammond »

Marta: ett program exempel vore trevligt. t.ex. Låt ett program rulla(vilket som helst) sen så fort något kommer in på ben 26(RC7/RX/DT) så skall ett interrupt inträffa.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Tja, Du gör som Sodjan beskriverr. Set till att en ISR finns på plats och enabla sedan interrupt för UART samt se till att ev. andra enable-bits ochså är satta. Det finns garanerat en GIE (eneral Interrupt Enable) och kanske även en till för att enable periferienheternas interrupt.

I ISR måste Du sedan spara undan status och accumulator för att återställa dem efteråt. Du måste även cleara UART's interruptflagga.

För att göra det riktigt som det skall bör Du även kontrollera interruptflaggan innan och inte ta för givet att interrupt kommer från UART. Har Du flera interruptkällor är detta nödvändigt.

Har inget exempel på hur man görmed UART, men läs i databladet om interrupt. Där finns allt som behövs, inklusive kodsekvenser för att spara/hämta register på ett sådant sätt att statusregistret inte blir fel.
hammond
Inlägg: 10
Blev medlem: 4 december 2007, 19:22:53
Ort: Norrköping

Inlägg av hammond »

SKulle detta funka(om man nu struntar i spara undan grejer)

list p=18f452
include "p18f452.inc"
cblock H'20'


endc
org H'0'
goto Start
org h'000008'
goto interrupt

Start


bsf INTCON,PEIE
bsf INTCON,GIE
bcf TRISC,6
bsf TRISC,7
bcf TXSTA,BRGH
movlw D'32'
movwf SPBRG
bcf TXSTA,4
bsf TXSTA,5
bsf PIE1,5
bsf RCSTA,4

Start
huvudprogram

interrupt
nop
retfie


end
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det saknas kommenterer, så det går tyvärr inte speciellt lätt att läsa.
Men jag kan inte hitta xxIE flaggan för RX (minns inte vad den heter,
kolla databladet). ISR'en måste cleara mostsvarande xxIF flagga också.
Men allt det där finns beskrivet i databladet.

Men *i princip* så...
hammond
Inlägg: 10
Blev medlem: 4 december 2007, 19:22:53
Ort: Norrköping

Inlägg av hammond »

Jo ISR ska ju cleara. Men skrev bara in en snutt där syftet var att komma till ISR:en. Men såg att jag hade interrupt vektorn fel på riktiga koden. Ska prova imorgon. Så går det när man bara har en pic16f877 manual i papper och inte orkar scrolla i pic18 pdf;)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> och inte orkar scrolla i pic18 pdf;)

Det skulle du ha sagt från början, så hade jag sluppit
lägga tid på det här. Lycka till...
hammond
Inlägg: 10
Blev medlem: 4 december 2007, 19:22:53
Ort: Norrköping

Inlägg av hammond »

Ledsen för det. Skulle dock inte bli allt för förvånad om jag behöver hjälp ändå. Men som sagt återkommer om så skulle vara fallet.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Du sparar ingen tid på att hoppa över saker i databladet, även om det kan kännas som om det är alldeles för mycket text att vara tvungen att läsa igenom. Det enda som händer om man slarvar med att läsa datablad är att man missar viktiga saker och sedan tar det ännu längre tid.

Angående koden så är sättandet av interrupt enable något avdet sista som init-rutinen skall göra. Innan dess skall allting vara uppsat och Du bör även se till att iterruptflaggan är clearad för att undvikaen inledande interrupt med ett skräptecken.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Skulle dock inte bli allt för förvånad om jag behöver hjälp ändå.

Visst ! Absolut inget problem !
Men det ska vara för att du faktiskt behöver det,
inte för att du är *LAT* och hellre använder andras gratis-tid.

Så gör din hemläxa och återkom när du kört fast (på riktigt)...
Skriv svar