Autor Tema: Microcursillo en C  (Leído 178973 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado javier_b

  • PIC10
  • *
  • Mensajes: 3
Re: Microcursillo en C
« Respuesta #405 en: 12 de Septiembre de 2006, 15:17:31 »
Hola a todos, alguien podria mostrar un ejemplo con las interrupciones por favor, la verdad he visto ejemplos de todo, pero no he visto como manejar las interrupciones, gracias a quien pueda mostrar algun ejemplo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #406 en: 13 de Septiembre de 2006, 02:51:01 »
Pues si miras en el hilo Ejemplitos de vszener, encontrarás un montón de ejemplos.

Por ejemplo aquí:
http://www.todopic.com.ar/foros/index.php?topic=4530.30

marco_recargado

  • Visitante
Re: Microcursillo en C
« Respuesta #407 en: 03 de Octubre de 2006, 21:14:05 »
HOLA EL MICROCURSILLO ESTA EXCELENTE, UN PAR DE HORAS LEYENDOLO Y APLICANDOLO Y BUENO AL MENOS YA ENTENDI COMO HACER PARPADEAR UNOS LEDS.
EL MOTIVO DE MI MENSAJE ES QUE HE LEIDO QUE EN ALGUNOS PROGRAMAS EL PROTEUS NO FUNCIONA MUY BIEN, EN ESE CASO YO LES ACONSEJARIA EL PIC SIMULATOR EL CUAL NUNCA ME HA FALLADO EN ESE SENTIDO ES MAS FIDEDIGNO QUE EL PROTEUS.
DISCULPARAN MI NOVATES PUES TENGO POCO SIMULANDO CON EL PROTEUS (Y CREO QUE SI LLEGO A ENCONTRAR MUCHAS FALLAS AL PROTEUS ES POR IGNORANCIA MUCHAS VECESO TAL VEZ TODAS).
BUENO DE TODOS MODOS YO ACONSEJO EN ESTOS MOMENTOS EL PIC SIMULATOR.
Y GRACIAS A TODOS POR SUS APORTACIONES REALMENTE ESTOY APRENDIENDO (Y VEAN QUE SOY UN CABEZA DURA)  :D :shock:

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #408 en: 04 de Octubre de 2006, 01:41:22 »
Hola Marco. Efectivamente yo soy crítico con el Proteus, pero hay que reconocer que supera con creces al PIC Simultator porque no sólo simula al PIC, sino a toda la electrónica que le acompañe en el circuito.
De hecho, el Proteus no suele fallar cuando simula PICs, sino con la electrónica analógica.

Desconectado lord-neo

  • PIC10
  • *
  • Mensajes: 9
Re: Microcursillo en C
« Respuesta #409 en: 19 de Octubre de 2006, 18:55:29 »
pocher ..hola mira me llamo christofer soy un afisionado de la electronica y me a apacionado el tema de los pic,
,si puedes dar el mismo ejemplo por favor para un 16f628 y si me lo puedes explicar para comensar a practicar gracias
 :-/ :-/ :-/
ENTRE MAS APRENDES MAS IGNORANTE ERES

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #410 en: 20 de Octubre de 2006, 11:57:13 »
¿Qué ejemplo necesitas?


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #411 en: 24 de Diciembre de 2006, 15:52:08 »
Hola amigos:
Después de haber superado el ASM, empece con C. Así que me decidi por leer todo este hilo, libro del CCS y cuanta informacion caia en mis manos, pase a realizar algunos ejemplos: los tipicos encender un led, leer y escribir un puerto....
Ahora estoy inmerso en practicar con las sentencias switch y case y la verdad estoy empanado.
Lo que hago es pretender leer un puerto continuamente, para despues teestear unos determinados bits de ese puerto y en funcion de su estado hacer cosas distintas, pero no me funciona.
Abajo les dejo la funcion main que seguro que los sabios podran echarme una manita. No pongo todo el codigo, pues la inicializacion del micro (877) y la funcion parpadear funcionan (las probé con otors ejemplos), tambien tengo declarada la variable estado como "unsigned int estado", pero no consigo que funcione el main.


void main()
{
   disable_interrupts(GLOBAL);                                             // Desactivamos todas las interrupc
   setup_adc_ports(NO_ANALOGS);                                            // Puerto A configurado como digital
   set_tris_A(0xFF);                                                       // Puerto_A como salida
   set_tris_b(0xFF);                                                         // Puerto_B como entrada
   set_tris_d(0x00);                                                       // Puerto_D como salida
   set_tris_e(0x00);                                                       // Puerto_E como salida
   output_d(0x00);                                                         // Se borra el puerto d
   output_e(0x00);                                                       // Se borra el puerto e                                                             

      while(input_b())
               estado = portb;
               switch (input_b())

                     {
                      case (0):
                       
                        if (bit_test(estado,1))
                          portd=0xFF;
                       else
                          Parpadeo();
                          break;

                      case (1):

                        if (bit_test(estado,2))

                        {
                           portd=0xAA;
                           break;
                        }
                     }
}

Seguro que me echan una manita.
De todas maneras aprovecho para felicitar las fiestas a todos los amigos del Foro y desearles un feliz año.

Fermin
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #412 en: 25 de Diciembre de 2006, 10:53:15 »
En el case quitale los paréntesis, déjalo así:
Código: C
  1. void main()
  2. {
  3.    disable_interrupts(GLOBAL);                                             // Desactivamos todas las interrupc
  4.    setup_adc_ports(NO_ANALOGS);                                            // Puerto A configurado como digital
  5.    set_tris_A(0xFF);                                                       // Puerto_A como salida
  6.    set_tris_b(0xFF);                                                         // Puerto_B como entrada
  7.    set_tris_d(0x00);                                                       // Puerto_D como salida
  8.    set_tris_e(0x00);                                                       // Puerto_E como salida
  9.    output_d(0x00);                                                         // Se borra el puerto d
  10.    output_e(0x00);                                                       // Se borra el puerto e                                                            
  11.  
  12.       while(input_b())
  13.                estado = portb;
  14.                switch (input_b())
  15.  
  16.                      {
  17.                       case 0:
  18.                        
  19.                         if (bit_test(estado,1))
  20.                           portd=0xFF;
  21.                        else
  22.                           Parpadeo();
  23.                           break;
  24.  
  25.                       case 1:
  26.  
  27.                         if (bit_test(estado,2))
  28.  
  29.                         {
  30.                            portd=0xAA;
  31.                            break;
  32.                         }
  33.                      }
  34. }


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #413 en: 25 de Diciembre de 2006, 14:51:36 »
Gracias por responder vszener, la verdad que ya habia probado de esa forma asi como cambaindo el nombre de la variable "estado" por otra como entrada por ejemplo.
 Cuando lo simulo con proteus paso a paso la verdad esque se queda siempre en estado=portb y de ahí no pasa. :x
Por otra parte he revisado ejemplos que hay posteados en el foro y pienso que deberia funcionar pero :(
La variable está definida como = unsigned int estado.
¿que puede estar pasando'
Gracias?
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #414 en: 26 de Diciembre de 2006, 09:48:44 »
Supongo que la instrucción portb está bien definida, pero vamos, puedes usar la que CCS trae implementada (y aparte usas):
Código: C
  1. void main()
  2. {
  3.    byte estado;                                            
  4.  
  5.    disable_interrupts(GLOBAL);                                             // Desactivamos todas las interrupc
  6.    setup_adc_ports(NO_ANALOGS);                                            // Puerto A configurado como digital
  7.    set_tris_A(0xFF);                                                       // Puerto_A como salida
  8.    set_tris_b(0xFF);                                                         // Puerto_B como entrada
  9.    set_tris_d(0x00);                                                       // Puerto_D como salida
  10.    set_tris_e(0x00);                                                       // Puerto_E como salida
  11.    output_d(0x00);                                                         // Se borra el puerto d
  12.    output_e(0x00);                                                       // Se borra el puerto e                                                            
  13.  
  14.       while(input_b())
  15.                estado = input_b();
  16.                switch (input_b())
  17.  
  18.                      {
  19.                       case 0:
  20.                        
  21.                         if (bit_test(estado,1))
  22.                           portd=0xFF;
  23.                        else
  24.                           Parpadeo();
  25.                           break;
  26.  
  27.                       case 1:
  28.  
  29.                         if (bit_test(estado,2))
  30.  
  31.                         {
  32.                            portd=0xAA;
  33.                            break;
  34.                         }
  35.                      }
  36. }
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #415 en: 26 de Diciembre de 2006, 16:22:24 »
Gracias por reponder nuevamente vszener, pero todavia no me funciona, lo que me indicas tambien lo probe y nada. Adjunto el programa completo por si hay algo mal que se me haya escapado. He eliminado la funcion de parpadeo dentro del main. En fin :x :x

#include <16F877.h>                                                           // Tipo de microcontrolador utilizado
#fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT                                  // Cofiguración de fusibles
#use delay(clock=4000000)                                                     // Frecuencia  Fosc=4Mhz

#byte porta = 0x05                                                           // Direccion del puerto A
#byte portb = 0x06                                                           // Direccion del puerto B
#byte portc = 0x07                                                           // Direccion del puerto C
#byte portd = 0x08                                                           // Direccion del puerto D
#byte porte = 0x09                                                           // Direccion del puerto E

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)


VOID Parpadeo(void);                                                          // Rutina de parpadeo de puerta E
VOID Parpadeo(void)
      {
   output_high (PIN_E0);                                                      // Pin E0 = 1
   delay_ms (1000);                                                           // delay 1 segundo.
   output_low (PIN_E0);                                                       // Pin E0 = 0
   delay_ms (1000);                                                           // delay 1 segundo.
   output_high (PIN_E1);                                                      // Pin E1 = 1
   delay_ms (1000);                                                           // delay 1 segundo.
   output_low (PIN_E1);                                                       // Pin E1 = 0
   delay_ms (1000);                                                           // delay 1 segundo.
   output_high (PIN_E2);                                                      // Pin E2 = 1
   delay_ms (1000);                                                           // delay 1 segundo.
   output_low (PIN_E2);                                                       // Pin E2 = 0
      }

VOID main()
{
   byte estado;
   disable_INTERRUPTS (GLOBAL);                                               // Desactivamos todas las interrupciones
   setup_adc_ports (NO_ANALOGS);                                              // Puerto A configurado como digital
   set_tris_a (0xFF);                                                         // Puerto_A como entrada
   set_tris_b (0xFF);                                                         // Puerto_B como entrada
   set_tris_d (0x00);                                                         // Puerto_D como salida
   set_tris_e (0x00);                                                         // Puerto_E como salida
   output_d (0x00);                                                           // Se borra el puerto d
   output_e (0x00);                                                           // Se borra el puerto e

   WHILE (input_b ())
      estado = input_b();

   SWITCH (input_b())
   {
      CASE 0:
           IF (bit_test (estado, 1))
           
               portd = 0xFF;
           
      BREAK;

      CASE 1:
           IF (bit_test (estado, 2))
             
               portd = 0xAA;
           
         BREAK;

   }
}
Adjunto una imagen de la simulacion en proteus, paso a paso. Cuando llega a la sentencia: estado=input_b(), se queda parado hasta el fin de los siglos y nada. Entiendo que una vez leido el puerto B como esta a 1 el pin b1, dberia entrar en el primer case pero :x :x
seguiré estrujandome los sexos.
Un saludo fermin
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #416 en: 26 de Diciembre de 2006, 16:35:42 »
¿La entencia 'switch' está dentro del while? te lo digo porque según está escrito en tú programa no está dentro del while, otra cosa que puedes hacer,es especificar dentro de la sentencia while porner la condición.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #417 en: 26 de Diciembre de 2006, 16:40:51 »
La sentencia Switch esta dentro del While es mas he copia la funcion como la has escrito  y tampoco.
Todos los días se aprende algo nuevo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #418 en: 26 de Diciembre de 2006, 16:54:03 »
Y yome copie de la tuya, es lo que pasa cuando se hace copy & paste, mira a ver este:
Código: C
  1. #include <16F877.h>                                                           // Tipo de microcontrolador utilizado
  2. #fuses XT,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT                                  // Cofiguración de fusibles
  3. #use delay(clock=4000000)                                                     // Frecuencia  Fosc=4Mhz
  4.  
  5. #byte porta = 0x05                                                           // Direccion del puerto A
  6. #byte portb = 0x06                                                           // Direccion del puerto B
  7. #byte portc = 0x07                                                           // Direccion del puerto C
  8. #byte portd = 0x08                                                           // Direccion del puerto D
  9. #byte porte = 0x09                                                           // Direccion del puerto E
  10.  
  11. #use fast_io(a)
  12. #use fast_io(b)
  13. #use fast_io(c)
  14. #use fast_io(d)
  15. #use fast_io(e)
  16.  
  17.  
  18. VOID Parpadeo(void);                                                          // Rutina de parpadeo de puerta E
  19. VOID Parpadeo(void)
  20.       {
  21.    output_high (PIN_E0);                                                      // Pin E0 = 1
  22.    delay_ms (1000);                                                           // delay 1 segundo.
  23.    output_low (PIN_E0);                                                       // Pin E0 = 0
  24.    delay_ms (1000);                                                           // delay 1 segundo.
  25.    output_high (PIN_E1);                                                      // Pin E1 = 1
  26.    delay_ms (1000);                                                           // delay 1 segundo.
  27.    output_low (PIN_E1);                                                       // Pin E1 = 0
  28.    delay_ms (1000);                                                           // delay 1 segundo.
  29.    output_high (PIN_E2);                                                      // Pin E2 = 1
  30.    delay_ms (1000);                                                           // delay 1 segundo.
  31.    output_low (PIN_E2);                                                       // Pin E2 = 0
  32.       }
  33.  
  34. VOID main()
  35. {
  36.    byte estado;
  37.  
  38.    set_tris_a (0xFF);                                                         // Puerto_A como entrada
  39.    set_tris_b (0xFF);                                                         // Puerto_B como entrada
  40.    set_tris_d (0x00);                                                         // Puerto_D como salida
  41.    set_tris_e (0x00);                                                         // Puerto_E como salida
  42.  
  43.    setup_adc_ports (NO_ANALOGS);                                              // Puerto A configurado como digital
  44.    disable_INTERRUPTS (GLOBAL);                                               // Desactivamos todas las interrupciones
  45.  
  46.    output_d (0x00);                                                           // Se borra el puerto d
  47.    output_e (0x00);                                                           // Se borra el puerto e
  48.  
  49.    WHILE (TRUE)
  50. {
  51.       estado = portb;
  52.  
  53.    SWITCH (estado)
  54.    {
  55.       CASE 0b00000000:
  56.            IF (bit_test (estado, 1))
  57.            
  58.                portd = 0xFF;
  59.            
  60.       BREAK;
  61.  
  62.       CASE 0b00000001:
  63.            IF (bit_test (estado, 2))
  64.              
  65.                portd = 0xAA;
  66.            
  67.          BREAK;
  68.  
  69.    }
  70. }
  71. }


Prueba así, a ver que tal.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Microcursillo en C
« Respuesta #419 en: 26 de Diciembre de 2006, 17:06:58 »
Hola de nuevo algo parece que funciona, pero no del todo. Una pregunta:la sentencia Bit_test(estado,1) lo que realiza es que comprueba elbit uno de la variable estado y si es 1 entoces ejecuta portd=0xFF. ¿Es cierto? es que para que me haga portd=0xFF tengo que poner !bit_test(estado,1)
Sigo probando
Todos los días se aprende algo nuevo.


 

anything