TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MGLSOFT en 12 de Marzo de 2004, 14:26:00

Título: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 12 de Marzo de 2004, 14:26:00
Bueno, estoy aprendiendo algo gracias a ustedes, es hora de devolverlo.
Voy a ir haciendo las rutinas que puse en PBP aqui, pero ejecutadas en lenguaje C de CCS.

Por supuesto esta abierto a colaborar!!!

Proximamente !!!
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 12 de Marzo de 2004, 15:32:00
Saludos

Marcso, te felicito por tu dedicacion, igual ando yo ya que me parece que C es una tremenda herramienta en esto de los PICs.
seguimos aprendiendo y aplicando.

Hacia atras, ni para tomar impulso

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 15 de Marzo de 2004, 05:52:00
Aqui va el primer ejemplo de las rutinas, esta vez se trata de la rutina NumGran, que muestra un numero enviado al LCD en numeros que abarcan las dos lineas de un LCD de 2 x 16 caracteres, el mas utilizado de todos...

Envio mi agradecimiento por empujarme al C y especialmente a traducir este ejemplo a Ariel PIKMAN, quien me impulso fuertemente al ponerme el desafio de traducir esta rutina que habia puesto en el foro de PBP.

Puse dos ejemplos de su utilizacion AQUI , una es un simple contador, igual al ejemplo en PBP, el otro ejemplo ya muestra como mostrar el resultado del conversor A/D en numeros grandes en el LCD.

Espero lo disfruten y les sirva, es de uso libre.
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 16 de Marzo de 2004, 07:32:00
Van 10 descargas...
Algun comentario??
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 16 de Marzo de 2004, 08:00:00
SALUDOS

MARCOS, ME PARECEN EXCELENTES, VOY A COMENZAR A PROBARLOS Y CUALQUIER DUDA TE CONSULTO.

SIGUE CON LA INICIATIVA, CREO QUE ES MUY VALIOSA.  

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 17 de Marzo de 2004, 05:33:00
Ahora puse otro ejemplo, esta vez es el Caminante.
Se trata de una rutina que muestra como se pueden realizar pequeñas animaciones utilizando un display LCD alfanumerico estandar..

Aunque no es muy util es muy bueno para aprender...

Esta Aqui....
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 17 de Marzo de 2004, 15:16:00
No se si será más o menos útil, pero acabas de mostrarme como hacer debug paso a paso en proteus con archivos .c que no tenía ni idea.

Muuuchas gracias amigo!!
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 17 de Marzo de 2004, 16:02:00
Agradecele a Pocher y los demas que trataron en el foro el tema de como hacer debug paso a paso de las rutinas en C.

De todos modos fue util !!
Ese era el proposito....
Título: RE: Rutinas y programas en CCS C
Publicado por: mandoa en 18 de Marzo de 2004, 04:19:00
tutorial de C para PIC. NO es mio, lo encontré en la red.
Si interesa avisarme y lo pondré.(Cuando pueda)
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 18 de Marzo de 2004, 05:22:00
Pues cuando puedas...
No se si se tratará del que ya tenemos para CCS en español. No se si lo vistes. Anda por el foro.
Si no sabes si es el mismo, envíamelo a mí, a mglsoft o a quien quieras y miramos si coincide y si no lo colgamos. OK?
Saludos!
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 18 de Marzo de 2004, 05:31:00
SALUDOS A TODOS

HEY NO ME DEJEN POR FUERA, A MI TAMBIEN ME INETERESA SIN NO ES LA VERSION QUE ANDA POR EL FORO

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: pocher en 18 de Marzo de 2004, 05:46:00
Bueno, ya estoy por aquí, de nuevo. Unos días valiosos perdidos por culpa de los innombrables que se dedican a lanzar virus por la red.

... up, me engancho al carro.
Título: RE: Rutinas y programas en CCS C
Publicado por: pocher en 19 de Marzo de 2004, 05:37:00
Marcos, me gustan los ejercicios para representación en LCD con números grandes.

En el ejercicio del convertidor A/D, no convertía bien. Lo he modificado para que saque bien por la LCD la conversión que aparece en el voltímetro y además con punto decimal.

Aquí os dejo el apaño: http://miarroba.com/foros/ver.php?foroid=256746&temaid=1539858&msgid=12585124

Un saludo
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 19 de Marzo de 2004, 07:38:00
Pocher:
Es un gran honor que prestes atencion a estas rutinas, es mas, ademas que aportes y como lo estas haciendo me enorgullece.
Repito mi agradecimiento a los que ayudan a que aprendamos del lenguaje C, y creo que aportaciones como estas, de gente que sabe mucho, son un gran aliciente para nosotros.

Me dejaste helado, voy a probarlo en el LCD, pero muestra lindo en Proteus.
Sinceramente, no crei que pudiera mostrar flotantes en ese formato, pero has vuelto a asombrarme.
Gracias.

Un detalle.
Si comentas la linea:

#define No_Ceros_Izq

de la libreria NumGran2.c

deberia mostrarte los ceros a la izquierda, mejorando aun mas el aspecto visual de tu ejemplo...
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 19 de Marzo de 2004, 11:58:00
Anda genial !!

Ademas muestra los ceros a la izquierda, tal como te dije.
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 20 de Marzo de 2004, 10:21:00
test
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 20 de Marzo de 2004, 10:34:00
Saludos

"Marcos esta es la direccion  ""

Este mensaje lo he enviado varia veces por alguna razon miarroba no lo ha podido

enviar.

Te comento que alli encontraras el ICD2 de CCS que es bastante util, ademas la version

del PCW 3.187, y la version actuailzada del Pic-basicpro.

Yo he estado bastante ocupado y un poco alejado por razones laborales ya que estoy

cubriendo las vacaciones de mi jefe las cuales termninan la proxima semana

Es todo por ahora

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 24 de Marzo de 2004, 12:38:00
Tal y como me han sugerido,y para quien pueda interesar,aquí teneis un programita para hacer con un 16f84 el juego "simón",con pulsadores y leds,para poner a prueba la memoria.
De aquí a poco,esquemas,documentación y demás para completar el asunto.

Codigo:


                 /******************* SIMON *********************
                  *                                             *
                  *                  By Yors                    *
                  *                 S.I.T.T.M                   *
                  *                                             *
                  ***********************************************/

/******************************** ESPECIFICACIONES *****************************

 El dispositivo físico consta de cuatro leds (rojo,verde,amarillo y azul)
 conectados a RA0,RA1,RA2 y RA3 (en ese orden),de un altavoz conectado a RB3
 y de cinco pulsadores.
 Un pulsador está conectado a RB0 (para generar el color aleatorio) y los otros
 cuatro,que corresponden a cada uno de los leds,están conectados a RB4,RB5,RB6
 y RB7.Tanto los leds como los pulsadores son activos a nivel alto.

*******************************************************************************/



/*******************
*   PREPROCESADO   *
********************/

#include <16F84.h>
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
#fuses XT,NOWDT,NOPUT

/****************************************
*  DEFINICIÓN DE ETIQUETAS Y VARIABLES  *
*****************************************/

#byte   PORTA = 0x05      // Puerto A

#byte   PORTB = 0x06      // Puerto B y bits utilizados
#bit  RB0 = 0x06.0
#bit  RB3 = 0x06.3
#bit  RB4 = 0x06.4
#bit  RB5 = 0x06.5
#bit  RB6 = 0x06.6
#bit  RB7 = 0x06.7

#byte   INTCON = 0x0B

int aleatorio,dir_lectura,dir_escritura,color_leido,leido,color_pulsado,nivel;
short fin_juego;


/***************
*  SUBRUTINAS  *
****************/


void retardo(int latencia)
   {
   switch(latencia)
      {
      case 1: delay_ms(200);       // Correspondiente al nivel 1
      break;
      case 2: delay_ms(100);       // Nivel 2
      break;
      case 3: delay_ms(50);       // Nivel 3
      break;
      case 4: delay_ms(15);       // Nivel 4
      break;
      default:
      break;
      }
   }


void altavoz(int tono)  // Para generar un sonido diferente para cada color
   {
   int i,j;
   for(i=0; i<=40; i++)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);      // La distancia entre pulso y pulso viene determinada
       delay_us(300*(6-tono));   //  por el parámetro tono
       output_low(PIN_B3);
       delay_us(300*(6-tono));
       }
     }
   }


void antirebote()
   {
   delay_ms(30);
   while(PORTB != 0) {}  // No progresamos hasta que ningún pulsador esté activo
   delay_ms(30);
   }


void comprueba()
   {
   leido = read_eeprom(dir_lectura);  // Leemos la dirección eeprom correspondiente.
   if(leido != color_pulsado)         // Si la pulsación no ha sido correcta,acaba el
    {                                 //  juego y volvemos al principio del programa
    fin_juego = true;
    }
   }


void enciende_led(int color)  // Enciende el led correspondiente
   {
   switch(color)
      {
      case 1: output_high(PIN_A0);     // Led rojo
      break;
      case 2: output_high(PIN_A1);     // Led verde
      break;
      case 3: output_high(PIN_A2);     // Led amarillo
      break;
      case 4: output_high(PIN_A3);     // Led azul
      break;
      default: PORTA = 15;             // Los 4 leds
      break;
      }
   }


void escoge_nivel()    // El led que se mantiene encendido corresponde al nivel elegido
   {
   nivel = 1;
   PORTA = 0;
   output_high(PIN_A0);  // Por defecto,encendemos el led rojo (nivel 1).
   while(!RB0)              // El nivel por defecto es el 1.Hasta que pulsemos RB0
      {                     //  podremos seleccionar cualquiera de los 4 niveles
      if(RB4)
       {
       nivel = 1;
       PORTA = 0;
       output_high(PIN_A0);      // Nivel 1 - > led rojo encendido
       antirebote();
       }else if(RB5) {
        nivel = 2;
        PORTA = 0;
        output_high(PIN_A1);     // Nivel 2 - > led verde encendido
        antirebote();
       }else if(RB6) {
        nivel = 3;
        PORTA = 0;
        output_high(PIN_A2);     // Nivel 3 - > led amarillo encendido
        antirebote();
       }else if(RB7) {
        nivel = 4;
        PORTA = 0;
        output_high(PIN_A3);     // Nivel 4 - > led azul encendido
        antirebote();
       }
      }
   antirebote();
   PORTA = 15;            // Una vez hemos escogido nivel,se encienden los 4 leds
   delay_ms(1000);        //  para indicar que podemos empezar a jugar
   PORTA = 0;
   }


void genera_aleatorio()   // Al pulsar RB0 genera un número entre 1 y 4 que se guardará
   {                      // tal cual en memoria...
   aleatorio = 1;               // 1 -> Rojo
   while(!RB0)                  // 2 -> Verde
     {                          // 3 -> Amarillo
     if(aleatorio == 4)         // 4 -> Azul
       {
       aleatorio = 1;
       }else {
       aleatorio++;
       }
     }
   antirebote();
   }


void guarda_color()
   {
   write_eeprom(dir_escritura,aleatorio);  // Guardamos el color generado y apuntamos a
   dir_escritura++;                        //  la siguiente dirección para una próxima
   }                                       //  escritura


void has_fallado(int tono)     // Si entramos aquí es que hemos pulsado incorrectamente
   {
   int i,j;
   enciende_led(color_pulsado);
   for(i=0; i<=100; i++)          // Generamos tono de error (más grave)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);
       delay_ms(1*(6-tono));
       output_low(PIN_B3);
       delay_ms(1*(6-tono));
       }
     }
   delay_ms(1000);
   }


void muestra_colores()
   {
// Desde el primero hasta el último que se ha guardado en memoria,los vamos mostrando
//  con una rapidez que vendrá determinada por el nivel de dificultad elegido al principio.
   for(dir_lectura = 0; dir_lectura < dir_escritura; dir_lectura++)
      {
      color_leido = read_eeprom(dir_lectura);   // Lectura eeprom
      enciende_led(color_leido);                // Enciende led correspondiente
      altavoz(color_leido);                     // Emite tono
      retardo(nivel);                           // Retardo según nivel de dificultad
      PORTA = 0;                                // Apaga led
      retardo(nivel);                           // Retardo según nivel de dificultad
      }
   }


void pulsa_secuencia()
   {
   short sal;
   dir_lectura = 0;
// Recogemos las pulsaciones y se va comprobando si son correctas hasta que
//  alguna no lo sea o hasta que hayamos acertado todos los colores guardados
//  hasta el momento.
// dir_escritura contiene la dirección eeprom siguiente al último color guardado
//  y dir_lectura la usamos para ir consultando cada posición de memoria y comprobar
//  si la pulsación ha sido correcta.En el momento en que fallemos alguna,fin_juego toma
//  el valor TRUE.
   while((dir_lectura < dir_escritura) && (!fin_juego))
      {
      sal = false;
      while(!sal)  // Mientras no haya pulsación nos mantenemos dentro del bucle
         {
         if(input(PIN_B4))             // Se ha pulsado el rojo,salimos del bucle
          {
          color_pulsado = 1;
          sal = true;
          }else if(input(PIN_B5)) {    // Se ha pulsado el verde,salimos del bucle
          color_pulsado = 2;
          sal = true;
          }else if(input(PIN_B6)) {    // Se ha pulsado el amarillo,salimos del bucle
          color_pulsado = 3;
          sal = true;
          }else if(input(PIN_B7)) {    // Se ha pulsado el azul,salimos del bucle
          color_pulsado = 4;
          sal = true;
          }else {                      // No se ha pulsado ninguno,continuamos
          sal = false;                 //  dentro del bucle
          }
         }
      comprueba();   // Algoritmo que comprueba si la pulsación ha sido correcta
      enciende_led(color_pulsado);  // Enciende el led del color que hemos pulsado
      altavoz(color_pulsado);       // Genera el tono del color que hemos pulsado
      antirebote();                 // No comment
      PORTA = 0;                    // Apagamos led
      dir_lectura++;                // Para comprobar la siguiente dirección eeprom
      }
   }


/*********************
* PROGRAMA PRINCIPAL *
**********************/


void main()
   {
// Inicialización periféricos
   set_tris_B(0b11110001);    // RB0,RB4,RB5,RB6 y RB7 entradas --- RB1,RB2 Y RB3 salidas
   set_tris_A(0b00000000);    // Todo salidas
   output_low(PIN_B1);               // RB1 no la usamos
   output_low(PIN_B2);               // RB2 no la usamos
   output_low(PIN_B3);               // RB3 conectado al altavoz
   INTCON=0;
   enable_interrupts(INT_EEPROM); // Unica interrupción habilitada durante toda la ejecución
   enable_interrupts(GLOBAL);     // Habilitador general de interrupciones

// Bucle principal (Se ejecuta de forma indefinida)
   for(;
     {
     dir_escritura = dir_lectura = color_leido = leido = color_pulsado = 0;  // Inicializamos variables
     fin_juego = false;
     escoge_nivel();  // Para escoger entre 4 niveles de dificultad
     while(!fin_juego)
        {
        genera_aleatorio();      // Generamos color
        guarda_color();          // Guardamos color en memoria
        muestra_colores();       // Mostramos colores guardados hasta el momento
        pulsa_secuencia();       // Recogemos pulsaciones
        if(!fin_juego)        // Cada vez que acertamos una secuencia completa,encendemos
         {                    //  los 4 leds y generamos tres tonos musicales
         enciende_led(5);     //
         altavoz(1);          //
         altavoz(2);          //
         altavoz(4);          //
         PORTA = 0;           //
         }                    //
        }
     has_fallado(4);     // Si hemos salido del bucle anterior es porque hemos fallado,de
     }                   //  aquí volvemos al principio del bucle principal.
   }



Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 24 de Marzo de 2004, 18:51:00
Saludos

Amigo Biot, me atrevi a realizar el diseño en proteus y con su permiso voy a colocarlo aqui
angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: pocher en 25 de Marzo de 2004, 02:17:00
Pincha en el enlace "aquí".
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 25 de Marzo de 2004, 05:30:00
Ok aqui va de nuevo

prueba de esta forma http://miarroba.com/foros/ver.php?foroid=256746&temaid=1577877

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 26 de Marzo de 2004, 09:40:00
Angelmoi ya pude echarle un vistazo al esquemático que hiciste y quisiera preguntarte si no es mejor conservar las resistencias que suprimiste en los divisores de tensión de cada pulsador.Es mejor proteger las entradas del pic aunque estemos considerando un nivel lógico bajo,también guardándonos de la posibilidad de accionar mas de un pulsador de forma simultánea.Te mando por privado como lo pondría yo a ver que te parece.Saludotes.

Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 26 de Marzo de 2004, 11:51:00
SALUDOS

EL ESQUEMA LO HICE SOLO CON PROPOSITOS DE PRUEBA Y COMO EL PROTEUS.... AGUANTA TODO.

SIN EMBARGO ESTOY DE ACUERDO CONTIGO CUALQUIER MEJORA SE ACEPTA Y SERA BIENVENIDA

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 26 de Marzo de 2004, 11:59:00
Ah,vale
A propósito de proteus ¿se puede usar para simular algo compilado en C?
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 26 de Marzo de 2004, 12:44:00
SALUDOS

PUEDES COMPILAR CON LO QUE QUIERAS,  SIEMPRE Y CUANDO SE GARANTICE Y GENERES EL CODIGO.HEX PARA EL PIC U OTRO MICRO QUE SOPORTE PROTEUS( NO SOLO FUNCIONA CON LOS PICs).
INCLUSO EN ALGUNA PARTE DEL FORO ENCONTRARAS LIBRERIAS EXTRAORDINARIAS QUE SON MUY UTILES A LA HORA DE DISEÑAR.

A PROPOSITO DE DISEÑO AQUI LES ENVIO UNA PAGINA DE REGALO, ESPERO QUE LA DISFRUTEN TAL COMO YO LO HE HECHO.

http://www.airborn.com.au , REVISENLA CON DETALLE Y VERÁN LO UTIL QUE ES PARA REALIZAR DISEÑOS.

TAL COMO LO HE DICHO EN OTRAS OPORTUNIDADES, TENGO BASTANTE TIEMPO QUE NO UTILIZO UN PROTOBOARD, NI INSTRUMENTOS, NI COMPONENTES, NI ALAMBRITOS,  YA QUE TODO ESE ES SIMULABLE CON ESA MARAVILLOSA HERRAMIENTA.

DE HECHO EL ESQUEMA QUE REALICÉ DEL SIMON-GAME LO SIMULE CON PROTEUS

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 26 de Marzo de 2004, 12:56:00
Jajaja pues si es bastante mas sencillo a la vez q eficaz.
Estoy pateandome los posts sobre los simuladores intentando que esto me simule a partir del .cod generado por CCS,pero no hay manera.Cuando cambio los parámetros en Source -> Define code generation tools para usar coddx es como si no cambiase nada,pues le doy a aceptar y si lo vuelvo a mirar sigue como estaba antes de q yo lo cambiara
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 26 de Marzo de 2004, 13:15:00
BIOT.

LA COSA ES ASI DE SIMPLE DESPUES DE HABER CREADO  EL DISEÑO EN PROTEUS, PULSAS BOTON DRECHO SOBRE EL CHIP, LUEGO QUE SE COLOQUE EN ROJO, PULSAS BOTON IZQUIERDO (MOUSE) Y DONDE DICE PROGRAM FILE, ADJUNTAS EL ARCHIVO.HEX SEGUN SEA LA RUTA DONDE HAYAS GUARDADO O COMPILADO, Y DESPUES A SIMULAR

QUE LO DISFRUTES

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 26 de Marzo de 2004, 19:57:00
Verás gran Biot, para simular en C sigue estos pasos:
Para la primera vez debes decirle al Proteus el programa de C que vas a usar para esos menesteres.
menú Source-> Define Code Generation tools
Pulsas New y buscas la ruta del archivo PCW.exe que está dentro de la carpeta del Picc. Y pulsas abrir.
Ya le hemos indicado el programa. Ahora hay que indicarles los archivos que va a usar.
Con el PCW seleccionado en el desplegable!!, más abajo donde pone Source EXtn. escribe C y donde pone Obj. Extn. escribe COF. Donde pone Command line escribe "%1" /q y ya esta. Pulsa OK
Luego si quieres tener la posibilidad de hacer debug paso a paso (que en este caso es lo que quieres), tienes que hacer:
menú Source-> Add/Remove Source files...
Ahí pulsa New y escoges el archivo .c del programa en cuestión y más abajo en el desplegable escoge el PCW (que es lo que has creado antes. Le indicas que use ese para el debug).
Luego, haces lo que te ha esplicado angelmoil pero en lugar de incluir el HEX le incluyes el .COF y listo.
Pulsa play y luego pulsa pause... Verás que se abre una ventana donde está el código y botones con las típicas opciones, step in, step out...
Suerte!
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 27 de Marzo de 2004, 02:56:00
Hola de nuevo genios.
Hice lo q has comentado cucaracha pero proteus me sigue haciendo lo mismo,no se hacen efectivos los cambios en la selección de herramienta generadora de código.Cuando vuelvo a mirar siguen los parámetros por defecto: ASEM51 como herramienta a usar y extensión ASM para el fichero fuente,etc...
Para el debug paso a paso prefiero MPLAB que al menos lo manejo.Mi intención es probar esto en tiempo real,y el caso es que el esquemático de angelmoi123 simula de escándalo,despues de seguir las indicaciones que me dió, a excepción de un led que se queda encendido cuando no debe pero por el resto lo hace bien.Pero el mío no hace na de na!!!
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 27 de Marzo de 2004, 04:29:00
Yo la versión que tengo es la 6.3 sp1. Lo que te cuento es para esta. No se si funcionará en otras.
Mira, suponiendo que se ha creado en Code Gener.... lo del PCW, dá igual que al abrir eso salga ASM51 o lo que sea. TE va a salir el primero de la lista por orden alfabético. En esa parte sólo defines programas.
Pero en la otra, que es la importante, donde le indica el programa .C, en lo de Add/remove... ahí si tiene que aparecer lo de PCW, que previamente has escogido.
Dime, que versión tienes???
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 27 de Marzo de 2004, 04:35:00
Tengo la 6.2 sp5.
Con respecto a la simulación ya me funciona con el método de angelmoi.
El problema estaba en que los terminales de masa no estaban bien puestos.Tengo que copiarlos desde otro esquemático y pastearlos en el mío pq si no no va bien.Aún así sigue haciéndome alguna cosilla rara como quedarse un led encendido cuando debiera apagarse.Te lo mando al privado a ver si pudieras simularlo tú cuando tengas tiempo y ganas.Saludos.

MALAGA A LA UEFA!!!!
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 27 de Marzo de 2004, 04:52:00
Envíame también los archivos que estas usando... El asm, el hex y el cof si lo tienes
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 27 de Marzo de 2004, 05:25:00
A mi me funciona simplemente cargando el .coff en vez de cargar el Hex.
Simula y si hago una pausa, automaticamente veo el codigo y luego con el paso a paso o funcion tras funcion veo el codigo, variables etcetera...
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 27 de Marzo de 2004, 08:00:00
SALUDOS A TODOS GENIOS

AMIGO BIOT, COMO TE COMENTE AL PRINCIPIO, LA VERSION INICIAL DEL ESQUEMA QUE TE ENVIE FUNCIONA PERFECTAMENTE CON EL PROTEUS, PRUEBA CON ESA A VER COMO TE VA.

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 27 de Marzo de 2004, 09:49:00
Pues casi me vuelvo loco. No se porqué leches no hace debug bien. Cuando pulso play lo intenta compilar y da error en el PCW y en proteus. Y la cosa es que no tengo activada la opción de que compile.
Al final lo he solucionado activando la opción de que no compile, la que hay más abajo en la pantalla de lo de Code Genetarion...

El programa que me enviastes no funcionaba bien, al menos a mí no. Lo que he hecho es cambiar la lógica de los pulsadores. Los he puesto con las pull up activas.
También he cambiado la rutina de anti-rebote y otra cosa que me ha vuelto loco... Cuando seleccionas el nivel tenías puesto que limpiara el puerto y a continuación que pusiese en alto el pin del led correspondiente. Pues no lo hacia bien. Sólo he cambiado de lugar esas cosas para que le dé tiempo a hacerlo, cosa que la verdad no entiendo por que no le dá tiempo. En fin ahora va bien.
Bueno, sigue tú haciendo pruebas con el código, que a mi ya me duele la cabeza:
Codigo:


                 /******************* SIMON *********************
                  *                                             *
                  *                  By Biot                    *
                  *                 S.I.T.T.M                   *
                  *                                             *
                  ***********************************************/

/******************************** ESPECIFICACIONES *****************************

 El dispositivo físico consta de cuatro leds (rojo,verde,amarillo y azul)
 conectados a RA0,RA1,RA2 y RA3 (en ese orden),de un altavoz conectado a RB3
 y de cinco pulsadores.
 Un pulsador está conectado a RB0 (para generar el color aleatorio) y los otros
 cuatro,que corresponden a cada uno de los leds,están conectados a RB4,RB5,RB6
 y RB7.Tanto los leds como los pulsadores son activos a nivel alto.

*******************************************************************************/



/*******************
*   PREPROCESADO   *
********************/

#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT
#use fast_io(A)
#use fast_io(B)

/****************************************
*  DEFINICIÓN DE ETIQUETAS Y VARIABLES  *
*****************************************/

#byte   PORTA = 0x05      // Puerto A

#byte   PORTB = 0x06      // Puerto B y bits utilizados
#bit  RB0 = 0x06.0
#bit  RB3 = 0x06.3
#bit  RB4 = 0x06.4
#bit  RB5 = 0x06.5
#bit  RB6 = 0x06.6
#bit  RB7 = 0x06.7

#byte   INTCON = 0x0B

int aleatorio,dir_lectura,dir_escritura,color_leido,leido,color_pulsado,nivel;
short fin_juego;


/***************
*  SUBRUTINAS  *
****************/


void retardo(int latencia)
   {
   switch(latencia)
      {
      case 1: delay_ms(200);       // Correspondiente al nivel 1
      break;
      case 2: delay_ms(100);       // Nivel 2
      break;
      case 3: delay_ms(50);       // Nivel 3
      break;
      case 4: delay_ms(15);       // Nivel 4
      break;
      default:
      break;
      }
   }


void altavoz(int tono)  // Para generar un sonido diferente para cada color
   {
   int i,j;
   for(i=0; i<=40; i++)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);      // La distancia entre pulso y pulso viene determinada
       delay_us(300*(6-tono));   //  por el parámetro tono
       output_low(PIN_B3);
       delay_us(300*(6-tono));
       }
     }
   }


void antirebote()
   {
   delay_ms(30);
   while((RB4|RB5|RB6|RB7)== 0) {}  // No progresamos hasta que ningún pulsador esté activo
   delay_ms(30);
   }


void comprueba()
   {
   leido = read_eeprom(dir_lectura);  // Leemos la dirección eeprom correspondiente.
   if(leido != color_pulsado)         // Si la pulsación no ha sido correcta,acaba el
    {                                 //  juego y volvemos al principio del programa
    fin_juego = true;
    }
   }


void enciende_led(int color)  // Enciende el led correspondiente
   {
   switch(color)
      {
      case 1: output_high(PIN_A0);     // Led rojo
      break;
      case 2: output_high(PIN_A1);     // Led verde
      break;
      case 3: output_high(PIN_A2);     // Led amarillo
      break;
      case 4: output_high(PIN_A3);     // Led azul
      break;
      default: PORTA = 15;             // Los 4 leds
      break;
      }
   }


void escoge_nivel()    // El led que se mantiene encendido corresponde al nivel elegido
   {
   nivel = 1;
   PORTA = 0;
   output_high(PIN_A0);  // Por defecto,encendemos el led rojo (nivel 1).
   while(RB0)              // El nivel por defecto es el 1.Hasta que pulsemos RB0
      {
                           //  podremos seleccionar cualquiera de los 4 niveles
         if(!RB4)
          {
          PORTA = 0;
          nivel = 1;
          antirebote();
          output_high(PIN_A0);      // Nivel 1 - > led rojo encendido
          }else if(!RB5) {
           PORTA = 0;
           nivel = 2;
           antirebote();
           output_high(PIN_A1);     // Nivel 2 - > led verde encendido
          }else if(!RB6) {
           PORTA = 0;
           nivel = 3;
           antirebote();
           output_high(PIN_A2);     // Nivel 3 - > led amarillo encendido
          }else if(!RB7) {
           PORTA = 0;
           nivel = 4;
           antirebote();
           output_high(PIN_A3);     // Nivel 4 - > led azul encendido
          }
   }
   antirebote();
   PORTA = 15;            // Una vez hemos escogido nivel,se encienden los 4 leds
   delay_ms(1000);        //  para indicar que podemos empezar a jugar
   PORTA = 0;
   }


void genera_aleatorio()   // Al pulsar RB0 genera un número entre 1 y 4 que se guardará
   {                      // tal cual en memoria...
   aleatorio = 1;               // 1 -> Rojo
   while(RB0)                   // 2 -> Verde
     {                          // 3 -> Amarillo
     if(aleatorio == 4)         // 4 -> Azul
       {
       aleatorio = 1;
       }else {
       aleatorio++;
       }
     }
   antirebote();
   }


void guarda_color()
   {
   write_eeprom(dir_escritura,aleatorio);  // Guardamos el color generado y apuntamos a
   dir_escritura++;                        //  la siguiente dirección para una próxima
   }                                       //  escritura


void has_fallado(int tono)     // Si entramos aquí es que hemos pulsado incorrectamente
   {
   int i,j;
   enciende_led(color_pulsado);
   for(i=0; i<=100; i++)          // Generamos tono de error (más grave)
     {
     for(j=0; j<=4; j++)
       {
       output_high(PIN_B3);
       delay_ms(1*(6-tono));
       output_low(PIN_B3);
       delay_ms(1*(6-tono));
       }
     }
   delay_ms(1000);
   }


void muestra_colores()
   {
// Desde el primero hasta el último que se ha guardado en memoria,los vamos mostrando
//  con una rapidez que vendrá determinada por el nivel de dificultad elegido al principio.
   for(dir_lectura = 0; dir_lectura < dir_escritura; dir_lectura++)
      {
      color_leido = read_eeprom(dir_lectura);   // Lectura eeprom
      enciende_led(color_leido);                // Enciende led correspondiente
      altavoz(color_leido);                     // Emite tono
      retardo(nivel);                           // Retardo según nivel de dificultad
      PORTA = 0;                                // Apaga led
      retardo(nivel);                           // Retardo según nivel de dificultad
      }
   }


void pulsa_secuencia()
   {
   short sal;
   dir_lectura = 0;
// Recogemos las pulsaciones y se va comprobando si son correctas hasta que
//  alguna no lo sea o hasta que hayamos acertado todos los colores guardados
//  hasta el momento.
// dir_escritura contiene la dirección eeprom siguiente al último color guardado
//  y dir_lectura la usamos para ir consultando cada posición de memoria y comprobar
//  si la pulsación ha sido correcta.En el momento en que fallemos alguna,fin_juego toma
//  el valor TRUE.
   while((dir_lectura < dir_escritura) && (!fin_juego))
      {
      sal = false;
      while(!sal)  // Mientras no haya pulsación nos mantenemos dentro del bucle
         {
         if(!RB4)             // Se ha pulsado el rojo,salimos del bucle
          {
          color_pulsado = 1;
          sal = true;
          }else if(!RB5) {    // Se ha pulsado el verde,salimos del bucle
          color_pulsado = 2;
          sal = true;
          }else if(!RB6) {    // Se ha pulsado el amarillo,salimos del bucle
          color_pulsado = 3;
          sal = true;
          }else if(!RB7) {    // Se ha pulsado el azul,salimos del bucle
          color_pulsado = 4;
          sal = true;
          }else {                      // No se ha pulsado ninguno,continuamos
          sal = false;                 //  dentro del bucle
          }
         }
      comprueba();   // Algoritmo que comprueba si la pulsación ha sido correcta
      enciende_led(color_pulsado);  // Enciende el led del color que hemos pulsado
      altavoz(color_pulsado);       // Genera el tono del color que hemos pulsado
      antirebote();                 // No comment
      PORTA = 0;                    // Apagamos led
      dir_lectura++;                // Para comprobar la siguiente dirección eeprom
      }
   }


/*********************
* PROGRAMA PRINCIPAL *
**********************/


void main()
   {
// Inicialización periféricos
   set_tris_B(0b11110001);    // RB0,RB4,RB5,RB6 y RB7 entradas --- RB1,RB2 Y RB3 salidas
   set_tris_A(0b00000000);    // Todo salidas
   port_b_pullups(TRUE);
   output_low(PIN_B1);               // RB1 no la usamos
   output_low(PIN_B2);               // RB2 no la usamos
   output_low(PIN_B3);               // RB3 conectado al altavoz
   INTCON=0;
   enable_interrupts(INT_EEPROM); // Unica interrupción habilitada durante toda la ejecución
   enable_interrupts(GLOBAL);     // Habilitador general de interrupciones

// Bucle principal (Se ejecuta de forma indefinida)
   for(;
     {
     dir_escritura = dir_lectura = color_leido = leido = color_pulsado = 0;  // Inicializamos variables
     fin_juego = false;
     escoge_nivel();  // Para escoger entre 4 niveles de dificultad
     while(!fin_juego)
        {
        genera_aleatorio();      // Generamos color
        guarda_color();          // Guardamos color en memoria
        muestra_colores();       // Mostramos colores guardados hasta el momento
        pulsa_secuencia();       // Recogemos pulsaciones
        if(!fin_juego)        // Cada vez que acertamos una secuencia completa,encendemos
         {                    //  los 4 leds y generamos tres tonos musicales
         enciende_led(5);     //
         altavoz(1);          //
         altavoz(2);          //
         altavoz(4);          //
         PORTA = 0;           //
         }                    //
        }
     has_fallado(4);     // Si hemos salido del bucle anterior es porque hemos fallado,de
     }                   //  aquí volvemos al principio del bucle principal.
   }





Una cosa, al usar las pull up el circuito cambia. Pulsadores a masa y por el otro lado al PIN. Sin más.
Título: RE: Rutinas y programas en CCS C
Publicado por: pocher en 28 de Marzo de 2004, 03:01:00
Este es un ejercicio donde aparecen flancos y antirebotes:

Diseñar un automatismo de forma que cada vez que se actue sobre un pulsador p se encienda una bombilla B si estaba apagada, o se apague si estaba encendida.

Codigo:
//               P4_2_2.C

#include <16f84a.h>   // Se incluye el fichero 16f84a.h con definiciones
// de bits y  registros del PIC 16f84a

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)
#use fast_io(B)

#byte port_b = 6         // Variable port_b en dirección 0x06 (PORTB)

main()
{
   port_b = 0;            // Salida a cero
   set_tris_a(0x1F);         // Programación del PORTA como entradas
   set_tris_b(0x00);         // Programación del PORTB como salidas
   
   while (1)
   {
      do
      {
         restart_wdt();      // Puesta a cero del temporizador watchdog
      }
      while (input(PIN_A0));   // Si p=1 no salir del bucle do-while
      delay_ms(20);         // Antirebotes
      
      do
      {
         restart_wdt();      // Puesta a cero del temporizador watchdog
      }
      while (!input(PIN_A0));   // Si p=0 no salir del bucle do-while
      delay_ms(20);         // Antirebotes

      output_bit (PIN_B0,!input(PIN_B0));   //  B = !B
      
   }
}



Un saludo
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 28 de Marzo de 2004, 05:47:00
Jajaa a mi no me dió tanto quebradero de cabeza,aunque yo no pase por la etapa de simulación.De CCS pasaba directamente a la protoboard hasta que funcionó a la perfección despues de unos pocos intentos.Parece que proteus no me va tan fino como yo pensaba.
Cambiando de tema,ahí va una pequeña rutina, para incluir en la librería lcd.c,que desplaza el display real sobre el virtual un número dado de posiciones

Codigo:

void desplazar_display(int posiciones, boolean sentido)
   {
// Primer parámetro: Numero de desplazamientos
// Segundo parámetro: Sentido del desplazamiento (TRUE=Derecha, FALSE=Izquierda)
   int i,aux;
   if (sentido)
    {
    aux=0b00011000;       // Desplazamiento a la derecha
    }else {
    aux=0b00011100;
    }
   for (i=1; i<=posiciones; i++)
     {
     lcd_send_byte(0,aux);
     }
}


Título: RE: Rutinas y programas en CCS C
Publicado por: pocher en 28 de Marzo de 2004, 10:43:00
Cuidado al simular la rutina de Biot en el PROTEUS: a la izquierda desplaza bien y desaparecen todos los caracteres, pero a la derecha no desaparecen los caracteres al llegar a la esquina derecha.

Funciona perfectamente en una LCD real.

Un saludo
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 29 de Marzo de 2004, 10:21:00
O deaqui
(es una prueba)
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 29 de Marzo de 2004, 10:22:00
Me encanta este foro!!
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 30 de Marzo de 2004, 06:25:00
Muy bueno, como ya lo dije antes.
Por favor dale estos datos a Pacalaconcurso para que lo pueda mostrar en su pagina WEB completo.
Sera bueno para ambos...
Título: RE: Rutinas y programas en CCS C
Publicado por: pacalaconcurso en 30 de Marzo de 2004, 06:53:00
ya lo subi tambien al web

saludos
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 30 de Marzo de 2004, 09:40:00
Recuerda lo de las rutinas Modbus.....
Título: RE: Rutinas y programas en CCS C
Publicado por: angelmoi123 en 30 de Marzo de 2004, 11:27:00
SALUDOS

FELIX, ME ANOTO CON MARCOS EN EL MISMO REQUERIMIENTO

angelmoi123
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 31 de Marzo de 2004, 09:02:00
¿Alguien sabe qué motivos pueden provocar que un diseño no simule bien en Proteus cuando en la realidad funciona perfectamente?
He hecho varias pruebas y por lo menos a mi los problemas para Proteus me vienen sobre todo en las condiciones de salida de los bucles.He conseguido que simón ya simule sin el más mínimo fallo.
Aparte he reestructurado el programa y ya no es necesario el uso del pulsador adicional J0,por lo que se puede eliminar del circuito y dejar RB0 al aire.
Como ya he dicho,en Proteus va como la seda,por lo que imagino que en montaje real será lo mismo.Otra cosa sería pensar en el caso contrario...
Biot.
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 31 de Marzo de 2004, 09:38:00
En mi caso Proteus no puede simular un programa de multiplexaje de displays de leds funcionando por interrupciones del timer0, lo hace tan lento que podria irme a dormir mientras espero la segunda actualizacion del display.
muy a pesar del Proteus, este programa anda bien en la practica...
Título: RE: Rutinas y programas en CCS C
Publicado por: Modulay en 31 de Marzo de 2004, 09:51:00
A propósito de lo que comentas..
Tengo hecho un voltímetro con el 16f876 para mi fuente de alimentación y va bien en proteus,incluído el multiplexado de los displays,con un retardo de unos 10 ms.Pero lo monto en la protoboard y ni por asomo.He estado mirando el post que hay al respecto pero va en picbasic y usa displays de ánodo común.Los míos son de cátodo y uso transistores npn.
Un esquemita!!!
Una ayudita!!!
Algo!!!!!!
Título: RE: Rutinas y programas en CCS C
Publicado por: pacalaconcurso en 05 de Abril de 2004, 07:42:00
bueno,bueno... despues de muuucho tiempo al fin hoy voy a saldar mi vieja deuda con marcos.
la version del pic_modbus que tienes en mi web incluye un ejemplito para encender y apagar un led por modbus. de igual forma puedes usar los comandos para lo que quieras.
la version del modbus esta revisada e incluye la rutina para enviar al master posibles errores. por defecto implemente el de comando desconocido.

espero que os sirva y que en base a ella se generen nuevos ejemplos para todos.

un saludo
Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 13 de Abril de 2004, 12:57:00
Gracias Felix !!
Para variarle el tiempo de encendido y apagado habria que escribir directamente sobre algun registro o sera mas aconsejable hacerlo sobre otro y actualizarlo si este cambio ??

Otra cosa:
Tienes o tiene alguien rutinas de manejo de menues y opciones en C??
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 13 de Abril de 2004, 15:09:00
En el subforo de C hay un tema llamado  "menu con 3 botones". Si realizas una busqueda con eso te sale. Ahí hay varios ejemplos y un programa que los hace, pero en basic.
Saludos!!
Título: RE: Rutinas y programas en CCS C
Publicado por: pacalaconcurso en 13 de Abril de 2004, 16:34:00
marcos si quieres puedo subir un par de programas que hize:
uno para mi famoso receptor de tv que maneja el menu con un encoder y un boton y otro para mi tambien famoso rotor para antenas que usa tres botones y ademas incluye scroll sobre el lcd de los datos

ahora tengo poquiiiiisimo tiempo libre asi que de momento lo tendreis que estudiar por libre

respecto al modbus puedes usar una de las word del area de datos, comparar y si cambia el valor actualizar el timer... si el fin de semana tengo tiempo le añado al ejemplo alguna que otra mariconadilla mas

saludos

Título: RE: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 13 de Abril de 2004, 16:38:00
Gracias CUCA y Felix !!

Si tienes tiempo subela, siempre comentas bien tu codigo, asi que no sera dificil el interpretarlo, Felix.

Busque en tu WEB, me parecia que en algun momento habias publicado eso alli, pero no lo encontre...
Título: RE: Rutinas y programas en CCS C
Publicado por: cucaracha en 13 de Abril de 2004, 16:53:00
Receptor de TV?? Famoso?? Y donde lo pusistes, que quiero ojearlo. En tu web?? Preguntas?? Más preguntas??
Título: Re: RE: Rutinas y programas en CCS C
Publicado por: arielmdq en 06 de Septiembre de 2015, 10:39:46
Aqui va el primer ejemplo de las rutinas, esta vez se trata de la rutina NumGran, que muestra un numero enviado al LCD en numeros que abarcan las dos lineas de un LCD de 2 x 16 caracteres, el mas utilizado de todos...

Envio mi agradecimiento por empujarme al C y especialmente a traducir este ejemplo a Ariel PIKMAN, quien me impulso fuertemente al ponerme el desafio de traducir esta rutina que habia puesto en el foro de PBP.<img border="0"  width="31" height="31" src="http://pics.miarroba.com/caretos/bounce.gif"><img border="0"  width="31" height="31" src="http://pics.miarroba.com/caretos/bounce.gif">

Puse dos ejemplos de su utilizacion <a href="http://miarroba.com/foros/ver.php?foroid=256746&temaid=1539858&msgid=12424363" target="_blank">AQUI [/url], una es un simple contador, igual al ejemplo en PBP, el otro ejemplo ya muestra como mostrar el resultado del conversor A/D en numeros grandes en el LCD.

Espero lo disfruten y les sirva, es de uso libre.<img border="0"  width="15" height="15" src="http://pics.miarroba.com/caretos/biggrin.gif"><img border="0"  width="15" height="15" src="http://pics.miarroba.com/caretos/biggrin.gif">

Hola que tal, estoy interesado en bajar los ejemplos para representar numeros grandes en lcd, pero el link me dice que la pagina solicitada no existe.
Queria saber como puedo hacer para ver estos ejemplos .Desde ya muchas gracias .
                                                                                                                    Saludos!!!
Título: Re: Rutinas y programas en CCS C
Publicado por: MGLSOFT en 06 de Septiembre de 2015, 11:35:06
Es porque estaban en Mi@rroba y ya no estamos mas en ese hosting...

Veo si las encuentro y las subo de nuevo...
Título: Re: Rutinas y programas en CCS C
Publicado por: arielmdq en 06 de Septiembre de 2015, 19:45:08
Uy que bueno sería si las podes subir de nuevo ,  :-/ te estaré muy agradecido  :)
                                                                                                                   Saludos!!!