Fórum témák
» Több friss téma |
Cikkek » Egyszerű soros kommunikáció AVR-rel (UART) Egyszerű soros kommunikáció AVR-rel (UART)
Szerző: Fizikus, idő: Jún 12, 2010, Olvasva: 56951, Oldal olvasási idő: kb. 2 perc
Soros kommunikáció megszakításokkalAmint a neve is mutatja, a megszakítások a program normál futását megszakítják. A megszakításokat azon hardver eszközök használják, amelyek azonnali figyelmet követelnek meg, amikor egy esemény bekövetkezik. Például a mikrovezérlő soros port-ját (UART) ki kell szolgálni, amikor egy új karakter érkezik. Ha ez nem történik meg elég gyorsan, akkor az új karakter elveszhet. Amikor egy új karakter érkezik, az UART rendszer egy megszakítást generál. A mikrovezérlő félbehagyja a főprogram futtatását, az adott megszakításhoz tartozó megszakítás kiszolgáló rutinhoz ugrik (ISR). Jelen esetben ez az UART karakter érkezett nevű megszakítás. Ez az ISR beolvassa az új karaktert az UART-ból, és átteszi egy pufferbe, végül törli a megszakítást, majd a mikrokontroller visszatér a főprogramhoz és ott folytatja, ahol félbehagyta. Mindez a háttérben fut, a főprogramot ez nem befolyásolja. Ha programunkban egymás után sok megszakításkérés érkezik, vagy a kód gyorsan következő timer megszakításokat tartalmaz, akkor a főprogram futása lelassul, mert a mikrovezérlő a főprogram és az ISR rutinok között megosztja a processzoridejét (LINK). Azt gondolhatnánk, hogy miért használjuk a megszakításokat és miért nem ellenőrizzük inkább csak egyszerűen az előző fejezetben tárgyalt polling módszerrel, hogy érkezett-e újabb karakter. Nézzünk egy példát. Tegyük fel, hogy van egy 9600 baud (bit/s) sebességű soros portunk (ez kb. 10 kHz). Minden egyes bit elküldése 104 us alatt történik meg, és egy karakter elküldéséhez 10 bitre van szükség (a Start és Stop biteket is beleszámolva). Ezért kb. 1 ms-onként kapunk egy újabb karaktert a porton keresztül. Mint azt korábban láttuk, az AVR UART duplán pufferelt, az utolsó karaktert még azelőtt ki kell olvasnunk, mielőtt a következő karakter teljesen megérkezne (erre, amint láttuk, kb 1 ms időnk van). Annak elkerülése érdekében, hogy ne veszítsünk el egyetlen beérkezett karaktert sem, legalább 1 ms-onként ellenőrizni kell, hogy érkezett-e újabb karakter. Ezért a polling módszer használata esetén egy olyan ciklust kell alkalmaznunk, ami másodpercenként legalább 1000-szer megvizsgálja az UART állapotát és új karakter érkezése esetén kiolvassa a tartalmát. Ez egyszerűen megoldható mindaddig, amíg egyetlen ciklus lefutása soha sem igényel több időt, mint 1 ms. De néhány esetben a főprogramot ezek a ciklusok nagyon meg is bonyolíthatják. Képzeljük el, hogy egynél több I/O eszközt kell kiszolgálnunk, vagy esetleg nagyobb sebességű soros kommunkiációra van szükségünk. Látható, hogy könnyen nagyon bonyolulttá válhat ez az egész. Megszakítások használata esetén, a polling módszerrel ellentétben, nem kell rendszeresen ellenőrizni, hogy érkezett-e új karakter. Mert a hardver fogja jelezni egy megszakításkéréssel, ha újabb karakter érkezett, és a processzor az ISR végrehajtásával időben kiolvassa az új karaktert. Ahelyett, hogy rengeteg processzoridőt arra pazarolnánk, hogy az UART állapotát folyamatosan ellenőrizzük, vajon érkezett-e újabb karakter, most egyáltálan nem kell ezt figyelni, csak beállítjuk a megszakításokat, és a megszakítás kiszolgáló rutinon belül elvégezzük a megfelelő feladatot. A főprogramunkat ez direktben nem befolyásolja, és nem kell speciális követelményeket figyelembe venni. Az UART gondoskodik a küldésről és a fogadásról. A vétel alatt ez az egység gondoskodik a megfelelő mintavételezésekről az Rx lábon, hogy megállapítsa mikor egy, s mikor nulla a fogadott bit értéke. Amikor a teljes bájt vételre került, akkor egy megszakítást küld a vevőegység a kontroller felé, hogy az UART bejövő pufferében a bájt elérhető. A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |