Autor Tema: Ejemplitos en C para 16F648A  (Leído 610076 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado monopic

  • PIC10
  • *
  • Mensajes: 25
RE: Ejemplitos en C para 16F648A
« Respuesta #150 en: 05 de Octubre de 2005, 22:06:00 »
hola vszener mira lo que he creado son tres animaciones la primera una cara feliz-triste, la segunda esta la bateria que inicialmente hiciste y en la tercera el famoso caminante el cual lo hice basandome en tu ejemplo.,,

//////////////////////////////////////////////////////////////////////////////////
// 3 animaciones en una lcd de 2x16
//   Conexiones:      B0 -> E            
//               B1 -> RS         
//               B2 -> RW      
//               B4 -> D4        
//               B5 -> D5            
//               B6 -> D6   
//               B7 -> D7                  
//////////////////////////////////////////////////////////////////////////////////

#include <16f877a.h>            //pic a utilizar          
#fuses XT   //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#define use_portb_lcd TRUE
#include <lcd420.c>               //libreria manejo de la lcd

///DECLARACION DE FUNCIONES
void recarga(void);      //funcion que crea el nuevo caracter
void cara(void);//carita creada por monopic
void caminante(void);
///DECLARACION DE VARIABLES GLOBALES
char cont=0;      //contador que apunta al nuevo caracter diseñado
   int8    bat0[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00010001,0b000010001,0b00010001,0b00011111},
bat20[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00010001,0b00010001,0b00011111,0b00011111},
bat40[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00010001,0b00011111,0b00011111,0b00011111},
bat60[]={0b00001110,0b00001010,0b00010001,0b00010001,0b00011111,0b00011111,0b00011111,0b00011111},
bat80[]={0b00001110,0b00001010,0b00010001,0b00011111,0b00011111,0b00011111,0b00011111,0b00011111},
bat100[]={0b00001110,0b00001010,0b00011111,0b00011111,0b00011111,0b00011111,0b00011111,0b00011111};      

int8 feliz[]={0b11011,0b00000,0b11011,0b11011,0b00000,0b10001,0b01110,0b00000};
int8 triste[]={0b11011,0b00000,0b11011,0b11011,0b00000,0b01110,0b10001,0b00000};

int8 cam0[]={0b01110,0b01110,0b00100,0b00100,0b00100,0b00100,0b01100,0b00000},
     cam1[]={0b01110,0b01110,0b00100,0b00100,0b01100,0b00100,0b01100,0b00000},
    cam2[]={0b01110,0b01110,0b00100,0b00100,0b01010,0b11010,0b00110,0b00000},
    cam3[]={0b01110,0b01110,0b00100,0b00100,0b00110,0b01001,0b11001,0b00000},
    cam4[]={0b01110,0b01110,0b00100,0b00100,0b00111,0b01001,0b11000,0b00000},
    cam5[]={0b01110,0b01110,0b00100,0b00100,0b01100,0b00110,0b01100,0b00000};
//mios monopic


///PROGRAMA
void main(void)
{
   lcd_init();       //inicializa lcd

   recarga();         //crea 1 animacion
   lcd_gotoxy(6,1);   //presentacion...
   lcd_putc("Monopic "Giño;   //...inicial
   
   for(;Giño{   //bucle...
      lcd_gotoxy(2,1);      //donde se va a mostrar la animacion de la bateria
      lcd_send_byte(1,0);    //muestra animacion
      recarga();            //crea animacion
      delay_ms(70);   
      caminante();      
      lcd_gotoxy(3,1);   
      lcd_send_byte(1,1);   // muestra animacion por monopic
      cara();
      lcd_gotoxy(4,1);
      lcd_send_byte(1,2);
      caminante();
      delay_ms(70);
      cont++;               //apunta a siguiente animacion
         }   //...infinito
}

///FUNCION ENCARGADA DE CREAR ANIMACION
void recarga(void){
   char i;      //indice para for
   
   lcd_send_byte(0,0x48); // se escribe en la GCRAM posicion 0x40
   
   switch(cont){   //selecciona animacion
      case 0: for(i=0;i<8;i++)   //bateria al 0%
               lcd_send_byte(1,bat0);
            break;
      case 1: for(i=0;i<8;i++)   //bateria al 20%
               lcd_send_byte(1,bat20);
            break;
      case 2: for(i=0;i<8;i++)   //bateria al 40%
               lcd_send_byte(1,bat40);
            break;
      case 3: for(i=0;i<8;i++)   //bateria al 60%
               lcd_send_byte(1,bat60);
            break;
      case 4: for(i=0;i<8;i++)   //bateria al 80%
               lcd_send_byte(1,bat80);
            break;
      case 5: for(i=0;i<8;i++)   //bateria al 100%
               lcd_send_byte(1,bat100);
               cont=0;         //restaura indice de crear animacion
         }
}         


void cara(void){
char i;
lcd_send_byte(0,0x40);

   switch(cont){   //selecciona animacion
      case 0: for(i=0;i<8;i++)   //bateria al 0%
            lcd_send_byte(1,triste);
            break;
      case 3: for(i=0;i<8;i++)   //bateria al 0%
            lcd_send_byte(1,feliz);
            break;                   
            cont=cont; }
 }
 

void caminante(void){
   char i;      //indice para for
   
   lcd_send_byte(0,0x50); // se escribe en la GCRAM posicion 0x56
   
   switch(cont){   //selecciona animacion
      case 0: for(i=0;i<8;i++)   //bateria al 0%
               lcd_send_byte(1,cam0);
            break;
      case 1: for(i=0;i<8;i++)   //bateria al 20%
               lcd_send_byte(1,cam1);
            break;
      case 2: for(i=0;i<8;i++)   //bateria al 40%
               lcd_send_byte(1,cam2);
            break;
      case 3: for(i=0;i<8;i++)   //bateria al 60%
               lcd_send_byte(1,cam3);
            break;
      case 4: for(i=0;i<8;i++)   //bateria al 80%
               lcd_send_byte(1,cam4);
            break;
      case 5: for(i=0;i<8;i++)   //bateria al 100%
               lcd_send_byte(1,cam5);
               cont=0;         //restaura indice de crear animacion
         }
}         

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #151 en: 06 de Octubre de 2005, 04:47:00 »
Jeje ke tal a todos!!! lo siento estoy algo perdido ya que estoy de viaje, ahora de regreso de madrid y este fin de semana me voy a cordoba...jeje asi que por eso no puedo subir mas ejemplitos ainsss jeje haber por partes....

monopic, con respecto de usar los 32 caracteres de la lcd decirte que s epuede hacer como te indique, es decir tu realizas animaciones la guardas en una posicion de memoria y despues la dibujas donde quieras en la lcd mediante la funcion por ejemplo lcd_gotoxy(x,y); si te refieres a declarar 32 animaciones y almacenarlas en la cgram de la lcd decirte que no s epuede ya que solo admite un maximo de almacenamiento de 8(aunque en otro libro lei que eran 9 es cuestion d emirar el data sheet), con respecto a que lo has cargado en un 16F84 y dices que no corre igual...ummmm que sale???fijate que el 16F84 solo admite un maximo de 1k....y con respecto a las animaciones que has realizado solo me queda decirte que: FANTASTICO!!!!jeje aunque todavia no he podido verlas ya que estoy de viaje, lo que puedes hacer es como yo, pones el codigo y en el almacen subes tanto el codigo como la simulacion en PROTEUS y despues la enlazas aqui para que la gente pueda bajarsela okis??? pero me gusta ver que alguien utiliza mis programas como base para realizar los suyos...sigue asi!!!!

cchhaa GRACIAS!!!!jeje los animos son buenos y mas ahora!!que estoy super extresado con tanto viajecito, las clases,.....jeje veo que vas por los led"s jeje buen comienzo pronto manejaras 7seg,lcd"s,teclados,....jeje suerte y no desesperes!!!!

Ke tal olotill!!!jeje quieres llegar pronto a la cima ennn!!!jeje haber pregunta bastante buena ya que eso significa que eres observador ummmmm jeje haber la variable declarada dow es simplemente por seguir las reglas de la libreria ds1302.c del compilador CCS, si la miras veras que las funciones declaradas para usar dicho dispositivo devuelven un valor en la variable dow, creo recordar que dicha variable te daba el año proximo.....por eso no la uso porque no me interesa dar el siguiente año, pero vamos que solamente se usa ya que esta declaradas en funciones que usamos como estas:
rtc_set_datetime(day,mth,year,dow,hour,min)
Si no la declaro deberia poner en la 4ºvariable usar la funcion un valor cualquiera indeterminado, asi que me ahorro eso y uso la declaracion d ela libreria: dow, te recomiendo que te mires dicha libreria del compilador! y ahora a seguir hacia delante!!!jeje que pronto llegaras a manejar RS232!!!jeje

Bueno y solo decir que estoy bastante feliz y satisfecho de ver que sirve este post de ayuda a la gente para la programacion, aunque son ejemplitos bastante tontos(algunos.....) mi intencion no era realizar ejemplos complejos, simplemente enseñar o mostrar como se programa lo basico para que cada uno despues a sus intereses lo usase como mejor le conveniese y veo que funciona!jeje repito, estoy algo estresado por tanto viaje pero en cuanto me instale otra vez y vuelva a la rutina empezare a colgar mas ejemplos, todavia queda mostrar la programacion del WDT, CCP1 en mas modalidades y mucho mas!!!!jeje GRACIAS A TODOS y a seguir programando!!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado monopic

  • PIC10
  • *
  • Mensajes: 25
RE: Ejemplitos en C para 16F648A
« Respuesta #152 en: 06 de Octubre de 2005, 13:20:00 »
no se como subir los archivos,, caundo voy a dar una nueva respuesta dice que puedo subir 3 archivos de 256k c/u pero dice que no se puede enviar cuando lo cargo alguien q sepa otra forma q me diga gracias

Desconectado monopic

  • PIC10
  • *
  • Mensajes: 25
RE: Ejemplitos en C para 16F648A
« Respuesta #153 en: 06 de Octubre de 2005, 22:55:00 »
ya se como subirlos aqui estan tres animaciones en una lcd 2x16 se aprecia unca carqa que pasa de feliz a triste y lo contrario,, una carga de bateria hecha por nuestro amigo vnzener,, y el famoso caminante que diseñe en mi programa espero q les guste....respondan a ver k tal voy en mi intento de convertir una lcd 2x16 en grafica.

 alguien sabe como funciona la lcd grafica escribe de izquierda a derecha o algo asi porfa quien sepa no dude en ecribirlo.

aqui esta el link de descarga  http://miarroba.com/foros/ver.php?foroid=348538&temaid=3690144

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #154 en: 19 de Octubre de 2005, 06:20:00 »
Buenass!!!jeje estoy perdido por aqui pero no me olvido!!!jeje ya hace mas de dos meses del post y ya van bastantes ejemlos!, bien estaba aburrido en el trayecto de un viaje y me puse a trastear con las librerias del compilador CCS y adapte la ds1302.c para el manejo del ds1620 es decir de una RTC->Termometro jeje decir que es muyyy BETA pero funciona ,eso si provada solamente en PROTEUS, aqui os dejo el enlace al data sheet del dispositivo:
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2735/ln/en
Y desde este link os podeis descargar la libreria ds1620.c version 0.0 BETA:
http://miarroba.com/foros/ver.php?foroid=348538&temaid=3740041

Haber si saco tiempo y la pongo perfect!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #155 en: 19 de Octubre de 2005, 06:31:00 »
ke tal!!! bien hoy voy a usar la liberia ds1620.c BETA que realice, asi que el ejemplo de hoy es como hacer un medidor de temperatura usando este dispositivo, aqui el programa:

////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"05      
//                    19/Octubre/05
//
//   Programa:   Termometro digital DS1620
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.235
//   Entorno IDE: MPLAB IDE v7.21      Simulador:    Proteus 6.7sp3
//
//   Notas: Se muestra por pantalla de lcd(LM016L) la temperatura del ds1620
//   Conexiones:      A0 -> DQ DS1620
//               A1 -> CLK DS1620
//               A2 -> RST DS1620
//               B0 -> E            
//               B1 -> RS         
//               B2 -> RW      
//               B4 -> D4        
//               B5 -> D5            
//               B6 -> D6   
//               B7 -> D7                  
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h>            //pic a utilizar          
#use delay(CLOCK=4000000)         //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT   //comandos para el programador
#fuses INTRC   //oscilador interno
#use standard_io(a)
#use standard_io(b)
#define use_portb_lcd TRUE         //utilizar el port b para lcd
#define DS1620_DQ      PIN_A0      //declaracion de pins...
#define DS1620_CLK      PIN_A1      
#define DS1620_RST      PIN_A2      //...para el ds1620
#include <ds1620.c>               //libreria del termometro ds1620
#include <lcd.c>                //libreria de lcd

///PROGRAMA
void main(void){
   char i;
   int8 grado[]={0b00000110,0b00001001,0b00000110};   
      
   lcd_init();       //inicializa lcd
   
   lcd_putc("   Termometro
   VsZeNeR"05" );   //presentacion...
   delay_ms(800);   
   lcd_putc("f" );                        //...inicial
   
   lcd_putc("   VsZeNeR"05
Temperatura:" );   //pantalla temp
   
   lcd_send_byte(0,0x40);    // se escribe en la GCRAM posicion 0x40
   for(i=0;i<3;i++)      //dibujo del simbolo grado º
      lcd_send_byte(1,grado[ i ]);
   lcd_gotoxy(16,2);      //donde se va a mostrar º
   lcd_send_byte(1,0);    //muestra animacion
   
   ds1620_init();      //inicializa ds1620      
   
    for(; ; ){         //bucle...
       lcd_gotoxy(14,2);
      printf(lcd_putc,"%d",read_ds1620(0xAA));   //muestra temperatura por pantalla
      delay_ms(500);
      lcd_putc("" );
      }             //...infinito     
}

Aqui la primera prueba con la libreria ds1620.c!


LIBRERIA OBSOLETA


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:03:41 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #156 en: 19 de Octubre de 2005, 06:32:00 »
Desde este enlace os podeis descargar el programa Temeperatura con la libreria beta ds1620.c:


LIBRERIA OBSOLETA


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:04:45 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado mario_pastor

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 101
RE: Ejemplitos en C para 16F648A
« Respuesta #157 en: 02 de Noviembre de 2005, 09:39:00 »
Saludos vszener y a todos en este sub-foro, quiero agradecerte por este aporte tan valioso para nosotros que estamos iniciando en este mundo de la programación en C.... además quiero resaltar el orden y metodología que empleas que muy pocos lo tienen, mis felicitaciones y nuevamente nuchas gracias... ya estaré molestandote con algunas preguntas Sonrisa Gigante

Saludos,
Mario.

Lima - Perú

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #158 en: 03 de Noviembre de 2005, 03:04:00 »
Buenasss!!!jeje se que tengo esto algo olvidado....pero es que estoy ocupado....jeje ainsss holaaa mario_pastor!!!!jeje GRACIAS por las felicitaciones por este post, la verdad que leer de vez en cuando felicitaciones alaga bastante y te dan animos para seguir jeje y encantado de que me molestes con preguntas!jeje

Bueno decir que Microchip ha lanzado su nueva version der MPlab v7.22 aqui el enlace para la descarga
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002
asi que los nuevos ejercicios estaran integrados en el nuevo IDE, tambien decir que los nuevos programas estaran compilados con una version superior del CCS vs3.235, para la bajada del CCS no se puede dar enlaces directos ya que es ilegal(por lo tanto corre el riesgo de que cierren el foro)asi que buscarlos por programas tipo P2P. Bueno hasta otra!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #159 en: 03 de Noviembre de 2005, 03:12:00 »
Holaaaaa!!!!jeje bien, el programa de hoy consiste en manejar el periferico CCP1 configurado como PWM, decir que el PWM consiste en obtener a frecuencias constantes(por lo tanto periodo constante) una anchura de pulso variable(la cual nosotros programamos), en este caso, la anchura de pulsos para las frecuencias constantes es siempre la misma, la mitad del periodo, y las frecuencias las obtenemos mediante el preescaler del TMR2....aqui el ejemplito:

////////////////////////////////////////////////////////////////////////////////////
//                     VsZeNeR"05      
//                    2/Noviembre/05
//
//   Programa:   Uso del CCP1 como PWM
//   Version:   0.0
//
//   Dispositivo: PIC 16F648A         Compilador:    CCS vs3.235
//   Entorno IDE: MPLAB IDE v7.22      Simulador:    Proteus 6.7sp3
//
//   Notas: Usamos el modulo CCP1 como PWM, para ello configuramos el TMR2 de sus tres
//         formas distintas mediante el preescales(1,4,16) que nos dara distintas frecuencias.
//         El ciclo viene determinado por (1/clock)*4*t2div*(periodo+1), donde en este caso
//         clock=4MHz y periodo=127.
//         Frecuencias:
//               ·T2_DIV_BY_1  -> 128us  -> 7,81KHz
//               ·T2_DIV_BY_4  -> 512us  -> 1,95KHz
//               ·T2_DIV_BY_16 -> 2,05ms -> 487,8Hz
//         En este programa tendremos un nivel alto a la mitad de la frecuencia obtenida mediante
//         la relacion  valor*(1/clock)*t2div donde valor=%nivel alto del pulso
//         Anchura del pulso(Duty):
//            ·128us   -> 64us   -> 64us/(1*(1/4000000))    = 256
//            ·512us   -> 256us  -> 256us/(4*(1/4000000))   = 256
//            ·2,05ms  -> 1,02ms -> 1,02ms/(16*(1/4000000)) = 256
//
//         Conexiones:      B0 -> E            
//                     B1 -> RS         
//                     B2 -> RW      
//                     B4 -> D4        
//                     B5 -> D5            
//                     B6 -> D6   
//                     B7 -> D7
//                     B3 -> Canal 1 osciloscopio
//                     A0 -> Boton
//////////////////////////////////////////////////////////////////////////////////

#include <16f648a.h>            //pic a utilizar          
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP      //ordenes para el programador
#fuses INTRC   //oscilador interno
#use delay (clock=4000000)         //Fosc=4Mhz
#use standard_io(b)
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd

///DECLARACION DE FUNCIONES
void cambia_frec(char);      //funcion encargada de cambiar la frecuencia

///PROGRAMA
void main(void)
{
   char opcion=0;         //variable encargada de mostrar menu de frec
   
   setup_ccp1(CCP_PWM);    //ccp1 modo PWM
   
   lcd_init();            //inicializa lcd
   
   cambia_frec(opcion);   //muestra primera frec
   
   for( ; ; ){      //bucle...
      if(!input(PIN_A0)){            //¿se ha pulsado el boton?
         do{                     //SI -> eliminar...            
         }while(!input(PIN_A0));      //...rebotes del boton
         opcion++;               //apunta a siguiente frec
         if(opcion>2)            //¿ya se han mostrado todas las frec?
            opcion=0;            //SI -> resetea opcion
         cambia_frec(opcion);      //cambia frecuencia
         }
      }         //...infinito
}

///FUNCION ENCARGADA DE CAMBIAR LA FRECUENCIA POR CCP1
void cambia_frec(char menu)
{
   lcd_putc("f" );   
   switch(menu){   //menu para eleccion de frecuencias
      case 0:   setup_timer_2(T2_DIV_BY_1, 127, 1);      //128us -> 7,81kHz
            set_pwm1_duty(256);                  //64us/(1*(1/4000000)) = 256
            lcd_putc("   VsZeNeR"05
Frec=7,81KHz" );
            break;
      case 1:   setup_timer_2(T2_DIV_BY_4, 127, 1);      //512us -> 1,95kHz
            set_pwm1_duty(256);                  //256us/(4*(1/4000000)) = 256
            lcd_putc("   VsZeNeR"05
Frec=1,95KHz" );
            break;
      case 2:   setup_timer_2(T2_DIV_BY_16, 127, 1);    //2,05ms -> 487,8Hz
            set_pwm1_duty(256);                   //1,02ms/(16*(1/4000000)) = 256
            lcd_putc("   VsZeNeR"05
Frec=487,8Hz" );
      }
}

Decir que la frecuencia que obtenemos son de 7,81kHz,1,95kHz y 487,8Hz y se cambia pulsando en boton que esta en el pin A0. Observar en la simulacion PROTEUS en el osciloscopio las divisiones del Timerbase para ver y comprobar que la anchura de pulso es la calculada y por o tanto la deseada. Aqui dejo un enlace a un post donde se habla del tema del PWM y se explica en que consiste
Como funciona el PWM


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:07:49 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #160 en: 03 de Noviembre de 2005, 03:16:00 »
Desde este enlace os podeis descargar el programa anterior: CCP1 modo PWM


Suerte!!! :wink:
« Última modificación: 25 de Mayo de 2006, 11:05:44 por vszener »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado andresitovv

  • PIC10
  • *
  • Mensajes: 40
RE: Ejemplitos en C para 16F648A
« Respuesta #161 en: 03 de Noviembre de 2005, 06:12:00 »
Puedes poner algún ejemplo en el q estén involucrados varios archivos? Siempre lo haceis todo en uno, y para una progrmación extensa y ordenada eso no es bueno. Vamos, que quiero saber como se utilizan varios archivos en CCS. Gracias.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Ejemplitos en C para 16F648A
« Respuesta #162 en: 03 de Noviembre de 2005, 12:25:00 »
Ke tal!!!! bien en el que esten involucrados varios archivos creo que en el ejemplo 10 hice una libreria la cual reune el ejemplo de juego de luces y el coche fantastico....miratelo y me comentas!Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado andresitovv

  • PIC10
  • *
  • Mensajes: 40
RE: Ejemplitos en C para 16F648A
« Respuesta #163 en: 04 de Noviembre de 2005, 08:53:00 »
Muchas gracias, la q verdad es q sí que sirve. Y la verdad es que lo había hecho yo ya, pero te lo agradezco igualmente. Mi problema es cuando quiero usar una variable definida en main como variable global en una función del archivo .h. Dirás que lo pase como parámetro, pero mi problema es q esa variable cambia en una rutina de interrupción que está en el archivo principal (.c) y la función q está en el .h debe ser capaz de usarla. Si pongo la rutina de interrupción en el .h funcionará? Y si quiero tener varios archivos .h (es un programa bastante largo y debo tenrlo ordenado para presentarlo) basta con que lo ponga la rutina de interrupción en uno, o tiene q estar en el .c? Espero haberme explicado más o menos. Te pongo el código (q es más largo todavía de lo q aparece aqui), aunq lo único q sirve para mi pregunta del main.c es la rutina de interrupción de Timer.

/* ARCHIVO MAIN.C*/


#include <18F452.h>
#include <string.h>
#include <stdlib.h>
#include <on_off.h>

#fuses HS,NOCPD,NOCPB,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOSTVREN,NOEBTR,NOEBTRB,NOWRTB,NOWRTC,NOWRTD
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

//int seno[64][9]={{1,0,0,0,0,0,0,0,0},{1,0,0,0,1,1,0,0,1},{1,0,0,1,1,0,0,1,0},{1,0,1,0,0,1,0,1,1},{1,0,1,1,0,0,0,1,1},{1,0,1,1,1,1,0,1,0},{1,1,0,0,1,0,0,0,0},{1,1,0,1,0,0,1,0,0},{1,1,0,1,1,0,1,1,1},{1,1,1,0,0,1,0,0,0},{1,1,1,0,1,0,1,1,1},{1,1,1,1,0,0,1,0,0},{1,1,1,1,0,1,1,1,0},{1,1,1,1,1,0,1,1,0},{1,1,1,1,1,1,1,0,0},{1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,0,1},{1,1,1,1,1,1,0,0,1},{1,1,1,1,1,0,0,1,0},{1,1,1,1,0,1,0,0,0},{1,1,1,0,1,1,1,0,0},{1,1,1,0,0,1,1,1,0},{1,1,0,1,1,1,1,1,0},{1,1,0,1,0,1,1,0,0},{1,1,0,0,1,1,0,0,1},{1,1,0,0,0,0,0,1,1},{1,0,1,1,0,1,1,0,1},{1,0,1,0,1,0,1,0,1},{1,0,0,1,1,1,1,0,1},{1,0,0,1,0,0,1,0,0},{1,0,0,0,0,1,0,1,0},{0,1,1,1,1,0,0,0,1},{0,1,1,0,1,0,1,1,1},{0,1,0,1,1,1,1,1,0},{0,1,0,1,0,0,1,1,0},{0,1,0,0,0,1,1,1,0},{0,0,1,1,1,1,0,0,0},{0,0,1,1,0,0,0,1,1},{0,0,1,0,0,1,1,1,1},{0,0,0,1,1,1,1,1,0},{0,0,0,1,0,1,1,1,0},{0,0,0,1,0,0,0,0,0},{0,0,0,0,1,0,1,0,1},{0,0,0,0,0,1,1,0,0},{0,0,0,0,0,0,1,0,1},{0,0,0,0,0,0,0,0,1},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,1,0,0},{0,0,0,0,0,1,0,1,0},{0,0,0,0,1,0,0,1,0},{0,0,0,0,1,1,1,0,1},{0,0,0,1,0,1,0,1,0},{0,0,0,1,1,1,0,1,0},{0,0,1,0,0,1,0,1,1},{0,0,1,0,1,1,1,1,0},{0,0,1,1,1,0,0,1,1},{0,1,0,0,0,1,0,0,1},{0,1,0,1,0,0,0,0,0},{0,1,0,1,1,1,0,0,0},{0,1,1,0,1,0,0,0,1},{0,1,1,1,0,1,0,1,0},{1,0,0,0,0,0,1,0,0}};
long int sin[64]={256,281,305,330,353,376,397,418,436,453,468,481,492,500,506,510,511,510,506,500,492,481,468,453,436,418,397,376,353,330,305,28,255,230,206,181,158,135,114,93,75,58,43,30,19,11,5,1,0,1,5,11,19,30,43,58,75,93,114,135,158,181,206,230};
long int tri[64]={0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,271,287,303,319,335,351,367,383,399,415,431,447,463,479,495,511,495,479,463,447,431,415,399,383,367,351,335,319,303,287,271,256,240,224,208,192,176,160,144,128,112,96,80,64,48,32,16};
int tipo_s=0,opcion=1,canal=1, tiempo=0x80,n=1;
int trojo=0;
int tverde=0;
int y;
int reloj=0,cont12=0,cont64=0;

#INT_RDA
void rsis(void)
{
   char string[20];

   gets(string);
   opcion=atol(string);                //Leemos la opcion introducida

   switch(opcion)
   {
      case 1:
         printf("

1 -> Seno
2 -> Triangular
3 -> Cuadrada
0 -> Salida nula"Giño;
         printf("

Tipo senal numero: "Giño;
         gets(string);
         tipo_s=atol(string);
         output_d(tipo_s|0b10110000);
         if(tipo_s>3){
            printf("

Opcion incorrecta. Tipo de señal fijada: Salida nula."Giño;
            tipo_s=0;
         }
         break;

      case 2:
         printf("

Introduzca número entre 128 y 255

Frecuencia: "Giño;
         gets(string);
         tiempo=atol(string);
         if(tiempo<128||tiempo>255){
            printf("

Opcion incorrecta. Tiempo fijado a 128."Giño;
            tiempo=128;
         }
         break;

      case 3:
         printf("

Elija Canal (1, 2, 3 o 4): "Giño;
         gets(string);
         canal=atol(string);
         output_d(canal|0b10100000);
         if(canal>4){
            printf("

Opcion incorrecta. Canal fijado a 1."Giño;
            canal=1;
         }
         break;

      default:
         printf("
Opción incorrecta. Introduzca 1 o 2"Giño;
   }

   printf("

Que desea cambiar?"Giño;
   printf("

1 -> Tipo de senal
2 -> Frecuencia
3 -> Canal de salida"Giño;
   printf("

Opcion numero: "Giño;
}


#int_timer2          //Funcion a la que se llama periodicamente
clock_isr() {        // the RTCC (timer0) overflows (255->0).

   if (reloj == 0){
      reloj = 1;
      output_high(PIN_A3);}
   else{
      reloj = 0;
      output_low(PIN_A3);

       if(cont12<12)
         cont12++;
       else{
         output_high(PIN_A2);           //Pulso de LOADIN
         output_low(PIN_A2);

         cont12=0;

         if(cont64==64)
            cont64=0;
         else
            cont64+=n;
       }
    }
}



void retardo(int n) { // retardo de n x 100ms ; 0 <= n => 255
  for (; n!=0; n--)
  delay_ms(100);
}


void seno()
{
  enciende(tiempo,canal);

  while (input(PIN_E2)==1)
     {
        if(cont12<9)
        {
            if(bit_test(sin[cont64],8-cont12))
                output_high(PIN_A4);            //Debe coger el dato
            else
                output_low(PIN_A4);
        }
        else
            output_low(PIN_A4);             //Debe coger 4 ceros. Canal 1 y para indicar que son datos
      }
}


void triang()
{

   enciende(tiempo,canal);

   while (input(PIN_E2)==1)
     {
        if(cont12<9)
        {
            if(bit_test(tri[cont64],8-cont12))
                output_high(PIN_A4);            //Debe coger el dato
            else
                output_low(PIN_A4);
         }
         else{
                output_low(PIN_A4);             //Debe coger 4 ceros. Canal 1 y para indicar que son datos
         }
      }
}

void cuad()
{
  int cuad=0;
  int cambio=0;

  enciende(tiempo,canal);

  cuad=cont12;

  while (input(PIN_E2)==1)
  {
      if(reloj==1&&cuad!=cont12)
      {
         if(cambio==0){
              output_high(PIN_A4);
              cambio=1;
         }
         else{
             output_low(PIN_A4);
             cambio=0;
         }
         cuad=cont12;
      }
  }
}


void main()
{
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   set_tris_a(0x00);
   set_tris_b(0xFF);
   set_tris_c(0b10111111);
   set_tris_d(0x00);
   set_tris_e(0b101);

   output_a(0x20);
   output_low(PIN_E1);

  while(1)
 {
  y=0,cont12=0,cont64=0;

     while (input(PIN_E2)==1)
     {
         output_low(PIN_A1);
         output_high(PIN_A0);

         switch(tipo_s)
         {
            case 1:
              output_high(PIN_A0);
              output_d(1);
              seno(); break;
            case 2:
              output_high(PIN_A1);
              output_d(2);
              triang();  break;
            case 3:
              output_d(3);
              cuad(); break;
            case 0:
              output_d(0);
              output_low(PIN_A4); break;
         }
     }


      while (input(PIN_C0)==1)
      {
         apaga();

         output_low(PIN_A0);
         output_high(PIN_A1);

         if (input(PIN_C2)==0)
             tipo_s=1;

         if (input(PIN_C4)==0)
             tipo_s=2;

         if(input(PIN_C3)==0)
             tipo_s=3;

         if(input(PIN_C5)==0){
             tipo_s=0;
         }

         output_d(tipo_s);
      }


      while(input(PIN_C1)==1)
      {
         apaga();

         output_low(PIN_A0);
         output_high(PIN_A1);

         if(input(PIN_C3)==0){
             if(tiempo<254)
               tiempo++;
             n=1;
         }

         if(input(PIN_C5)==0){
             if(tiempo>0x40)
               tiempo--;
             else
               n++;
         }

         if (input(PIN_C2)==0)
             if(tiempo<245)
               tiempo+=10;

         if (input(PIN_C4)==0)
             if(tiempo>0x80)
               tiempo-=10;


         output_d(canal|0b10100000);            //Indicamos el canal en el display
         retardo(4);

         output_d(tipo_s|0b10110000);

         retardo(6);                            //Indicamos el tipo de señal en el display

         if(y==0){
           printf("

Que desea cambiar?"Giño;
           printf("

1 -> Tipo de senal
2 -> Frecuencia
3 -> Canal de salida"Giño;
           printf("

Opcion numero: "Giño;
         }
         y=1;

      }
  }
}



/*ARCHIVO ON_OFF.H*/


void enciende(tiempo,canal)
{
   int fin=0;

   enable_interrupts(INT_TIMER2);
   setup_timer_2(T2_DIV_BY_1,tiempo,1);
   set_timer2(0);
   cont12=0;

   ouput_low(PIN_A4);

   switch(canal)
   {
      case 1:

         while(fin==0)
         {
            if(cont12<2)                        //Se deja el primer paso del contador por seguridad
              output_high(PIN_A4);              //1º bit a 1
            else
               if(cont12>1&&cont12<5)
                  ouput_low(PIN_A4);            //3 bits a 0
               else
                  if(cont12<7)
                     output_high(PIN_A4);       //2 bits a 1
                  else
                  {
                     output_high(PIN_A2);              //Pulso de LOADIN
                     output_low(PIN_A2);
                     fin=1;
                     cont12=0;
                  }
         }
         break;

      case 2:

         while(fin==0)
         {
            if(cont12<2)                        //Se deja el primer paso del contador por seguridad
              output_low(PIN_A4);               //1º bit a 0
            else
               if(cont12==2)
                  ouput_high(PIN_A4);           //2º bit a 1
               else
                  if(cont12>2&&cont12<5)
                     output_low(PIN_A4);        //2 bits a 0
                  else
                     if(cont12<7)
                        ouput_high(PIN_A4);     //2 bits a 1
                     else
                     {
                        output_high(PIN_A2);              //Pulso de LOADIN
                        output_low(PIN_A2);
                        fin=1;
                        cont12=0;
                     }
         }
         break;

      case 3:

         while(fin==0)
         {
            if(cont12<3)                        //Se deja el primer paso del contador por seguridad
              output_low(PIN_A4);               //2 bits a 0
            else
               if(cont12=3)
                  ouput_high(PIN_A4);           //3º bit a 1
               else
                  if(cont12==4)
                     output_low(PIN_A4);        //1 bit a 0
                  else
                     if(cont12<7)
                        ouput_high(PIN_A4);     //2 bits a 1
                     else
                     {
                        output_high(PIN_A2);              //Pulso de LOADIN
                        output_low(PIN_A2);
                        fin=1;
                        cont12=0;
                     }
         }
         break;

       case 4:

         while(fin==0)
         {
            if(cont12<4)                        //Se deja el primer paso del contador por seguridad
              output_low(PIN_A4);               //3 bits a 0
            else
               if(cont12==4)
                  ouput_low(PIN_A4);            //4º bit a 0
               else
                  if(cont12<7)
                     output_high(PIN_A4);       //2 bits a 1
                  else
                  {
                     output_high(PIN_A2);              //Pulso de LOADIN
                     output_low(PIN_A2);
                     fin=1;
                     cont12=0;
                  }
         }
         break;
   }
}


void apaga()
{
   disable_interrupts(INT_TIMER2);
   cont12=0,cont64=0;
}

Desconectado andresitovv

  • PIC10
  • *
  • Mensajes: 40
RE: Ejemplitos en C para 16F648A
« Respuesta #164 en: 04 de Noviembre de 2005, 08:55:00 »
Se me olvidaba decir que la variable q me da el problema es cont12. Gracias!!


 

anything