Muy bueno este hilo!
Gracias por los Links nava!
Por cierto Navaismo, comentaste que últimamente has estado trabajado bastante en linux. Eso me interesa sobremanera. ¿Has logrado desarrollar exitosamente proyectos en C usando el compilador libre SDCC? ¿Hay forma de usar el ICD2 con linux?
De antemano agradezco las respuestas, y saludos! :mrgreen:
/*************************************************************************** */
/* Voltimetro_7seg_876.c Enero 4 del 2009 */
/*---------------------------------------------------------------------------*/
/* Ejemplo Voltimetro 0-50Vdc con Microcontolador Pic16F876A */
/* Con Display 7 Seg Multeplexado a traves de RA1,RA2,RA3 */
/*---------------------------------------------------------------------------*/
/* Ricardo Santibañez */
/*---------------------------------------------------------------------------*/
/* Desarrolado con SDCC. */
/*****************************************************************************/
#include
#include
#include /*Funcion para uso ADC gracias arcachofo PIc Linux*/
typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_ON &
_BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF &
_DEBUG_OFF & _CP_OFF;
/* Declaracion de Variables */
char display[10]={0x01,0x4f,0x12,0x06,0x4c,0x24,0x60,0x0f,0x00,0x0c}; //Valores que representa numeros en display 7 seg.
char ingres=1;
long int digito1,digito2,digito3;
long int medida;
long int medida1;
/*Rutina de Interrupciones, en este caso por Desborde de Timer 0*/
void isr() interrupt 0 {
switch (ingres) //Selecciono que Display Activar y que valor cargar
{
case 1:
RA3=1;
RA2=1;
RA1=0;
PORTB=display[digito1];
ingres=2;
break;
case 2:
RA3=1;
RA1=1;
RA2=0;
PORTB=display[digito2];
ingres=3;
break;
case 3:
RA2=1;
RA1=1;
RA3=0;
PORTB=display[digito3];
ingres=1;
break;
}
T0IF=0; // Borro Bandera de Desborde
TMR0=150; // cargo valor en TMR0
}
void main() {
TRISA=1; // Puerta.0 como entrada y el resto como salida
TRISB=0; // Todo el Puerto B como Salida
TMR0=150; // inicio Tmr0 =150
OPTION_REG=5; //Configuro preescaler de TMRO
T0IE=1; // activo Int. por Tmr0
GIE=1; // Habilito Interrupciones
PORTB=0; // inicio Portb
adc_init(FOSC_2, A1_R0, INT_OFF); //Uso de Rutina ADC de PIC, iniciacion
while (1)
{
medida=adc_read(0); // Leer canal 0
medida1=((medida*500)/1023);//Escalar Variable de 0 a 500
/*Determinar Valores para cada digito del Display*/
digito1=(medida1/100);
digito2=(medida1-(digito1*100))/10;
digito3= medida1-(digito1*100+digito2*10);
delay_ms(200);
}
}