Programas hechos en MPLAB

Ok me habia faltado eso lo mero bueno jaja....

Código:
for(sensores=0;sensores<=numero_sensores a manajer;sensores++){
            set_adc_channel(sensores);
            delay_us(50);
            channels(sensores)=read_adc();
}
 
for(sensores=0;sensores<=numero_sensores a manajer;sensores++){
            resultado+=channels(sensores);
}

resultado=resultado/numero_sensores_a_manejar;
recuerda que si pones las entradas analogas de 10 bit debes de poner una variable
de "resultado " de tipo int32, o si es 8 bit tambien pon una variable de mismo tipo.
 
Hola resulta que escribí un programa de una simple lectura del puerto analógico del PIC pero el compilador me rechaza los comandos referidos al uso del ADC y no estan mal escritos que puede ser? Les dejo el código. Uso CCS.

Código:
#include <16F628A.h>
#device adc=10
#use delay(clock=4000000)
#fuses XT,NOWDT,NOMCLR,NOPROTECT
/*PUERTOS*/
#byte PORTA = 0x05
#byte TRISA = 0x85
#byte PORTB = 0x06
#byte TRISB = 0x86
/*VARIABLES*/
INT16 adc;                                               //VALOR DEL ADC (BINARIO)
FLOAT tension = 0.000;                                   //TENSION DEL ADC (VOLTS)

VOID main(VOID){
TRISB = 0;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
                        WHILE(1){
adc = read_adc();                               //LECTURA CANAL AN1
tension = 5.000 * adc / 1024.000;               //CONVERSION A VOLTAJE
IF((tension<2.5)&&(tension>1.00)){
            output_high(PIN_A2);
}
ELSE{
            output_low(PIN_A2);
}
delay_us(20);
                        }
}
 
Última edición:
hola,

estoy estudiando una asignatura de uC, y estoy buscando informacion sobre como implementar una comunicacion 1-wire entre pics y sensores. en concreto, habria un pic master (pic16fxxx), un pic esclavo (pic12fxx) y dos sensores.
estoy buscando una forma de implementar el programa en C la parte del pic esclavo, pero no se como hacerlo. todos los ejemplos son de dispositivos slaves de tipo sensores, que apenas mandan la medicion de temperatura, por ejemplo.

gracias de antemano.
 
Código:
//------------------------------------
//TITULO: SENSOR DE TEMPERATURA Y ENVIADO A LA PC
//AUTOR: JORGE ARTURO RODRIGUEZ HERNANDEZ
//FECHA: 12\JUNIO\'09
//------------------------------------

#include <12f675.h>
#fuses XT,NOWDT,NOCPD,NOPROTECT,MCLR,NOPUT
#use delay(clock=4000000)
#use rs232(baud=2400,xmit=PIN_A2,rcv=PIN_A1)

void config(void){
		set_tris_a(0x3b);
		setup_comparator(NC_NC_NC_NC);
		setup_adc(ADC_CLOCK_INTERNAL);
		setup_adc_ports(sAN0);
}

void main(void){
		int x,y;
		config();
		
		do{
			x=read_adc();
			delay_ms(500);
			y=2*x;
			printf("LA TEMP= %u",y);
			printf("°C\r\n");
		}while(TRUE);
}

Hola que tal, estoy muy interasado. Pero no lo tienes com para el 16f877a???

Y cómo es, paralelo, seria,?? Baudio, etc...???


Saludos y gracias!!!
 
hola Kaymar te dejo el código con las modificaciones que pedías saludos
PHP:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void config(){
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
}
void main(){
      int x,y;
      config();
      do{
         x=read_adc();
         delay_ms(500);
         y=2*x;
         printf("LA TEMP= %u",y);
         printf("°C\r\n");
      }while(TRUE);
}
 
Muchas Gracias, no saben cuanto me han ayudado tus ejemplos george.manson.69, soy nuevo esto de los pics y CCS, estoy intentando controlar la posicion de un servo y posteriormente un motor a pasos, pero cuando movia el motor a pasos, se volvia loco el servo, pero con los ejemplos me di cuenta que no establecia prioridades en la interrupciones.

le muestro mi codigo

Código:
//    Ancho pulso medio  1.5 ms ->  90 ticks de TMR0
//    Ancho pulso maximo 2.5 ms -> 155 ticks de TMR0

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#define PIN_SERVO1 PIN_B0
#priority int_RTCC,rda

const int AJUSTE_FINO_DE_RTCC =  30;
const int ticks_PULSO_MINIMO  =  75;
const int ticks_PULSO_MEDIO   =  96;
const int ticks_PULSO_MAXIMO  = 119;
int1 flagRTCC     = 0;
int   contRTCC    = 0;
int1 flagSERVO1 = 0;
int   tSERVO1     = ticks_PULSO_MEDIO;

#int_RTCC

void RTCC_isr(){
   ++contRTCC;
   if(contRTCC==4){
      set_TIMER0(AJUSTE_FINO_DE_RTCC);
   }

   if(contRTCC==5){
      flagRTCC=1;
      contRTCC=0x00;
   }
}
void main() {
   int ValTIMER0;
   setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
   enable_interrupts(int_rda);
   enable_interrupts(global);
      set_TIMER0(0);
   enable_interrupts(INT_RTCC);

    do {
      // DISPARO DEL PULSO PWM
      if(flagRTCC==1){
         flagRTCC=0;
         output_high(PIN_SERVO1);
         flagSERVO1=1;    
      }
      // CONTROL DE ANCHO DEL PULSO PWM

      if(flagSERVO1==1){
         valTIMER0 = get_TIMER0();
         if(valTIMER0>tSERVO1){
            flagSERVO1=0;
            output_low(PIN_SERVO1);
         }   
      } 
      // CONTROL DEL SERVOMOTOR MEDIANTE PUSH

      if(input(pin_b1)==0 && input(pin_b4)==1 && input(pin_b5)==1){
      //delay_ms(200);
      tSERVO1=ticks_PULSO_MINIMO;}
      else if (input(pin_b2)==0 && input(pin_b4)==1 && input(pin_b5)==1){
      //delay_ms(200);
      tSERVO1=ticks_PULSO_MAXIMO;}
      else if (input(pin_b3)==0 && input(pin_b4)==1 && input(pin_b5)==1){
      //delay_ms(200);
      tSERVO1=ticks_PULSO_MEDIO;}
          
     // CONTROL DEL MOTOR A PASOS MEDIANTE PUSH
      if (input(pin_b4)==0){
      delay_ms(300);
   
      output_low(pin_b6);
      delay_ms(100);
      output_low(pin_b7);
     delay_ms(100);
      output_high(pin_b7);
    delay_ms(100);
      output_low(pin_b7);
  delay_ms(100);
      output_high(pin_b7);
      delay_ms(100);
      output_low(pin_b7);
      delay_ms(100);
      output_high(pin_b7);
      delay_ms(100);
      output_low(pin_b7);}
             
     else if (input(pin_b5)==0){
     delay_ms(300);
     
     output_high(pin_b6);
   delay_ms(100);
     output_low(pin_b7);
    delay_ms(100);
     output_high(pin_b7);
     delay_ms(100);
     output_low(pin_b7);
    delay_ms(100);
     output_high(pin_b7);
     delay_ms(100);
     output_low(pin_b7);
    delay_ms(100);
     output_high(pin_b7);
     delay_ms(100);
     output_low(pin_b7);}
   
   } while (TRUE);
  
}
si me presentaran mejoras a mi codigo se los agradecería, les adjunto la simulacion en proteus.

Nota: Para el control del motor a pasos empleo un driver que es el l297 y un puente h que es el l298, asi que al pic unicamente lo que le solicito es un tren de 2 pulsos, por lo que se me ocurrio hacerlos con delays...
 

Adjuntos

Te felicito por poner estos programas, yo no se programar en C ( he hecho algunos en asembler y me han quedado bien) los voy a leer para tener una idea como hiciste tus programas sin embrago me ubiera gustado que hubieras puesto algunos comentarios despues de cada sentencia para tener una idea mas clara ya que soy de muy lento aprendizaje y en serio tengo que leer algo varias veces para poder comprenderlo a cabalidad de todas maneras bien por lo que has puesto para todos los interesados, felicidades.
 
george un favor me puedes eXplicar como funciona el scroll qUE pusistes de ejemplo lo pruebo y si trabaja de maravilla pero aun no comprendo la sintaxis de como trabaja por favor si fueras tan amable de explicarlo te dejo mi mail



gracias
 
Última edición por un moderador:
Hola que tal como están???
Disculpe molestarlos pero tengo un pequeño y gran problema...
estoy recibiendo datos con la interrupción RDA, Funciona perfecto... pero al momento de que ya he recibido 40 datos el programa no corre más... tengo que apagar y prender el pic para q vuelva a trabajar... noc como pueda solucionar el problema... si alguien podria ayudarme se lo agradeceria mucho...
 
hola magdalena coloca mas datos de tu problema como que tipo de micro controlador utilizas, el circuito es simulado, el código si es posible postealo para poderte ayudar
saludos
 
Arriba