{"id":344,"date":"2018-01-01T03:17:07","date_gmt":"2018-01-01T03:17:07","guid":{"rendered":"https:\/\/garikoitz.info\/blog\/?p=344"},"modified":"2018-01-02T02:09:12","modified_gmt":"2018-01-02T02:09:12","slug":"pic16f84-puertos-de-entrada-y-salida","status":"publish","type":"post","link":"https:\/\/garikoitz.info\/blog\/2018\/01\/pic16f84-puertos-de-entrada-y-salida\/","title":{"rendered":"PIC16F84 &#8211; Puertos de entrada y salida"},"content":{"rendered":"<h2>Problema propuesto<\/h2>\n<p>Se trata de que el programa lea la entrada del puerto A y lo refleje en el puerto B. El programa deber\u00e1 dormirse cuando los interruptores de entrada tengan la configuraci\u00f3n \u00ab11111\u00bb.<\/p>\n<h2>Soluci\u00f3n<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\">;-------------------------------------------------------------------------\r\nlist p=16F84A\r\ninclude P16F84A.INC\r\n;-------------------------------------------------------------------------\r\n      org \t00h\t\t;VectordeReset\r\n      goto \tINICIO \t\t\r\n      org \t0x05 \t\t;Vector de interrupci\u00f3n\r\nINICIO \t\t\t\r\n      clrf \tPORTB \t\t;NumB-&gt;W (Acumulador)\r\n      bsf\tSTATUS,RP0\t;Banco = 1\r\n      clrf\tTRISB\t\t;Puerto B como salida\r\n      movwf\tb'00011111'\t;\r\n      movwf\tTRISA\t\t;Puerto A como entrada\r\n      bcf\tSTATUS,RP0\t;Banco = 0\r\nBUCLE\r\n      movf\tPORTA,W\t\t;Leo las entradas\r\n      movwf\tPORTB\t\t;Las paso a las salidas\r\n      movlw     0x1F\t\t;w=1F\r\n      subwf \tPORTA,W\t\t;Porta-1F\r\n      btfsc \tSTATUS,Z\t;Z=1 -&gt; PORTA=1F\r\n      goto\tDORMIR\t\t;Z=1\r\n      goto\tBUCLE\t\t;Z=0 -&gt; analizamos las entradas\r\nDORMIR\t\t\r\n      sleep\r\n      end \t\t\t;Fin del programa fuente\r\n;-------------------------------------------------------------------------\r\n<\/pre>\n<p>Disponemos de tres partes bien diferenciadas, <strong>INICIO<\/strong>, <strong>BUCLE<\/strong> y <strong>DORMIR<\/strong>. En inicio se configura el puerto B como salida y el puerto A como entrada. En bucle reflejamos el estado del puerto A en el puerto B y seguidamente chequeamos si el puerto A tiene todos los bits activados o en estado \u201c1\u201d. Para ello cargamos en el acumulador el valor hexadecimal \u201c1F\u201d, que en binario es \u201c11111\u201d, para a continuaci\u00f3n realizar una resta entre Puerto A y W (PORTA-W). Si el resultado de la resta es cero se activar\u00e1 el flag Z (Z=1) y el programa pasar\u00e1 a reposo mediante la instrucci\u00f3n SLEEP, de lo contrario se repetir\u00e1 el bucle.<\/p>\n<p>Este c\u00f3digo representa un ejemplo t\u00edpico de interruptores asociados a leds, donde cada interruptor enciende un led.<\/p>\n<p>Se puede ver un ejemplo de funcionamiento en este v\u00eddeo: <a href=\"https:\/\/youtu.be\/eZSBLqVio-U\">https:\/\/youtu.be\/eZSBLqVio-U<\/a><\/p>\n<p>https:\/\/youtu.be\/eZSBLqVio-U<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Problema propuesto Se trata de que el programa lea la entrada del puerto A y lo refleje en el puerto B. El programa deber&aacute; dormirse cuando los interruptores de entrada tengan la configuraci&oacute;n &laquo;11111&raquo;. Soluci&oacute;n ;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- list p=16F84A include P16F84A.INC ;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- org 00h ;VectordeReset goto INICIO org 0x05 ;Vector de interrupci&oacute;n INICIO clrf PORTB ;NumB-&gt;W (Acumulador) bsf STATUS,RP0 ;Banco = 1 clrf TRISB ;Puerto B como salida movwf b&#8217;00011111&#8242; ; movwf TRISA ;Puerto A como entrada bcf STATUS,RP0 ;Banco =&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/garikoitz.info\/blog\/2018\/01\/pic16f84-puertos-de-entrada-y-salida\/\"> Leer m\u00e1s<span class=\"screen-reader-text\">  Leer m\u00e1s<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":380,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","wpupg_custom_link":[],"wpupg_custom_link_behaviour":[],"wpupg_custom_link_nofollow":[],"wpupg_custom_image":[],"wpupg_custom_image_id":[],"footnotes":""},"categories":[33],"tags":[35,36,34],"class_list":["post-344","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pic16f84","tag-micro","tag-pic-simulator","tag-pic16f84"],"_links":{"self":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/344","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/comments?post=344"}],"version-history":[{"count":5,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/344\/revisions"}],"predecessor-version":[{"id":349,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/344\/revisions\/349"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media\/380"}],"wp:attachment":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media?parent=344"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/categories?post=344"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/tags?post=344"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}