PIC avbrott
PIC avbrott
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
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
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
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
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
> 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).
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).
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.
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.
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
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
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.
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.