sexta-feira, 3 de janeiro de 2014

BUG no compilador XC8, fiquem atentos:

Mexendo no compilador XC8 encontrei um bug estranho,veja o código a seguir:
  
/************************************************************************************************************************************
 *                                               Bug no compilador XC8 
 *
 * Compilador : MPlabXC8
 * Microcontrolador: 16F648A
 * Autor: aguivone
 * Versão: 1
 * Data :  03/01/2014
 *************************************************************************************************************************************/
#include <stdio.h>
#include <string.h> //para usar funçoes de string deve se adicionar este header
#include <stdlib.h>
#define _XTAL_FREQ 4000000    // apesar de não usar cristal devo configurar pois esse define é usado para rotinas de tempo e da serial
#include <xc.h>

/**********************************************************************************************************************************/
#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 FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#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)
/************************************************defines***************************************************************************/
#define A1 RB0     
#define B1 RB3     
#define C1 RB4     
#define D1 RB5     

void main(void)
{
    TRISB = 0X02;//configura portB  B1 (pino RX) como entrada
    TRISA = 0X00;//configura portA como saida
    PORTB = 0;  // limpar as portas que estão configuradas como saidas
    PORTA = 0;  // limpar as portas que estão configuradas como saidas
    CMCON = 7;//desliga modulo comparador
   
    A1=1;
    B1=1;
    C1=1;
    D1=1; 
    for(;;)
    {
         A1=1;
         B1=1;
         C1=1;
         D1=1;       

    }//loop infinito

}

     Neste simples codigo eu apenas mando ligar 4 pinos do microcontrolador,mas a saída não é bem assim(rode ele no simulador do proteus), verá que os pinos ficam sequenciando, agora retire do código o laço for e veja o resultado! se ocorrer o mesmo que aconteceu em meu pc vc verá apenas o pino B5 acionado,uma explicação seria que toda vez que vc manda setar um pino da forma como foi feito ele zera a porta e seta apenas aquele pino uma das formas de se resolver é usando a instrução : PORTB=0B00111001; ou PORTB = 0X39; pois assim se escreve direto no "PORTB" do microcontrolador.

2 comentários :

  1. Olá Amigo, eu compilei o seu código rodei no Proteus, com o laço, as quatro saída ficam em nível lógico alto. Quando retiro o laço, as saídas ficam piscando de forma instável o que é explicado pelo fato do proteus não conseguir executar o código em tempo de máquina. Imagino que o software tente ficar executando e assim a simulação está correta, pois existe uma linha que limpa o portb e as 4 saídas são setadas logo a seguir.
    Eu vou executar o programa no chip para ver qual o resultado.
    Abraço

    ResponderExcluir

olá,digite aqui seu comentário!