Autor Tema: Ayuda PIC16f628a XC Compiler  (Leído 2959 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado brianriani

  • PIC10
  • *
  • Mensajes: 2
Ayuda PIC16f628a XC Compiler
« en: 28 de Marzo de 2019, 22:41:22 »
Muy buenas a todos, soy nuevo en el mundo de la programación de microcontoladores y estoy teniendo un problema que creo que es super básico pero no logro entenderlo.

Tengo el siguiente programa:

Código: [Seleccionar]
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#include <xc.h>
#include <pic16f628a.h>

#define _XTAL_FREQ 4000000

void main(void)
{
    TRISA=0b11111111;   //Configurado como entrada
    TRISB=0b00000000;   //Configurado como salida
   
    CMCON=0b00000111;   //Apaga comparadores: Entradas digitales
   
    PORTB=0b00000000;
   
    while(1)
    {
        if(RA0==1)
        {
            PORTB=0b11111111;
            __delay_ms(300);
            PORTB=0b00000000;
            __delay_ms(300);
        }
        else
        {
            PORTB=0b00000000;
        }
    }

    return;
}

el problema es el siguiente.. si el pic lo grabo tal como escribí arriba, al accionar la entrada RA0 los led quedan encendido sin parpadear

pero si cambio el orden de que primero apaguen y despues prendan, el programa funciona correctamente y no entiendo el por que..

Código: [Seleccionar]
if(RA0==1)
        {
            PORTB=0b00000000;
            __delay_ms(300);
            PORTB=0b11111111;
            __delay_ms(300);
        }

Espero haberme explicado bien, tengo un pulsador conectado a RA0 y 8 LED conectado al PORTB (es decir RB7 RB6 .... RB0)

PD: al simular ambos programa en proteus funciona perfectamente los 2.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Ayuda PIC16f628a XC Compiler
« Respuesta #1 en: 28 de Marzo de 2019, 23:04:52 »
 
No has metido en el bucle while(1) la lectura de RA0, no va a cambiar nunca, con el valor que entre al bucle se quedará eternamente.

Lo raro es que con cualquier opción te haga algo, porque no hay ninguna instrucción en el programa para leer el puerto A, solo has configurado que sea de entrada, eso no basta para leerlo.

No necesitas el ELSE, puesto que los LED siempre acaban apagados, pulses o no pulses. La función main() no precisa un return, salvo que el compilador sea tan quisquilloso que lo exija.

Esos delay sobran si no quieres que te ralenticen la velocidad de conmutación del pulsador, excepto si la misión del programa es hacer parpadear el LED mientras se mantiene cerrado el pulsador. Mejor usa un timer y una interrupción para esa tarea.

De momento prueba con algo así:

Código: C++
  1. #define BOTON_PULSADO PORTAbits.RA0
  2. void main(void)
  3. {
  4.     TRISA=0b11111111;   //Configurado como entrada
  5.     TRISB=0b00000000;   //Configurado como salida
  6.     CMCON=0b00000111;   //Apaga comparadores: Entradas digitales
  7.     PORTB=0b00000000;
  8.    
  9.     while(1)
  10.     {
  11.         if(BOTON_PULSADO)
  12.         {
  13.             PORTB=0b11111111;  __delay_ms(300);
  14.             PORTB=0b00000000;  __delay_ms(300);
  15.         }
  16.     }
  17. }
« Última modificación: 28 de Marzo de 2019, 23:43:09 por planeta9999 »

Desconectado brianriani

  • PIC10
  • *
  • Mensajes: 2
Re:Ayuda PIC16f628a XC Compiler
« Respuesta #2 en: 29 de Marzo de 2019, 19:56:00 »
Hola planeta9999 y gracias por responder...

mirá mi idea es encender todo el PORTB, es decir RB0, RB1, RB2, RB3, RB4, RB5, RB6 y RB7, que mientras tenga el pulsador en 1 (RA0==1) los led prendan y apaguen cada 300ms..

mi pregunta es.. por que si pongo:

Código: [Seleccionar]
PORTB=0b00000000;
__delay_ms(300);
PORTB=0b11111111;
__delay_ms(300);

asi si me funciona.. pero si pongo al revés (es decir primero que enciendan y luego apaguen) quedan encendido todo el tiempo sin parpadear.. no entiendo el por que

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda PIC16f628a XC Compiler
« Respuesta #3 en: 30 de Marzo de 2019, 00:49:14 »
La única que se me ocurre para tratar de explicar esto es ver el ASM generado... porque no debería haber ninguna diferencia.

Tal ves y seguramente el compilador optimice algo y termines con ese problema, fijate si podes desactivar las optimizaciones en las propiedades de proyecto.