C51 Serijos pertraukti

G

GrandAlf

Guest
Naudojant Atmel 89S8253 Radau man reikia atidžiai stebėti serial port.Ne tikrai naudojami pertraukinėja bet labai laipsnio, kaip aš visada atrodo, kad jie yra sunkiau derinimo_O stebėtinai man atrodo, kad po įsteigimo pertraukti 4 naudojant 1 jis dirbo gerai, bet likusios programos vyko tikrai lėtai Manau apie 20% normalaus greičio.Išbandžiau su skirtingais laikmaèiai su paties rezultato.Mes nustatėme, kad rodyti atskirą užduotį stebėti uosto buvo daug greitesnis.Aš naudoju vėlavimų ir watchdog į prog, ir nenuostabu, jeigu tai jokio atrama.Aš šį gana keistai, ir nenuostabu, jei tai yra normalus elgesys.Naudojant Ke * l Kompiliavimo Btw.Visi komentarai laukiami.

 
Programa veikia lėtai galėtų būti vienas iš šių įrašų:
Jūsų nutraukti nutinka dažnai
Jūsų nutraukti įprastinį bando daryti per daug ir todėl naudojant 80% perdirbimo metu.
Vėlavimas į prog turėtų jokio skirtumo
Valdikliai gali būti naujo procesoriaus?Pabandykite turning it off.Aš paprastai tik kad po aš padariau mano galutinis išbandymas, kitaip jis gali maskuoti klaidas

 
Ačiū už patarimus, aš pabandyti išjungti DD ir žiūrėsime kas atsitiks.Žinau, jis turi tik kaina keletą laikrodis ciklų teorijos.Galbūt tiesiog padaryti kažką kvaila.Max vanessa99, Sveiki atvykę į bortą.Išbandykite ir paklausti ar atsakyti į klausimus, o ne tiesiog "hello".

 
serijos nutraukti nėra problema

bet visada laikyti nutraukti paprastas ir mažas, kad jūsų paraiška nebus įvykdytas

ir taip pat nutraukti atsiradimo laikotarpis poveikio programos vykdymo metu

taip patikrinti savo kodą ir pasakyti, kas yra tikroji problema yra

 
DD turėtų olny imtis ciklus, kad Jūs išleidžiate sąrašo atnaujinimą.Be to, neturėtų jokio poveikio, nebent tai yra laiko ir naujo procesoriaus.Kokia kalba Jūs naudojatės?

 
Aš naudoju "Keil C51 C
Aš padariau tai tik kaip bandymas.

unsigned char test; / / deklaruojamas ne funkcija
/ / Serial globalinis pertraukinėja įjungtas

statinė tuščia serial_isr (tuščia) nutraukti 4 taikant 2
(
jei (TI) return; / / Ar aš galiu tai padaryti ignoruoti perduoda Ints?
jei (RI) bandymas = SBUF;
)

Net be serijos veiklos bendra programa veikia labai lėtai.Negalima suprasti, ar aš kažką trūkstamų akivaizdu čia.

 
Tai buvo seniai, nes aš dirbau su 8051, bet manau, kad reikia nustatyti TI = 0 & RI = 0 savo pertraukti įprastas, net jei norite ignoruoti duomenis.
Išjungti DD.Taip pat įsitikinkite, kad jūsų kamino nėra GBP.
Jei tai nepadeda, galbūt jums reikia parodyti savo kodą taip, kad žmonės galėtų suprasti, kai problema yra

 
Thanks for the info.Aš pavėlavau iš naujo RI tik literówka mano dalis,
todėl ten faktinis kodas.Ar pabandyti dar kartą ir atkurti TI, norėdami pamatyti, kas vyksta.Tiesiog bando pagrindinio kasdieninį prieš išleidimą į pagrindinę kodą.

 
GrandAlf rašė:

Aš naudoju "Keil C51 C

Aš padariau tai tik kaip bandymas.statinė tuščia serial_isr (tuščia) nutraukti 4 taikant 2

(

jei (TI) return; / / Ar aš galiu tai padaryti ignoruoti perduoda Ints?

jei (RI) bandymas = SBUF;

)
 
Thanks guys visų jūsų pagalba.Kad atrodo Problemos, tolesnis svarstymas patvirtina, kad reikia aiškios ir.Kaip reikia naudoti printf per prog tam tikru momentu, aš manau aš dabar reikia išjungti / įjungti ES pradžioje / gale kiekvieno spausdinti eilutę.

 
priklausomai nuo to, kaip dažnai duomenys atvyksta būdas tai padaryti yra sukurti FIFO, kad bus parašyta, kad pagal nutraukti ir skaityti savo pagrindinės linijos.Jūs turėtumėte visada deklaruoti kintamieji naudojami tokiu būdu, kaip "nepastovi" Jūs turite įsitikinti, kad jūsų duomenys į FIFO nėra perrašomi pagal gaunamus duomenis.Jei duomenų ateis greičiau, nei tai, ką skaitote / procesą, tuomet jūs turite kokių nors ryšio jūsų Comms uosto

 
Tai mano galutinis ketinimą.Tiesiog bando paprastą diegimą, siekiant įrodyti sąvoka.Ne tikrai veikia kaip tikėtasi iki šiol.Ką aš bandome daryti yra gauti kartais vieną baitų SI tada formatu ir spausdinti juos SO su printf.Kaip man rodyti 300 Baud, užtrunka šiek tiek, o spausdinti, todėl idėja buvo buferio, kad nepraleisti bet, kad atėjo per spausdinimo procesą.Visi veikia puikiai, kol aš stengiuosi ir naudojimas nutrūksta,
o tada pasirodo į darbą, tada tik avarijų mane.Aš Bordiura beveik naudoja mano atminties, ir įdomu, ar kuris gali būti problema.Nebus rodomi Realaus laiko OS užduotis arba, galbūt pačios priežasties.Ar tiesiog palikti jį.Parašytas po 23 minučių:Kaip aš naudoju išoriškai deklaruojamos kintamąjį kaip man reikia perduoti vertė negali naudoti isr's kaip funkcija su grąžinimo kursą.tai gali būti problema.Ar turite galvoti apie kitą būdą.

 
Būkite atsargūs naudojant funkcijas kaip printf į pertraukti.Ne visos bibliotekos funkcijas naujo rinkos dalyvio, kad jie bus sukelti problemų interrupts.Pabandykite padaryti formatuoti savo kodą ir bandyti išvengti naudojant biblioteką kodas.Tada bent jau jūs tiksliai žinoti, ką kodas atlieka savo pertraukti.Įsitikinkite, kad turite pakankamai kamino paskirstytos.
Ar Google paieškos dėl Keil c51 serijos nutraukti pavyzdys - jūs turėtumėte rasti daug

 
Thats naudingų patarimų ir much appreciated.Aš valdo dabar, kad gautumėte Realaus laiko OS tai gana daug, ką aš noriu, kad atsisakė nutraukti metodas šiuo metu.Aš išmokti keletą dalykų, nes everyones pagalbos, ir esu labiausiai dėkingas.

 
Po daug Messing apie rasti I
can't use Realaus laiko OS arba nutraukti dėl barana apribojimai.Kaip alternatyva, aš nusprendė pabandyti serijos skaityti įprastas, kad yra maždaug kas 50ms.Jos idėja yra sukurti pasaulinę masyvas, tada parašyti, kad vėliau paskui jį perskaityti vėliau pagrindinė.Pavyzdžiui kodas yra parodyti idėją:

/ / ne funkcijas
unsigned char idata kodas [80];

/ / Duomenys skaitinė vertė nuo 1 iki 80 duomenys patys kaip pozicijos, ty jeigu sbuf 50 tai eikite į pos 50

tuščia store_data (void) / / vadinamas dažnai
(
unsigned char indeksas;
jei (RI)
indeksas = SBUF;
(kodas [index] = SBUF / / daro Sbuf vertę kodas
RI = 0;
))

Dabar pagrindinis, aš kilpą kad sakoma per visus 80 vietų, ir jeigu ji nustato, viena> 0 iškelia vertė į pasaulinį kintamąjį, tada aktų jai ir vykdo šį procesą, kol ne daugiau svarbūs numeriai.Tarp kiekvienos skaityti iteraciją, kad store_data funkcija yra vadinama.Atrodo raštu ok, bet jei taip, visi atrodo 0.Aš bandė padaryti masyvas nepastovi, jokio skirtumo nors.Aš kažką fundamently wrong here?.Advice appreciated.Po 5 minučių:Tai ne darbo kodekso, skliausteliuose neteisingai pradėti.ust parodyti bendrą idėją

 

Welcome to EDABoard.com

Sponsor

Back
Top