{"id":2114,"date":"2021-04-27T16:43:09","date_gmt":"2021-04-27T14:43:09","guid":{"rendered":"https:\/\/www.lammertbies.nl\/comm\/info\/i-o-addressen-en-interrupts-op-de-pc"},"modified":"2021-05-03T00:22:53","modified_gmt":"2021-05-02T22:22:53","slug":"rs-232-io","status":"publish","type":"page","link":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io","title":{"rendered":"I\/O addressen en interrupts op de PC"},"content":{"rendered":"\n<ul class=\"wp-block-list\"><li><a href=\"#intr\">I\/O en IRQ\u2019s, inleiding<\/a><\/li><li><a href=\"#ioir\">PC I\/O en IRQ gebruik<\/a><\/li><li><a href=\"#regi\">Register naar poort conversie tabel<\/a><\/li><li><a href=\"#usin\">Interrupt gebruik op een PC<\/a><\/li><\/ul>\n\n<h2 class=\"wp-block-heading\" id=\"intr\">I\/O en IRQ&#8217;s, inleiding<\/h2>\n\n<p>Seri\u00eble communicatie wordt uitgevoerd door het schrijven van output- en het lezen van input registers van een UART. Een UART (universal asynchronous receiver \/ transmitter) is een IC dat in staat is om parallelle informatie om te zetten naar seri\u00eble gegevens, die over een lijn te transporteren om ze aan de andere kant weer te ontvangen en terug te converteren naar parallelle informatie.<\/p>\n\n<p>De UART registers op PC compatible computers zijn beschikbaar als I\/O poorten die beginnen vanaf een gedefini\u00eberde plaats. Een UART is in staat om de aandacht van software te trekken door een processor interrupt te genereren. Op die manier is het niet noodzakelijk om continu de staat van de seri\u00eble communicatie te controleren binnen een applicatieprogramma.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"ioir\">PC I\/O en IRQ gebruik<\/h2>\n\n<p>Op PC&#8217;s is de register set van een UART beschikbaar in de I\/O adresruimte van de processor. De twaalf registers van een UART zijn via 8 adressen toegankelijk. Om dit te bereiken zijn registers die alleen gelezen of geschreven kunnen worden gecombineerd aanwezig op \u00e9\u00e9n I\/O adres. In twee situaties wordt bovendien een bit (het divisor latch access bit DLAB) in een register gebruikt om verschillende registers te swappen op een I\/O adres.<\/p>\n\n<p>Vier seri\u00eble communicatie apparaten zijn voorgedefini\u00eberd op een PC. De UART&#8217;s voor deze apparaten hebben standaard adressen toegewezen gekregen waarop de registers toegankelijk zijn. De apparaten hebben de namen COM1 tot en met COM4 toegewezen gekregen. Naast een I\/O adres is ook een standaard interrupt niveau aan de UART&#8217;s toegewezen. Omdat op een PC slechts een beperkte hoeveelheid interrupt lijnen beschikbaar zijn worden twee interruptlijnen gebruikt voor vier communicatiepoorten. De software moet de intelligentie bezitten om te detecteren welke UART aandacht nodig heeft als er een interrupt optreedt terwijl meer dan \u00e9\u00e9n UART van hetzelfde interruptniveau gebruik maakt.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Poort<\/th><th class=\"has-text-align-center\" data-align=\"center\">I\/O adressen<\/th><th class=\"has-text-align-center\" data-align=\"center\">IRQ<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">COM1<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x3F8 \u2013 0x3FF<\/td><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">COM2<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x2F8 \u2013 0x2FF<\/td><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">COM3<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x3E8 \u2013 0x3EF<\/td><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">COM4<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x2E8 \u2013 0x2EF<\/td><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><\/tr><\/tbody><\/table><figcaption>Standaard I\/O adressen en IRQ&#8217;s op een PC systeem<\/figcaption><\/figure>\n\n<p>Houd er rekening mee, dat in de tabel alleen de default I\/O adressen staan van XT en AT compatible computers. Op een PS2 systeem worden andere adressen gebruikt. Bovendien zijn de genoemde waarden alleen maar aanbevelingen. Als andere hardware in de computer het noodzakelijk maakt kan het zijn dat een UART op een ander I\/O adres of interrupt lijn geplaatst is.<\/p>\n\n<p>De werkelijke I\/O adressen van de eerste vier UART&#8217;s in de computer zijn opgeslagen in een tabel in het datagebied van het BIOS. Deze tabel start op geheugen adres 0000:0400 en bevat belangrijke apparatuur informatie. Helaas worden alleen de I\/O adressen van de UART&#8217;s opgeslagen. Er is geen informatie aanwezig over de interrupt die wordt gebruikt door een bepaalde UART. Daarom is deze informatie slechts beperkt geschikt voor het identificeren van de seri\u00eble poorten op een computer systeem.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Geheugenadres<\/th><th class=\"has-text-align-center\" data-align=\"center\">Waarde<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">0000:0400<\/td><td class=\"has-text-align-center\" data-align=\"center\">COM1 basis I\/O poort<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">0000:0402<\/td><td class=\"has-text-align-center\" data-align=\"center\">COM2 basis I\/O poort<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">0000:0404<\/td><td class=\"has-text-align-center\" data-align=\"center\">COM3 basis I\/O poort<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">0000:0406<\/td><td class=\"has-text-align-center\" data-align=\"center\">COM4 basis I\/O poort<\/td><\/tr><\/tbody><\/table><figcaption>I\/O adressen in het BIOS data gebied<\/figcaption><\/figure>\n\n<h2 class=\"wp-block-heading\" id=\"regi\">Register naar poort conversie tabel<\/h2>\n\n<p>Zoals gezegd zijn acht I\/O bytes noodzakelijk om alle registers van een UART te kunnen benaderen. In de volgende tabel is aangegeven op welke lokatie elk register kan worden gevonden. Het basis adres zoals dat in de tabel wordt gebruikt is het laagste I\/O poort adres dat door de UART wordt gebruikt. Het schakel bit DLAB kan in het line control register LCR worden gevonden als bit 7 op I\/O adres basis + 3.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th>I\/O poort<\/th><th>Lezen (DLAB=0)<\/th><th>Schrijven (DLAB=0)<\/th><th>Lezen (DLAB=1)<\/th><th>Schrijven (DLAB=1)<\/th><\/tr><\/thead><tbody><tr><td>base<\/td><td><strong>RBR<\/strong> receiver buffer<\/td><td><strong>THR<\/strong> transmitter holding<\/td><td><strong>DLL<\/strong> divisor latch LSB<\/td><td><strong>DLL<\/strong> divisor latch LSB<\/td><\/tr><tr><td>base+1<\/td><td><strong>IER<\/strong> interrupt enable<\/td><td><strong>IER<\/strong> interrupt enable<\/td><td><strong>DLM<\/strong> divisor latch MSB<\/td><td><strong>DLM<\/strong> divisor latch MSB<\/td><\/tr><tr><td>base+2<\/td><td><strong>IIR<\/strong> interrupt identification<\/td><td><strong>FCR<\/strong> FIFO control<\/td><td><strong>IIR<\/strong> interrupt identification<\/td><td><strong>FCR<\/strong> FIFO control<\/td><\/tr><tr><td>base+3<\/td><td><strong>LCR<\/strong> line control<\/td><td><strong>LCR<\/strong> line control<\/td><td><strong>LCR<\/strong> line control<\/td><td><strong>LCR<\/strong> line control<\/td><\/tr><tr><td>base+4<\/td><td><strong>MCR<\/strong> modem control<\/td><td><strong>MCR<\/strong> modem control<\/td><td><strong>MCR<\/strong> modem control<\/td><td><strong>MCR<\/strong> modem control<\/td><\/tr><tr><td>base+5<\/td><td><strong>LSR<\/strong> line status<\/td><td><em>fabriekstest<\/em><\/td><td><strong>LSR<\/strong> line status<\/td><td><em>fabriekstest<\/em><\/td><\/tr><tr><td>base+6<\/td><td><strong>MSR<\/strong> modem status<\/td><td><em>niet gebruikt<\/em><\/td><td><strong>MSR<\/strong> modem status<\/td><td><em>niet gebruikt<\/em><\/td><\/tr><tr><td>base+7<\/td><td><strong>SCR<\/strong> scratch<\/td><td><strong>SCR<\/strong> scratch<\/td><td><strong>SCR<\/strong> scratch<\/td><td><strong>SCR<\/strong> scratch<\/td><\/tr><\/tbody><\/table><figcaption>UART register naar poort conversietabel<\/figcaption><\/figure>\n\n<p>Voor een beschrijving van elk afzonderlijk register:<br\/><a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#RBR\">RBR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#THR\">THR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#IER\">IER<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#IIR\">IIR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#FCR\">FCR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#LCR\">LCR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#MCR\">MCR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#LSR\">LSR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#MSR\">MSR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#SCR\">SCR<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#DLX\">DLL<\/a>, <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/serial-uart#DLX\">DLM<\/a>.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"usin\">Interrupt gebruik op een PC<\/h2>\n\n<p>Het interruptmechanisme dat aanwezig is op een PC wordt geregeld door een interrupt management chip, de programmable interrupt controller PIC. De chip zoals die op de XT gebruikt is, is een 8259A chip geschikt voor het afhandelen van 8 hardware interrupts. Wanneer een interrupt optreedt op \u00e9\u00e9n van de PIC ingangen, dan wordt de INTR ingang van de processor geactiveerd. De PIC is verantwoordelijk van het afhandeling van prioriteiten wanneer twee of meer interrupts op nagenoeg hetzelfde tijdstip plaatsvinden.<\/p>\n\n<p>Om meer hardware te kunnen gebruiken in combinatie met de computer is er vanaf de AT een tweede interrupt controller toegevoegd. Om dit te laten functioneren gebruikt deze tweede controller \u00e9\u00e9n van de originele ingangen van de reeds bestaande PIC. Dit betekent, dat in de AT configuratie slechts 7 interrupt lijnen beschikbaar zijn op de eerste controller en 8 op de tweede. Daardoor zijn er totaal 15 ingangen beschikbaar wat genoeg is voor de meeste toepassingen. Om compatible te blijven met oudere applicaties is de IRQ 2 lijn zoals die op de XT beschikbaar was naar de IRQ 9 ingang geleid van de tweede PIC. BIOS zorgt ervoor, dat bij het binnenkomen van een interrupt op ingang IRQ 9, deze automatisch softwarematig wordt omgeleid naar de originele IRQ 2. Op deze manier wordt de oorspronkelijke interrupt routine voor IRQ 2 aangeroepen, ook al komt het werkelijke signaal nu van IRQ 9.<\/p>\n\n<p>De eerste PIC is toegankelijk op I\/O poort 0x20 en 0x21, de tweede op 0xA0 en 0xA1. Deze poorten moeten door een applicatieprogramma dat interrupts gebruikt voor twee doeleinden worden gebruikt. \u00c9\u00e9n is, dat de PIC moet worden verteld dat interrupts op een bepaalde ingang mogen worden gehonoreerd en doorgezonden naar de processor. Het andere doel is om de PIC te resetten wanneer bij het afhandelen van een interrupt alle noodzakelijke handelingen zijn uitgevoerd.<\/p>\n\n<p>Prioriteit kan een belangrijk gegeven zijn bij seri\u00eble communicatie. De hoeveelheid interrupts die optreedt tijdens het communiceren kan aanzienlijk zijn. Als geen buffering wordt gebruikt zal elke binnenkomende byte worden aangekondigd met een trigger signaal op de interrupt lijn. Als buffering wel aanwezig is (zoals op de meeste op dit moment in gebruik zijnde UART&#8217;s) neemt dit aantal af tot ongeveer \u00e9\u00e9n interrupt op elke veertien binnenkomende bytes. Nog steeds een hoge hoeveelheid interrupts in verhouding tot de binnenkomende informatie. Dit aantal verdubbelt, wanneer ook het versturen van gegevens interrupt gestuurd gaat, laat staan wat er gebeurt als ook de modem signalen worden gecontroleerd door interrupts.<\/p>\n\n<h3 class=\"wp-block-heading\">Interrupt service routines<\/h3>\n\n<p>Het stukje software dat wordt gestart als een interrupt optreedt wordt een interrupt service routine, of ISR genoemd. In het BIOS data gebied wordt een tabel bijgehouden<br\/>van het startadres van alle mogelijke routines. Deze tabel is opgeslagen in de adres range 0000:0000 tot 0000:0400. Er zijn totaal 256 routines aanroepbaar (waarvan de meesten alleen voor software toegankelijk zijn). Standaard worden de hardware interrupts afgevangen door een klein stukje BIOS routine dat de interrupt controller reset en dan stopt. Om in eigen software interrupts te kunnen gebruiken moet deze standaard routine door een eigen stuk software worden vervangen.<\/p>\n\n<p>Het startadres van een ISR in de BIOS tabel kan worden veranderd door de bytes direct te veranderen op de ge\u00ebigende geheugenplaats, maar het is beter om een DOS software interrupt toe te passen die daarvoor ontworpen is. Gebruik de handleiding van de compiler om uit te zoeken wat de beste manier is om het te doen. In de volgende tabel zijn de offsets in de BIOS tabel genoemd van alle hardware interrupts.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Hardware interrupt<\/th><th class=\"has-text-align-center\" data-align=\"center\">Software interrupt<\/th><th>Standaard gebruik<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x08<\/td><td>Klok<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x09<\/td><td>Toetsenbord<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x0A<\/td><td>Tweede PIC cascade<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x0B<\/td><td>COM2 en COM4<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x0C<\/td><td>COM1 en COM3<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x0D<\/td><td>LP2 \/ harddisk op de XT<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x0E<\/td><td>Floppy disk<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x0F<\/td><td>LPT1<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">8<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x70<\/td><td>Real-time klok<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">9<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x71<\/td><td>Genereert software interrupt 0x0A<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">10<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x72<\/td><td>&#8211;<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">11<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x73<\/td><td>&#8211;<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">12<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x74<\/td><td>&#8211;<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">13<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x75<\/td><td>Mathematische co-processor<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">14<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x76<\/td><td>IDE harddisk controller<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">15<\/td><td class=\"has-text-align-center\" data-align=\"center\">0x77<\/td><td>&#8211;<\/td><\/tr><\/tbody><\/table><figcaption>ISR nummer voor elke hardware interrupt<\/figcaption><\/figure>\n\n<p>De bijbehorende tabel ingang moet het gesegmenteerde start adres bevatten van de functie in het applicatieprogramma dat een binnenkomende interrupt moet afhandelen. Deze functie moet eindigen met een aanroep van de IRET assembly instructie. Dit betekent, dat een standaard functie in het programma niet zonder meer kan worden gebruikt als interrupt service routine. In C\/C++ bijvoorbeeld, moet het woord interrupt in de functie declaratie worden gebruikt om de gewenste assembly instructies hiervoor te genereren. Raadpleeg de compiler handleiding voor meer details.<\/p>\n\n<p>Wanneer een interrupt optreedt moet de software het IIR interrupt identification register bekijken om te controleren wat de oorzaak is van de optredende interrupt. Wanneer meer dan \u00e9\u00e9n UART op hetzelfde IRQ adres worden gebruikt, dan moeten de registers van al deze UART&#8217;s worden gecontroleerd door het applicatie programma. Raadpleeg de programmeervoorbeelden voor details.<\/p>\n\n<h3 class=\"wp-block-heading\">Het prioriteiten schema<\/h3>\n\n<p>De PIC gebruikt een prioriteiten schema, waarbij de lage IRQ nummers een hogere prioriteit hebben dan de hoge. De PIC staat nieuwe interrupts toe wanneer de processor bezig is met het afhandelen van een vorige, zolang het IRQ nummer van de nieuwe interrupt lager is dan dat van de interrupt die op dit moment wordt afgehandeld. Daardoor kan het experimenteren met de interrupts die toegewezen zijn aan verschillende apparatuur in de PC de maximaal toegestane snelheid van seri\u00eble communicatie voordelig of nadelig be\u00efnvloeden. Houd er rekening mee, dat het systeem aanneemt dat de meeste standaard apparatuur op een vastgestelde interrupt aanwezig is. Het wijzigen van het interrupt nummer van harddisks en floppy drives is meestal geen goed idee, maar het wijzigen van de interrupt van een netwerk kaart kan goede resultaten opleveren.<\/p>\n\n<h3 class=\"wp-block-heading\">Interrupts toestaan<\/h3>\n\n<p>Een interrupt treedt niet op, tenzij de PIC verteld is dat het toegestaan is om een bepaalde interrupt door te laten. Dit betekent, dat de PIC moet worden geprogrammeerd alvorens een UART kan worden toegepast in een applicatie met interrupt gestuurde communicatie. Daarvoor dient het IMR interrupt mask register van de PIC te worden gebruikt. Dit register is toegankelijk op I\/O poort 0x21 voor de eerste, en 0xA1 voor de tweede PIC.<\/p>\n\n<p>De acht bits in het IMR interrupt mask register regelen elk het gedrag van \u00e9\u00e9n interrupt lijn van de PIC. Als een bit 0 is, dan zal de bijbehorende interrupt worden doorgegeven aan de processor. Hierbij is IRQ 2 een wat speciaal geval op AT compatible computers. Om deze interrupt te laten optreden moeten zowel de IRQ 2, als het IRQ 9 bit worden gecleard. Het IRQ 2 bit zal meestal al op 0 staan om ook andere interrupts van de tweede PIC mogelijk te maken. Het bit van IRQ 9 op de tweede PIC moet echter ook op 0 worden gezet. Dit is niet compatible met de originele methode om IRQ 2 te gebruiken op een XT compatible computer.<\/p>\n\n<p>Vanwege dit verschil tussen de XT en AT computer kan oudere software die geschreven is voor de XT en gebruik maakt van IRQ toch in de praktijk geen gebruik maken van deze interrupt als de software op een AT compatible wordt gebruikt. Ontwerpers hebben bij de AT geprobeerd de PIC configuratie zo compatible als mogelijk te maken bij het doorsluizen van deze IRQ, zelfs door extra BIOS software, maar daarbij vergaten ze het IMR register dat de zichtbaarheid van een interrupt voor de software uiteindelijk<br\/>controleert.<\/p>\n\n<p>Het IMR register kan eenvoudig gewijzigd worden. Eerst wordt de byte ingelezen vanaf I\/O adres 0x21 of 0xA1, met de functie die daarvoor in de compiler of in assembly beschikbaar is. Vervolgens wordt het gewenste bit op 0 gezet waarna de byte wordt teruggeschreven naar dezelfde lokatie. Houd er rekening mee dat hetzelfde bit weer gezet wordt bij het be\u00ebindigen van de applicatie. Anders zal de PIC bij het binnenkomen van nieuwe karakters proberen de software interrupt routine aante roepen die niet meer aanwezig is. Dit kan tot vreemd gedrag van de computer leiden, inclusief een complete systeemcrash.<\/p>\n\n<p>Het belangrijkste geval waar rekening mee gehouden moet worden is het drukken van de Ctrl-C toets. In de meeste applicaties zorgt deze toets voor het onmiddellijk stoppen van de applicatie, zonder dat de status van de IMR wordt teruggezet, en erger, zonder het terug veranderen van het startadres van de interrupt service routine. De interrupt service routine is de functie in het applicatieprogramma die wordt aangeroepen als een interrupt optreedt. Dit stuk software is na beeindiging van de applicatie niet meer in het geheugen aanwezig, maar vervangen door een willekeurig ander stuk software op dezelfde geheugenlokatie. Als het startadres in de BIOS tabel niet wordt veranderd, dan zal nog steeds een aanroep van de code op dezelfde geheugen lokatie worden gedaan als na afsluiten van het programma een interrupt optreedt. Moet ik nog meer uitleggen?<\/p>\n\n<h3 class=\"wp-block-heading\">Afhandelen van interrupts<\/h3>\n\n<p>De PIC zorgt ervoor, dat er geen nieuwe interrupts van dezelfde of lagere prioriteit aan de processor worden doorgegeven, zolang de software niet klaar is met het afhandelen van de vorige. Dit betekent, dat de software de PIC moet aangeven dat nieuwe interrupts mogen plaatsvinden, anders zal de computer uiteindelijk hangen.<\/p>\n\n<p>Het afhandelen van een interrupt richting de PIC kan worden gedaan door een zogenaamd non-specific end-of-interrupt commando naar het register van de PIC te sturen dat toegankelijk is op I\/O adres 0x20 voor de eerste, en 0xA0 voor de tweede controller. Dit commando bestaat uit de byte waarde 0x20. Als een interrupt is opgetreden op de tweede PIC is het niet noodzaklijk om de status van beide controllers te resetten. Alleen voor de tweede controller is dit nodig. Het BIOS heeft voor de aanroep van de ISR reeds voor de afhandeling van de eerste controller gezorgd.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I\/O en IRQ\u2019s, inleiding PC I\/O en IRQ gebruik Register naar poort conversie tabel Interrupt gebruik op een PC I\/O en IRQ&#8217;s, inleiding Seri\u00eble communicatie wordt uitgevoerd door het schrijven van output- en het lezen van input registers van een UART. Een UART (universal asynchronous receiver \/ transmitter) is een IC dat in staat is [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2000,"menu_order":27,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2114","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>I\/O addressen en interrupts op de PC - Lammert Bies<\/title>\n<meta name=\"description\" content=\"Gedetaileerde uitleg over low-level programmeren van de RS232 seri\u00eble poort op PC&#039;s.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"I\/O addressen en interrupts op de PC - Lammert Bies\" \/>\n<meta property=\"og:description\" content=\"Gedetaileerde uitleg over low-level programmeren van de RS232 seri\u00eble poort op PC&#039;s.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io\" \/>\n<meta property=\"og:site_name\" content=\"Lammert Bies\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/lammertbies\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-02T22:22:53+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@lammertbies\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/rs-232-io\",\"url\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/rs-232-io\",\"name\":\"I\\\/O addressen en interrupts op de PC - Lammert Bies\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#website\"},\"datePublished\":\"2021-04-27T14:43:09+00:00\",\"dateModified\":\"2021-05-02T22:22:53+00:00\",\"description\":\"Gedetaileerde uitleg over low-level programmeren van de RS232 seri\u00eble poort op PC's.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/rs-232-io#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/rs-232-io\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/rs-232-io#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials over computer interfacing\",\"item\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Communicatie en interfacing informatie\",\"item\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"I\\\/O addressen en interrupts op de PC\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#website\",\"url\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\",\"name\":\"Lammert Bies\",\"description\":\"Computer Interfacing\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#\\\/schema\\\/person\\\/5a6c15bc687da8d8d5ef7407fc62c7ba\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#\\\/schema\\\/person\\\/5a6c15bc687da8d8d5ef7407fc62c7ba\",\"name\":\"Lammert Bies\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\",\"url\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\",\"width\":537,\"height\":541,\"caption\":\"Lammert Bies\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\"},\"description\":\"is a dad, husband and polyglot. He is developing embedded systems since the eighties. Used machine learning before it had a name. Specializes in interconnecting computers, robots and humans. Was a Google Mapmaker Advocate and speaker on several international Google conferences from 2011 until the plug was pulled on Mapmaker in 2017. Currently spreading artificial intelligence to the wildest locations in production environments. He never stops learning.\",\"sameAs\":[\"https:\\\/\\\/www.lammertbies.nl\",\"https:\\\/\\\/www.facebook.com\\\/lammertbies\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/lammertbies\\\/\",\"https:\\\/\\\/x.com\\\/lammertbies\",\"https:\\\/\\\/bughunter.withgoogle.com\\\/profile\\\/1aaf547a-f30a-4145-b7f7-32259a48fa50\",\"https:\\\/\\\/github.com\\\/lammertb\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"I\/O addressen en interrupts op de PC - Lammert Bies","description":"Gedetaileerde uitleg over low-level programmeren van de RS232 seri\u00eble poort op PC's.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io","og_locale":"nl_NL","og_type":"article","og_title":"I\/O addressen en interrupts op de PC - Lammert Bies","og_description":"Gedetaileerde uitleg over low-level programmeren van de RS232 seri\u00eble poort op PC's.","og_url":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io","og_site_name":"Lammert Bies","article_publisher":"https:\/\/www.facebook.com\/lammertbies","article_modified_time":"2021-05-02T22:22:53+00:00","twitter_card":"summary_large_image","twitter_site":"@lammertbies","twitter_misc":{"Geschatte leestijd":"11 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io","url":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io","name":"I\/O addressen en interrupts op de PC - Lammert Bies","isPartOf":{"@id":"https:\/\/www.lammertbies.nl\/nl#website"},"datePublished":"2021-04-27T14:43:09+00:00","dateModified":"2021-05-02T22:22:53+00:00","description":"Gedetaileerde uitleg over low-level programmeren van de RS232 seri\u00eble poort op PC's.","breadcrumb":{"@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-io#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lammertbies.nl\/nl"},{"@type":"ListItem","position":2,"name":"Tutorials over computer interfacing","item":"https:\/\/www.lammertbies.nl\/nl\/comm"},{"@type":"ListItem","position":3,"name":"Communicatie en interfacing informatie","item":"https:\/\/www.lammertbies.nl\/nl\/comm\/info"},{"@type":"ListItem","position":4,"name":"I\/O addressen en interrupts op de PC"}]},{"@type":"WebSite","@id":"https:\/\/www.lammertbies.nl\/nl#website","url":"https:\/\/www.lammertbies.nl\/nl","name":"Lammert Bies","description":"Computer Interfacing","publisher":{"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lammertbies.nl\/nl?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba","name":"Lammert Bies","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","url":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","contentUrl":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","width":537,"height":541,"caption":"Lammert Bies"},"logo":{"@id":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg"},"description":"is a dad, husband and polyglot. He is developing embedded systems since the eighties. Used machine learning before it had a name. Specializes in interconnecting computers, robots and humans. Was a Google Mapmaker Advocate and speaker on several international Google conferences from 2011 until the plug was pulled on Mapmaker in 2017. Currently spreading artificial intelligence to the wildest locations in production environments. He never stops learning.","sameAs":["https:\/\/www.lammertbies.nl","https:\/\/www.facebook.com\/lammertbies","https:\/\/www.linkedin.com\/in\/lammertbies\/","https:\/\/x.com\/lammertbies","https:\/\/bughunter.withgoogle.com\/profile\/1aaf547a-f30a-4145-b7f7-32259a48fa50","https:\/\/github.com\/lammertb"]}]}},"_links":{"self":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2114","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/comments?post=2114"}],"version-history":[{"count":0,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2114\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2000"}],"wp:attachment":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/media?parent=2114"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}