C51 Serial avbruddsordrelinje

G

GrandAlf

Guest
Bruke Atmel 89S8253 Jeg syntes jeg trengte å følge nøye med den serielle porten.Ikke egentlig brukes avbryter til en stor grad som jeg alltid føler at de er vanskeligere å feilsøke.Snarere overraskende jeg synes at når du setter opp et avbrudd på 4 bruker 1 det virket ok, men resten av programmet gikk veldig sakte vel omtrent 20% av normal hastighet.Prøvd det med forskjellige tidtakere med samme resultat.Jeg fant ut at å kjøre en separat oppgave å overvåke porten var mye raskere.Jeg bruker forsinkelser og vaktbikkje i prog, og lurer på om dette ville ha peiling.Jeg fant dette ganske merkelig, og lurer på om dette er normal oppførsel.Bruke Ke * l compiler btw.Eventuelle kommentarer aksepteres.

 
Programmet kjører sakte kan være ett av følgende:
Ditt avbruddsordrelinje skjer for ofte
Ditt avbruddsordrelinje rutine prøver å gjøre for mye, og derfor bruker 80% av behandlingstiden.
Forsinkelser i prog bør ikke gjøre forskjell
vaktbikkje kan tilbakestille prosessor?Prøv å slå den av.Jeg pleier bare aktivere det etter jeg har gjort mitt endelig testing, ellers kan den maska bugs

 
Takk for råd, vil jeg prøve å deaktivere WD og se hva som skjer.Jeg vet det bare koster noen klokke sykluser i teorien.Nok bare gjort noe dumt.Hi vanessa99, velkommen til styret.Prøv og spør eller svarer på spørsmål, heller enn bare "hallo".

 
serieporten avbruddsordrelinje er ikke et problem

men alltid holde avbruddsordrelinje enkle og små, slik at programmet ikke vil bli berørt

og også avbryte forekomst perioden vil virkningene programmet kjøres tid

så sjekk koden din og fortell hva som er selve problemet er

 
WD skulle olny ta sykluser som du bruker oppdaterer den.Bortsett fra at det skal ikke ha noen innvirkning hvis det er tidsavbrytes og tilbakestilling prosessoren.Hvilket språk bruker du?

 
Jeg bruker Keil C51 C
Jeg har gjort dette som en test.

unsigned char test; / / erklært ute av funksjon
/ / Serial global avbryter aktivert

static void serial_isr (void) avbruddsordrelinje 4 bruker 2
(
if (TI) return; / / Kan jeg gjøre dette for å ignorere overføre ints?
if (RI) test = SBUF;
)

Selv uten serienummer aktivitet hele programmet kjører svært sakte.Forstår ikke helt, eller er det jeg mangler noe åpenbart her.

 
Det er lenge siden jeg jobbet med 8051, men jeg tror at du må sette TI = 0 & RI = 0 i avbruddsordrelinje rutine, selv om du velger å ignorere data.
Deaktiver WD.Påse også at bunken er ikke over.
Hvis dette ikke hjelper kanskje du bør vise koden slik at folk kan finne ut hvor problemet er

 
Takk for info.Jeg savnet ut nullstille RI, bare en skrivefeil på min del, det er det i selve koden.Vil prøve igjen og tilbakestille TI, for å se hva som skjer.Prøver bare grunnleggende rutine før du setter den i hoved koden.

 
GrandAlf wrote:

Jeg bruker Keil C51 C

Jeg har gjort dette som en test.static void serial_isr (void) avbruddsordrelinje 4 bruker 2

(

if (TI) return; / / Kan jeg gjøre dette for å ignorere overføre ints?

if (RI) test = SBUF;

)
 
Takk Fyrene for hjelpen.Det synes å være roten til problemet, videre lesning bekrefter at du trenger å klare begge deler.Som jeg må bruke printf innenfor prog på et tidspunkt, jeg antar jeg vil nå må deaktivere / aktivere ES på begynnelsen / slutten av hver utskriften streng.

 
avhengig av hvor ofte data ankommer måten å gjøre det på er å opprette en FIFO som blir skrevet til av avbruddsordrelinje og lese av main loop.Du bør alltid erklærer variabler brukes på denne måten som "flyktige" Du må sørge for at data i FIFO ikke overskrives av innkommende data.Hvis data kommer inn raskere enn det du leser / behandle den så du trenger en slags handshaking på comms port

 
Det er min beste hensikt.Prøver bare et enkelt oppsett for å bevise konseptet.Ikke fungerer som forventet hittil.Hva jeg prøver å gjøre er å motta sporadiske én byte på SI og format og skrive dem ut på det med printf.Som Jeg kjører på 300 baud, tar det litt tid å skrive ut, slik at tanken var å buffer, så ikke gå glipp av noen som kom inn under utskriften prosessen.Alt virker fint til jeg prøver og bruke avbryter, som da ser ut til å fungere, så bare krasjer på meg.Jeg kanter nær bruke mitt minne, og lurer på om det kan være problemet.Vil ikke kjøre rtos oppgaver heller, trolig samme grunn.Vil bare må holde på det.Lagt til etter 23 minutter:Som jeg bruker en eksternt erklært variabel som jeg trenger å bestå verdi, kan ikke bruke isr
står som en funksjon med retur av kurset.dette kan være årsaken til problemet.Blir nødt til å tenke på en annen måte.

 
Vær forsiktig med å bruke funksjoner som printf i avbruddsordrelinje.Ikke alle av bibliotekets funksjoner er re-deltaker, slik at de vil skape problemer i avbryter.Prøv å gjøre formating med din egen kode, og prøv å unngå å bruke biblioteket koden.Deretter minst vil du vet nøyaktig hva koden gjør i avbruddsordrelinje.Kontroller at du har nok stack fordeles.
Gjør et Google-søk etter en Keil c51 serielle avbruddsordrelinje eksempel - bør du finne mange

 
Det er gode råd og mye verdsatt.Jeg har klart nå å få rtos å gjøre stort sett hva jeg vil, så har forlatt den avbruddsordrelinje metoden for tiden.Jeg har lært noen flere ting på grunn everyones hjelp, og jeg er mest takknemlig for.

 
Etter mye får om jeg synes jeg kan ikke bruke rtos eller avbryte på grunn av ram begrensninger.Som et alternativ, har jeg besluttet å prøve et serienummer lese rutine, som kalles rundt hver 50ms.Ideen er å sette opp en global matrise, deretter skrive til at senere da lese den senere i hovedvinduet.eksempel koden er bare å vise idé:

/ / utsiden av funksjoner
unsigned char idata kode [80];

/ / Data numerisk verdi mellom 1 og 80 Data samme som posisjon
dvs. hvis sbuf 50 ville gå til pos 50

void store_data (void) / / kalles ofte
(
unsigned char indeks;
if (RI)
index = SBUF;
(kode [index] = SBUF; / / Setter Sbuf verdien i koden
RI = 0;
))

Nå i hovedsak har jeg en løkke som leser gjennom alle 80 steder, og hvis den finner en> 0 setter verdien til en global variabel, og fungerer på den, og bærer på prosessen til ikke mer gyldig tall.Mellom hver lese gjentakelse, den store_data funksjonen kalles.Synes å være å skrive ok, men da lese, alle ser ut til å være 0.Jeg har forsøkt å gjøre array flyktige, ingen forskjell om.Gjør jeg noe fundamently feil her?.Råd verdsatt.Legges etter 5 minutter:Dette fungerer ikke koden parentes feil å begynne med.USt viser generelt bilde

 

Welcome to EDABoard.com

Sponsor

Back
Top