Pin RB0/INT no ilumina segmento "a" en display 7 segmentos ánodo común

Hola,

Resulta que he hecho un pequeño programa que cuenta de 0-9 visualizando los números en un display de 7 segmentos de ánodo común.

El integrado es un 16F84A y el compilador XC8.

Al ser el display de ánodo común configuro todo el PORTB como entrada.

El programa funciona perfectamente mostrando todos los números en el display.

El problema esta en que por alguna extraña razón no se ilumina el segmento "a" del display, conectado al pin RB0/INT.

Al ser un pin para interrupciones externas he tratado de deshabilitar las interrupciones globales pero no soluciona nada.

Los segmentos del display funcionan y las conexiones están bien.

Decir que estoy aprendiendo a programar.

Adjunto programa:

PHP:
/* 
 * File:   main.c
 * Author: nimio
 *
 * 16F84A
 *
 * PROGRAMA CONTADOR DE 0-9 CON DISPLAY 7 SEGMENTOS ÁNODO COMÚN.
 * 
 *
 * Created on 7 de noviembre de 2012, 6:19
 */

#include <xc.h>
//#include <stdio.h>

#define _XTAL_FREQ 4000000

#pragma config FOSC=XT, WDTE=OFF, PWRTE=ON, CP=OFF

/*
 * 
 */

void main(void) {

    char i=0; //Variable contador inicializada a 0.
    
    int tabla7seg [10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x98}; // 0-9 ANODO COMÚN.
    //int tabla7seg [10]={0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10011000}; //0-9 ÁNODO COMÚN
    //int tabla7seg [10]={0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01100111}; //0-9 CÁTODO COMÚN
    //int tabla7seg [10]={0x03F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; // 0-9 en HEX. 7 seg. CÁTODO COMÚN.
                                                                           // Vector 10 elementos.
    TRISB=1;
    //PORTB=0b00000000;
    //INTCONbits.GIE=0; // Se deshabilitan todas las interrupciones.
    //INTCONbits.INTE=0; // Deshabilita interrupción en RB0/INT.
    //di();
    do {
        PORTB=(tabla7seg [i]); // Muestra por PORTB el contenido de la tabla7seg según el valor de i.
        __delay_ms(1000);
        i++;

        if (i>9){ // Si i es más grande que 9 quiere decir que ya se ha mostrado el 9.
            i=0; // Entonces se inicializa a 0 i para empezar otra vez desde 0.
        }
    }
    while(1); // Bucle infinito.

}

A ver si alguien sabe que puede ser.

Saludos!
 
Hola nimio, yo quitaria el "trisb = 1" y declararia i como int en lugar de como char.

Un saludo.
 
Como asi que al ser el display de anodo comun configuras como entrada????? sea como sea el display el PORTB debe ser SI o SI configurado como salida no hay de otra, por lo demas programo en assembler y no entiendo ni J de XC8, chauuuuuuo
 
Hola, gracias por responder.

Jurty, fdesergio si quito TRISB no hace nada, sin embargo... si defino TRISB como salida... BINGO!!! no se por que extraña razón inconscientemente pensaba que el display al ir de positivo común a individual negativo tenía que definir el puerto como entrada!! jajaja :cabezon:

Gracias por el interés.

Saludos
 
nimio, depende de cómo hayas hecho la conexión de tu circuito la tabla varía, pero viéndolo rápidamente me pregunto si no hay un error en la conexión en el circuito en el que intercambiaste por error los pines del punto del display y el segmento "A". Parece que por ahí puede andar el asunto. O sea, conectaste a RB0/INT el segmento "DP" del display en el RB7 el segmento "A" del display. Espero explicarme.
 
chin0o, lm555cn...

Justo encima de vosotros comento que está OK, era un fallo tonto por configurar el puerto como entrada en lugar de como salida, no se porqué debería pensar que al ser entrada tendría el 0 lógico en cada pin. lo curioso es que funcionaba salvo por el problema que comentaba.

Así que ya está solucionado.

El punto del display no lo he conectado por no usarlo para este programa.
En cuanto al "for"... bueno... estoy aprendiendo a programar así que voy probando diferentes comandos.

Saludos
 
Atrás
Arriba