PIC12F629 No reacciona en la entrada

2

He construido este circuito:

  • El diodo es en realidad un LED.

enlace

Con este código en MPLAB x, XC8:

#include <xc.h>
#define _XTAL_FREQ 20000000
#pragma config WDTE=OFF , BOREN=OFF , PWRTE=ON , MCLRE=OFF , FOSC=INTRCIO

void main(){
TRISIO = 0x001000;
GPIO = 0b000000;
    while(GPIO = 0b001000){
        GPIO = 0b110111;
    }

}

Pero el GP0 (pin7) no reacciona con el botón presionado GP3 (pin7), ¿por qué?

    
pregunta Shombol-shagol

2 respuestas

2

Debe agregar una resistencia desplegable a su botón. LospinesGPIOsonsensiblesalosvoltajes.Cuandopresionaelbotón,elvoltaje(vsGND)enelGPIOseestableceen5V,ylaMCUloverá.Perocuandosueltaselbotón,¿cuáleselvoltajeenelGPIO?0V?Probablementeno,¿quéhacequeesevoltajeseade0V?

Cuandosedejaabierto,oflotante,elvalordeGPIOnoestádefinido.Podríaser1o0.Opodríacambiarrápidamente(oscilar).EnATTiny,cuandosedejaabiertabajoalgunacondición,laetapadeentradacomienzaaconsumirmuchacorriente...(loqueesmaloparaunaMCUdebajoconsumo...)

Porlotanto,podríaresolverestoagregandounaresistencia(llamada"pull down") entre su GPIO y GND (10k está bien).

O puede conectar su botón a GND en lugar de a 5V y habilitar la resistencia de recuperación interna del MCU GPIO (no sé si este modelo en particular ofrece esa característica).     

respondido por el Blup1980
4

En el siguiente código, un único signo de igual es un operador de asignación, por lo que intentará establecer el valor de GPIO. Debería ser así para una comparación:

while(GPIO == 0b001000){
    GPIO = 0b110111;
}

Sin embargo, está haciendo una comparación exacta, por lo que todos los demás bits deben ser cero para que coincidan, lo que probablemente desee es algo como esto, que incluye un bit y AND para solo comprobar un solo bit:

while(GPIO & 0b001000){
    GPIO = 0b110111;
}
    
respondido por el PeterJ

Lea otras preguntas en las etiquetas