Estoy atascado con este sencillo programa PIC16F. ¡Ayuda por favor!

0

Estoy empezando con la programación PIC y ya me estoy rindiendo. Solo quiero hacer parpadear un LED! Estoy trabajando con un PIC16F1773, MPLABX IDE v4.05 y Pickit3.

Estos son los bits de configuración que he definido en un archivo de encabezado:

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover Mode (Internal/External Switchover Mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PPS1WAY = ON     // Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software)
#pragma config ZCD = OFF        // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR)
#pragma config PLLEN = ON       // Phase Lock Loop enable (4x PLL is always enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF      // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = ON

#define _XTAL_FREQ 8000000       // INTOSC 8MHz

Y este es el código real:

#include <xc.h>

void main(void) {

OSCCON = 0x72;

TRISB = 0x00;
PORTBbits.RB0 = 0;

while (1) {

    if (PORTBbits.RB0 == 0) {
        PORTBbits.RB0 = 1;
    }else {
        PORTBbits.RB0 = 0;
    }
    // Delay for 1 sec
    for (int count = 0; count < 20; count++) {
        __delay_ms(50);
    }

}

return;
} 

He definido el registro OSCCON como 0x72 después de la hoja de datos pero nada se ilumina. Estoy midiendo un voltaje constante de 0.42V en RB0.

EDITAR: La hoja de datos:

Estoy activando el PIC a través del Pickit3. RB0 está conectado a una resistencia en serie al LED y a tierra.

¿Qué estoy haciendo mal?

    
pregunta Raúl

2 respuestas

2

La diferencia entre los fragmentos de código primero (que no funciona) y el segundo (que funciona) es que el primero se basa en el valor existente de RB0. Si el circuito externo mantiene a RB0 de una manera particular, incluso cuando el PIC intenta conducirlo en otra dirección, entonces el primero no funcionará.

Este podría ser el caso, por ejemplo, si no tiene el LED conectado correctamente con la resistencia mínima adecuada en serie, por ejemplo.

    
respondido por el Olin Lathrop
1

No me preguntes qué fue lo que falló en ese código, pero lo cambié para que sea:

 while (1) {

    LATBbits.RB0 = 0;

    __delay_ms(500);

    LATBbits.RB0 = 1;

    __delay_ms(500);

}

Esto funciona bien. No lo entiendo.

    
respondido por el Raúl

Lea otras preguntas en las etiquetas