Sida 1 av 2
PIC avbrott
Postat: 4 december 2007, 19:29:04
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
Postat: 4 december 2007, 19:34:48
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
Postat: 4 december 2007, 19:45:27
av hammond
Stod inte mycket om avbrott. Mest om initiering av seriekommunikation och det är redan fixat.
Postat: 4 december 2007, 19:52:16
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
Postat: 4 december 2007, 20:48:08
av Marta
Du måste nog precisera Din fråga lite mera. Vad är det som vållar Dig problem?
Postat: 4 december 2007, 21:23:21
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).
Postat: 4 december 2007, 21:28:40
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.
Postat: 4 december 2007, 21:40:39
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.
Postat: 4 december 2007, 21:58:16
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
Postat: 4 december 2007, 22:05:28
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å...
Postat: 4 december 2007, 22:24:15
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;)
Postat: 4 december 2007, 23:07:35
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...
Postat: 5 december 2007, 00:04:26
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.
Postat: 5 december 2007, 00:18:27
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.
Postat: 5 december 2007, 09:38:51
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)...