afbryder i C sprogkoder

A

AhmedS

Guest
i pic 16f877 der er 14 kilde til interrupts
kunne u fortælle mig, hvis du har to afbryder (lav og høj) i ethvert program (skrive i C-sprog)
hvordan jeg kan kalde afbryder?

i første vi skriver: void interrupt ()
men i anden ??????
((afbryder i C-sprog på højt niveau))

 
Pic 16 familien understøtter ikke afbryde prioritet, alle afbryder har samme prioritet, og der er kun en interrupt vektor.
Den normale procedure er at teste hver flag afbryder du har aktiveret og service til dem, der er indstillet.
For eksempel:
Kode:/*--- Interrupt vector ---*/static void interrupt ISR (void)

(

if (T0IF)

(

Timer 0 afbryde;

)if (TMR1IF)

(

Timer 1 afbryde;

)

if (CCP2IF)

(

Capture afbryde;

)

)

 
Hej,
Jeg vil prøve at skrive en mere generel forklaring nedenfor (jeg vil ikke vedrøre PIC eller nogen specifik μC / μP), i håb om at flere kan læse og forstå de begreber.

Du har aldrig "opkald afbryder" dig selv, i et program.En afbryder ikke fungere, men en begivenhed (som regel uden for dit program, men det kan også være en genereret software), der afbryder den normale flow udførelse, deraf navnet.
Når at opdage en sådan begivenhed, "hardware" er bygget sådan, at det vil stoppe fuldbyrdende dit program og vælge at hoppe og køre fra en forudbestemt adresse (er specifikke for hver μC / μP og kilde).
Dit job er at skrive små rutiner til at tjene disse afbrydelser, og find dem på de rigtige adresser.

Tag Nulstil for eksempel at der er en begivenhed, defineret på alle de μC / μP jeg kender.Når Nulstil sker (pga. RESET signalet holdes nede og derefter løsladt, eller forløbet vagthund timer, eller lav spænding detektor, eller anden grund), vil CPU'en starter fuldbyrdende fra en bestemt adresse.Når du skriver dit program (i C) og angiv main (), vil compileren finde det på den rigtige adresse til dine specifikke CPU, så det vil blive gennemført efter hvert Nulstil begivenhed.

Det er mere eller mindre det samme med andre afbryde kilde (timer, ADC, UART osv.), men da der er flere kilder, skal du lade compileren vide, hvor du skal placere dit lille Interrupt Service Rutiner (ISR), og du behøver at med specifikke pragmas og / eller compiler-specifikke søgeord.
Det kan være, at alle afbryde begivenheder vil bruge den samme adresse til at udføre fra.I sådanne tilfælde skal du bruge til at læse bestemte flag og fastslå kilden og gøre tingene i overensstemmelse hermed, men princippet er det samme.

Afbryde prioriteter er en helt anden sag, og det er bare en måde den hardware vælger at behandle sager, hvor mere end én afbryde begivenhed er aktiv.
For eksempel kan det være, at en timer er færdig med at tælle præcis, når ADC er færdig med at konvertere, men siden (vi siger, at) timeren afbryder Begivenheden har højere prioritet, vil den hardware, vælger at springe og udføre sit ISR først og derefter ADC's .

Nu vil jeg forenklet min forklaring en smule, fordi tingene er, en smule mere kompliceret end dette, men for at afsone en afbryder i C, der handler om alt der er at vide (plus naturligvis læse funky manualen!).

Det er den slags spørgsmål mange har et problem med, men hvis du forstår den simple begreber ovenfor (plus nogle andre nærig problemer, at man aldrig kan komme ud for, hvis du gøre tingene enkle), er der virkelig ingen grund til at undgå at bruge afbryder i din design ( Tværtimod er der store fordele).
Måske en anden kan hjælpe med oplysninger om PIC, som er fremmed for mig.

Arthur

 
Jeg mener, hvis du har to interrupts (ISR) i 1-programmet

hvordan du kan ringe til 2 afbryder i C-sprog???

 
Du dont normalt opkald afbryder, Men
det afbryde flag i Pic er læse / skrive, så hvis du ønsker at afbryde for brand, kan du bare indstille afbryder flag.helst du har lyst.
IE:
T0IF = 1;
vil brand Timer 0 afbryder.

 
AhmedS skrev:

Jeg mener, hvis du har to interrupts (ISR) i 1-programmethvordan du kan ringe til 2 afbryder i C-sprog???
 
i ethvert program, der har 1 afbryder, skriver vi:

void interrupt ()
(
----------
)

void main ()
(
------
)men hvis u har 2 afbryder, hvordan du kan kalde det i programmet????

 
Citat:

men hvis u har 2 afbryder, hvordan du kan kalde det i programmet????
 
AhmedS, trods den sidste bemærkning, vil jeg forsøge at forklare:

Afbryder ikke kaldes.De er udløst af en begivenhed, der sker i hardware.

Jeg tror, hvad du beder om, er: "Hvis jeg har mere end en kilde til interrupts, hvordan kan jeg håndtere dem?"

Svaret er, at alle afbryder i 16F processorer gør programmet kalder bare en adresse, afbryder vektor.Du skrive kode i din interrupt rutiner, der ser på hver af de afbryder flag for at se, der er fastsat.Dernæst skal du service uanset afbryde blev fundet og også rydde afbryde flag, før de vender tilbage.

Det er muligt, at mere end en afbryder opstår samtidigt, eller at den ene opstår, mens en anden er der serviceres.Dette betyder ikke noget, fordi når du vender tilbage til dit primære kode den globale afbryde vil blive tændt igen (GIE bit) og den anden afbryder straks kræver opmærksomhed.

Hvis du ønsker at prioritere de afbryder, skal du blot kontrollere flagene i den rækkefølge, brug så den højeste prioritet er fundet først.

Brian.

 
Det bør nævnes, at koden mellem processoren's hardware interrupt vektor og brugeren adgang til C afbryde funktionen er stærkt gennemførelse afhængig, og også behandles forskelligt med forskellige PIC16 compilers.Derfor er det ikke meget mening at dicuss det uden at fortælle en bestemt compiler produkt.

 
Ah, hvad et spild ...
Citat:

men hvis u har 2 afbryder, hvordan du kan kalde det i programmet????
 

Welcome to EDABoard.com

Sponsor

Back
Top