Interrupt vid påslag?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Interrupt vid påslag?

Inlägg av mrhedin »

Tjena! (AtMega8, C)

När man togglar interrupt på och av, genererar det i sin tur en interruptsignal?

Jag har fallet:

clearbit(SREG, 7); // Deaktivera interrupt globalt inför funktion.
lcd_skriv_flera_tecken("BrunSune");
setbit(SREG, 7); // Aktivera interrupt globalt efter funktion.

och när interrupt aktiveras igen efter sista bokstaven skrivits ut på displayen så indikeras att jag fått ett interrupt(den koden finns inte med, blinkar en diod om jag får interrupt).

Finns det något vis att undvika att det blir ett interrupt när jag slår på?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Alltså, du stänger ju av alla interrupt p.g.a av att du har en "känslig" rutin som du inte vill ha avbruten, eller hur ?

Men om det händer något under tiden (som globala interrupt är avstängt) som normalt skulle ha genererat ett interrupt ? Vill du inte att den händelsen skall tas om hand efteråt ? Eller är det OK att "missa" den ?

Nu kör jag PIC, men jag finner det mycket osannolikt att enbart aktivering av globala interrupt skulle generera ett interrupt i sig. Det måste ha "hänt" något under tiden.

Nu kan det ju vara så att man faktiskt inte vill ta hand om händelser som har inträffat under tiden som globala interrupt var avstängt, men då är det väll bara att "nolla" alla rellevanta interupt-flaggor precis innan man aktiverar interrupt igen.

Så, det beror väll på vad *du* vill ska hända.

Notera att detta är lite generellt, jag "kan* inte AVR specifickt... :-)
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Tackar så mycket sodjan!

Det är nog just den där flaggan som är problemet, för jag är nämligen inne och pillar på INT0 pinnen i LCD-funktionen. Jag trodde inte att flaggorna sattes när interrupt var avstängt globalt.

Det spelar heller ingen roll om jag "missar" det där interruptet heller.

Nån som kan AVR och vet hur man nollar interruptflaggor innan jag kan slå på igen?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag trodde inte att flaggorna sattes när interrupt var avstängt globalt.

"Trodde" ?? Är databladet otydligt kring detta ??

Normalt (d.v.s på en PIC :-) ) sätts alla flaggor även när interrupt är avstängt "globalt", naturligtsvis är detta för att man inte skall missa några interrupt !

Det enda som händer är att anropet av ISR'en fördröjs tills interrupt aktiveras igen globat. Helt normalt, och så som man vanligtsvis vill att det fungerar.

Jag är övertygad om att AVR fungerar likadant i detta avseende.

> Nån som kan AVR och vet hur man nollar interruptflaggor innan jag kan slå på igen?

Skulle förvåna om inte "clearbit" fixar det. Vad är det för skillnad på interrupt flaggorna och "(SREG, 7)" ??
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

Så här ligger det till...

Alla datablad är otydliga när man inte läst dom ordentligt =)

Precis som vanligt =), the PICway, så sätts interruptflaggor på AVR även när interrupt inte är aktiverat, alltså inte tillåter ett avbrott just då.

Så när man slår på interrupt igen och det ligger en interruptflagga och lurar som blivit satt under tiden som det var avstängt, så kommer det att avbryta processorn då istället.

Nu när jag i detta fall inte bryr mig om de interrupts som hänt under tiden och inte vill ha ett avbrott när jag tillåter dem igen, så tas flaggan bort genom att sätta bit 6 i GIFR registret.
setbit(GIFR, 6);

>Skulle förvåna om inte "clearbit" fixar det. Vad är det för skillnad på interrupt flaggorna och "(SREG, 7)" ??

Skillnaden mellan SREG och GIFR ligger till så här, förklarar även GICR.

setbit(SREG, 7);
Processorn kan bli avbruten för alla interrupts. Som ställs in i...

setbit(GICR, 6);
Ställer in att INT0 får avbryta processorn om det händer nåt där som ställs in i...

clearbit(MCUCR, 0); // Ger interrupt vid negativ flank in på INT0-pinnen.
setbit(MCUCR, 1); // Ger interrupt vid negativ flank in på INT0-pinnen.

Händer just detta flaggas (GIFR, 6) till 1. Är nu allt inställt som ovan så avryts processorn och kör:

SIGNAL(SIG_INTERRUPT0)
{
}

om man har en sån.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vad jag menade var inte vad de olika flaggorna har för funktion, utan varför man inte kunde använda clearbit även för de individuella interrupflaggrna.

Du hade ju redan använt clearbit till den globala flaggan (i det första inlägget), sedan (i det andra inlägget) och frågade hur man "nollade" de andra flaggorna, så jag fick inte ihop det...

Men, det hela verkar väll helt klart nu, eller hur ?

En liten detalj, har inte de olika bitarna i de olika registren också symboliska namn ??

Till sist, är dete inte "clearbit(GIFR, 6);" du skall göra innan aktiveringa av interrupt igen ?

> Alla datablad är otydliga när man inte läst dom ordentligt =)

Och innan man har gjort det kommer man att få många problem... :-) :-)
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

>Vad jag menade var inte vad de olika flaggorna har för funktion, utan varför man inte kunde använda clearbit även för de individuella interrupflaggrna. Du hade ju redan använt clearbit till den globala flaggan (i det första inlägget), sedan (i det andra inlägget) och frågade hur man "nollade" de andra flaggorna, så jag fick inte ihop det...

Ok, det var nog jag som missuppfattade. Jag gör skillnad i en bit som jag sätter själv och en som processorn sätter under drift. Jag vill kalla den förstnämnda för kontrollbit och den sistnämnda för flagga även om de är samma saker egentligen.

>En liten detalj, har inte de olika bitarna i de olika registren också symboliska namn ??

Jo de har symboliska namn också, tror att setbit(GIFR, INTF0); skulle funka lika bra (har inte testat).

>Till sist, är det inte "clearbit(GIFR, 6);" du skall göra innan aktiveringa av interrupt igen ?

Inte enligt Atmel8 datablad, s.66, och min kod som funkar nu =)
Alternatively, the flag can be cleared by writing a logical one to it.

Hela den här tråden startade med att jag inte läst databladet tillräckligt, men det är ju helt klart mer givande att fråga på ett forum än läsa datablad =). Vi har ju fått rett ut en del =)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag gör skillnad i en bit som jag sätter själv och en som processorn sätter under drift. Jag vill kalla den förstnämnda för kontrollbit och den sistnämnda för flagga även om de är samma saker egentligen.

Jag tror att det är enklast att kalla alla bitar för samma namn som databladet använder.

> tror att setbit(GIFR, INTF0); skulle funka lika bra

Och betydligt mer lättläst, både för dig och för alla andra. :-)

> Alternatively, the flag can be cleared by writing a logical one to it.

Något i stil med "the interrupt condition can be cleared by writing a logical one to the flag" hade varit bättre.

Som jag ser det så är "to clear a flag" = att skriva en "nolla" till den, och "to set a flag" = att skriva en "etta" till den.
Senast redigerad av sodjan 26 september 2005, 23:01:39, redigerad totalt 1 gång.
mrhedin
Inlägg: 114
Blev medlem: 3 maj 2005, 19:46:24
Ort: Trollhättan/Kiruna
Kontakt:

Inlägg av mrhedin »

>Och betydligt mer lättläst, både för dig och för alla andra.

Jag får nog testa ändå då å se =)

>Något i stil med "the interrupt condition can be cleared by writing a logical one to the flag" hade varit bättre.
>Som jag ser det så är "to clear a flag" = att skriva en "nolla" till den, och "to set a flag" = att skriva en "etta" till den.

Jo jag håller helt klart med dig där...

Tack för hjälpen förresten! Du kläckte ju problemet med att det var en flagga som var satt fel...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jupp.

Den viktigaste skillnaden mellan "setbit(GIFR, 6)" och "setbit(GIFR, INTF0)", är att i det första fallet måste man plocka fram databladet för att veta vilken funktion bit 6 i GIFR har, i det andra fallet ser man det direkt...
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

Tack för den! :) Visste inte att det gick att göra så. Det är mycket lättare att se vilken bit man satt om man 'skrivet ut det', speciellt när det rör sig om register man inte använder så ofta.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

För att spinna vidare på samma tema...

Antag att koden skall flyttas till en annna processor modell. Antag också att processortillverkaren har valt att flytta runt flaggorna lite i registret. Det ena (symboliska) skrivsättet fungerar då direkt, medan det andra måste justeras manuellt...
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

When an event on the INT1 pin triggers an interrupt request, INTF1 becomes set (one). If the I-bit in SREG and the INT1 bit in GICR are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT1 is configured as a level interrupt.

sodjan: Jag ser inte vad som ar otydligt med det. Det star exakt vad man vill att det ska sta...

mrhedin: Att stanga av och satta pa interrupts globalt ar sa ofta anvant att det finns speciella instruktioner for det.

sei - aktiverar interrupts globalt
cli - inaktiverar interrupts globalt

I C anropar man sei() och cli().

Sa du kan andra din kod till det har:

Kod: Markera allt

cli(); // Deaktivera interrupt globalt inför funktion.
lcd_skriv_flera_tecken("BrunSune");
sei(); // Aktivera interrupt globalt efter funktion.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> When an event on the INT1 pin triggers an interrupt request, INTF1 becomes set (one).

OK, jag är med. "set"/"one"/"high"/"1" eller vad man vill kalla det.

> The flag is cleared when the interrupt routine is executed.

OK, alltså "clear"/"zero"/"low"/"0"... Fortfarande med, så vitt jag förstår.

> Alternatively, the flag can be cleared by writing a logical one to it.

Här tappade jag tråden...
Jag förväntade mig "writing a ogical zero"...

> This flag is always cleared when INT1 is configured as a level interrupt.

Och betyder "cleared" här "0" eller "1" ??

Eller är "a logical one" = "0" ?
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

>Och betyder "cleared" här "0" eller "1" ??
cleared är alltid en logisk nolla dvs 0

>Eller är "a logical one" = "0" ?
NEJ logisk etta respektive nolla är alltid 1 och 0

//rickeboy
Skriv svar