Autor Tema: Mini curso "Programación en XC8"  (Leído 588186 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #360 en: 17 de Diciembre de 2015, 17:53:23 »
hola miguel, antes de nada decirte que te falta en tu programa un bucle principal, un while (1); si no lo tienes se ejecutara una vez y se acabo, por lo tanto debes agregarlo.


por otro lado cada vez que salta la interrupción debes recargar los registros y limpiar el flag de interrupcion.

es decir cada vez que se desborde debes reiniciarlo

Código: [Seleccionar]
TMR1IF=0;
TMR1 = (lo que le quieras poner, en tu caso 0) ;

o

Código: [Seleccionar]
TMR1IF=0;
TMR1H = 0;
TMR1L=0;

y ya de paso habilita su interrupción, si no me equivoco, eran los registros PIE1, TMR1IE

por cierto los fuses los has colocado en algún lado?

un saludo
Hola Juan José ante todo gracias, lo del bucle infinito lo se, se que sin el solo se ejecuta una vez pero es que ni siquiera llega a una vez, en la simulación me he dado cuenta que los registros del Timer TMR1H y TMR1L solo se incrementa el low el high siempre esta a 0.
Si quiero que trabaje como temporización sin crear una función de interrupción ¿El bit TMR1IE debe estar habilitado?
Los fuses los tengo en un archivo aparte pero no es problema de fuses ya que probé con elos en el programa.

Saludos!

 
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #361 en: 17 de Diciembre de 2015, 18:09:27 »
Código: [Seleccionar]
#define _XTAL_FREQ 20000000
#include <xc.h>
#include <pic18f2550.h>
#include "config.h"
 
void main(void)
{
    TRISBbits.RB0 = 0;  //Configuramos RB0 como salida
    LATB0 = 0;  //Empezamos con el led apagado
   
    //CONFIGURAMOS TIMER1
    INTCONbits.GIE = 0; //Desabilitamos todas las interrupciones
    T1CONbits.RD16 = 1; //16 bit
    T1CONbits.T1RUN = 0;
    T1CONbits.T1CKPS1 = 0;  //Seleccionamos
    T1CONbits.T1CKPS0 = 0;  //prescaler 1:1
    T1CONbits.T1OSCEN = 0;  // Timer 1 Osc Enable: 0 = off, 1 = on
    T1CONbits.T1SYNC = 0;
    T1CONbits.TMR1CS = 0;   //Internal clock (Fosc/4)
    TMR1H = 0x00;
    TMR1L = 0x00;
    PIR1bits.TMR1IF = 0;     //Reset the interrupt flag
    T1CONbits.TMR1ON = 1;   //Enable Timer1
   

    while(1)
    {
          if(PIR1bits.TMR1IF)
          {
                 LATB0 =~ LATB0;
                 TMR1IF=0;
                 TMR1H = 0;
                 TMR1L=0;
          }         
    }
}

prueba eso, eso te debe dar una señal cuadrada y si debe cargar la parte superior del registro.

Citar
¿El bit TMR1IE debe estar habilitado?

creo que no, ya que no recurres a ninguna interrupcion, por eso esta linera tampoco es necesaria:

Código: [Seleccionar]
INTCONbits.GIE = 0; //Desabilitamos todas las interrupciones
un saludo


EDITO cambia de posición las lineas de carga y encendido del timer como he puesto yo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #362 en: 17 de Diciembre de 2015, 18:40:11 »
Gracias voy a probar a tu manera, pero ya sera mañana que si no las 6 de la mañana se me hace temprano.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado fernandogomav

  • PIC10
  • *
  • Mensajes: 32
Re:Mini curso "Programación en XC8"
« Respuesta #363 en: 19 de Diciembre de 2015, 12:59:25 »
Citar
presion1 = presion1_anterior;

aqui lo que trato de hacer es que no escriba en pantalla continuamente, es decir, que no realize el printf a menos que la presion cambie, osea el valor de la entrada analogica, esto es lo que trato de hacer, tu me diras si si esta bien o se puede hacer de otra manera, ademas tienes razon en que son coma flotante y es dificil que se cumpla la igualdad, mas bien creo que ese codigo esta de mas...

2 cosas ahi:

Estas haciendo:

presion1 <- presion1_anterior

en ves de al reves, eso intente hacerte notar, como presion1_anterior inicializa a 0 y vos jamas lo cambias ( ya que tu asignacion estaba al reves, era lo mismo que poner:

presion1 = 0;

Con respecto a los flotantes, siempre que los uses, trata de jamas usar igualdades, siempre menor a o mayor a, es algo que me traje de python pero creo que se aplica aca tambien. Las representaciones binarias no son exactas y bueno puede parecer que son iguales pero que dentro en la representacion no lo son.

Citar
en mi programa, el que te pase, todas las presiones tienen los mismos intervalos pero era solo para probarlas, en realidad cada presion tiene intervalos diferentes porque medire diferentes gases, con los gases diferentes ya no podria aplicar el codigo con el for o si???

Si podes hacerlo. Suponete que fijamos 2 valores por cada "presion", podes utilizar un array de esta forma:

Código: C
  1. const int limites_presion[5][2] = {{10,20},{30,40},{50,60},{700,1000},{80,200}};

El const, te lo pone en flash, pero si ves que esta muy llena tu flash se lo sacas para que quede almacenado en la RAM. y reemplazas los valores de los if:

Código: C
  1. if (presion[i]<30)
  2.                 else if (presion[i] <=40)

por

Código: C
  1. if (presion[i] < limites_presion[i][0])
  2.                 else if (presion[i] <= limites_presion[i][1])

Con respecto a las salidas ya se complica un poco mas.
Voy a suponer por un momento que cada condicion.. es decir: Minimo, Medio, Maximo de cada presion son distintos.
Voy a intentar hacer un codigo facil para que te sea facil verlo. OJO! hay muchas formas mas de hacerlo, esto es solo para que veas una forma y se pueda ver facilmente. todo va a depender de que tan complejas sean tus funciones.

Código: C
  1. for(i=0;i<5;i++)
  2.         {
  3.             presion[i]=ADC_get(i);
  4.             if(presion[i] != presion_anterior[i])
  5.             {
  6.                 presion_anterior[i] = presion[i];
  7.                 terminacion = 0x3C;
  8.                 salida = i*3;
  9.                 if (presion[i] > limite_presion[i][0] && presion[i] <= limite_presion[i][1])
  10.                 {
  11.                         salida++
  12.                         terminacion = 0x2D;
  13.                 }
  14.                 else
  15.                 {
  16.                         salida+=2;
  17.                 }
  18.                 Cambiar_salida(salida);
  19.                 resultado=(((float)presion[i]/203.7221)-0.5)/0.01333333333;
  20.                 sprintf(T, "%03.1f %c ", resultado , terminacion);
  21.                 if (i==4) LCD_gotoxy(9,0);
  22.                 else LCD_gotoxy(0,i);
  23.                 LCD_puts(T);
  24.             }
  25.          }
  26.  
  27.  
  28.  
  29.  
  30. void Cambiar_salida(short valor_salida)
  31. {
  32.         switch(valor_salida)
  33.         {
  34.  
  35.         // i = 0
  36.         case 0:
  37.                 //Valor minimo (presion[0] < limite_presion[0][0])
  38.                 break;
  39.         case 1:
  40.                 //Valor medio (limite_presion[0][0] < presion[0] <= limite_presion[0][1])
  41.                 break;
  42.         case 2:
  43.                 //Valor maximo (presion[0] > limite_presion[0][1])
  44.                 break;
  45.  
  46.         // i = 1
  47.         case 3:
  48.                 //Valor minimo (presion[i] < limite_presion[i][0])
  49.                 break;
  50.         case 4:
  51.                 //Valor medio (limite_presion[i][0] < presion[i] <= limite_presion[i][1])
  52.                 break;
  53.         case 5:
  54.                 //Valor maximo (presion[i] > limite_presion[i][1])
  55.                 break;
  56.  
  57.         // i = 2
  58.         case 6:
  59.                 //Valor minimo (presion[i] < limite_presion[i][0])
  60.                 break;
  61.         case 7:
  62.                 //Valor medio (limite_presion[i][0] < presion[i] <= limite_presion[i][1])
  63.                 break;
  64.         case 8:
  65.                 //Valor maximo (presion[i] > limite_presion[i][1])
  66.                 break;
  67.  
  68.         // i = 3
  69.         case 9:
  70.                 //Valor minimo (presion[i] < limite_presion[i][0])
  71.                 break;
  72.         case 10:
  73.                 //Valor medio (limite_presion[i][0] < presion[i] <= limite_presion[i][1])
  74.                 break;
  75.         case 11:
  76.                 //Valor maximo (presion[i] > limite_presion[i][1])
  77.                 break;
  78.  
  79.         // i = 4
  80.         case 12:
  81.                 //Valor minimo (presion[i] < limite_presion[i][0])
  82.                 break;
  83.         case 13:
  84.                 //Valor medio (limite_presion[i][0] < presion[i] <= limite_presion[i][1])
  85.                 break;
  86.         case 14:
  87.                 //Valor maximo (presion[i] > limite_presion[i][1])
  88.                 break;
  89.  
  90.         default:
  91.                 // Aca entra si existe un error. Deberia desactivar todo.
  92.  
  93.         }
  94.  
  95. }
HOLA KILLERJC, primero que todo gracias por tus respuestas y consejos, estuve toda la semana arreglando el codigo y entendiendo todo lo que me explicabas...

ya arregle lo de presion1_anterior=presion1, claro tenias toda la razon la estaba poniendo en 0 todo el tiempo...

fije los limetes de presion como me dijiste y cambie los if de cada entrada por un for para todos como me mandaste el codigo, copilo y simulo EXCELENTE  muchisimas gracias, cada vez aprendo mas programar =)...

ahora el codigo pesa 32% y sumandole mas codigo aparte del que me pasaste que sustituí y agregue otras cosas, versus un 36% que tenia solo con los intervalos if para cada gas =)

agradecido... PROBLEMA SOLUCIONADO

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #364 en: 20 de Diciembre de 2015, 12:51:07 »
Código: [Seleccionar]
#define _XTAL_FREQ 20000000
#include <xc.h>
#include <pic18f2550.h>
#include "config.h"
 
void main(void)
{
    TRISBbits.RB0 = 0;  //Configuramos RB0 como salida
    LATB0 = 0;  //Empezamos con el led apagado
   
    //CONFIGURAMOS TIMER1
    INTCONbits.GIE = 0; //Desabilitamos todas las interrupciones
    T1CONbits.RD16 = 1; //16 bit
    T1CONbits.T1RUN = 0;
    T1CONbits.T1CKPS1 = 0;  //Seleccionamos
    T1CONbits.T1CKPS0 = 0;  //prescaler 1:1
    T1CONbits.T1OSCEN = 0;  // Timer 1 Osc Enable: 0 = off, 1 = on
    T1CONbits.T1SYNC = 0;
    T1CONbits.TMR1CS = 0;   //Internal clock (Fosc/4)
    TMR1H = 0x00;
    TMR1L = 0x00;
    PIR1bits.TMR1IF = 0;     //Reset the interrupt flag
    T1CONbits.TMR1ON = 1;   //Enable Timer1
   

    while(1)
    {
          if(PIR1bits.TMR1IF)
          {
                 LATB0 =~ LATB0;
                 TMR1IF=0;
                 TMR1H = 0;
                 TMR1L=0;
          }         
    }
}

prueba eso, eso te debe dar una señal cuadrada y si debe cargar la parte superior del registro.

Citar
¿El bit TMR1IE debe estar habilitado?

creo que no, ya que no recurres a ninguna interrupcion, por eso esta linera tampoco es necesaria:

Código: [Seleccionar]
INTCONbits.GIE = 0; //Desabilitamos todas las interrupciones
un saludo


EDITO cambia de posición las lineas de carga y encendido del timer como he puesto yo
Hola después de muchas pruebas con el timer consigo las temporizaciones según la formula del Timer1, pero sigo con fallos en la simulación con el IDE, por lo cual puedo asegurar que el MPLAB X IDE v3.10 me esta fallando mas que una escopeta de feria  :5]

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #365 en: 20 de Diciembre de 2015, 13:36:52 »
Citar
Hola después de muchas pruebas con el timer consigo las temporizaciones según la formula del Timer1, pero sigo con fallos en la simulación con el IDE, por lo cual puedo asegurar que el MPLAB X IDE v3.10 me esta fallando mas que una escopeta de feria  :5]

Miquel_S

Hasta ahora el unico fallo que tuve con el MPLAB X es de que se me corrompiera un proyecto y no me compilara, pase el codigo entero a otro proyecto y funcionando. Fue el unico, en simulacion no tuve problemas, incluso cuando hice los codigos para los PIC18 y dsPIC

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #366 en: 20 de Diciembre de 2015, 14:30:56 »
Citar
Hola después de muchas pruebas con el timer consigo las temporizaciones según la formula del Timer1, pero sigo con fallos en la simulación con el IDE, por lo cual puedo asegurar que el MPLAB X IDE v3.10 me esta fallando mas que una escopeta de feria  :5]

Miquel_S

Hasta ahora el unico fallo que tuve con el MPLAB X es de que se me corrompiera un proyecto y no me compilara, pase el codigo entero a otro proyecto y funcionando. Fue el unico, en simulacion no tuve problemas, incluso cuando hice los codigos para los PIC18 y dsPIC
Gracias KILLERJC voy a seguir probando y ya os contare, de momento necesito hacer una temporizacion de 5 seg para que se ejecute antes del inicio del programa.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #367 en: 20 de Diciembre de 2015, 18:55:53 »
Y sigo liado, estoy intentando una temporización de 5 segundos y no consigo que me funcione la interrupción en RB0 y no veo el porque ¿Podéis ayudarme?
Código: C
  1. #define _XTAL_FREQ 20000000
  2. #include <xc.h>
  3. //#include "config.h"
  4. #include <delays.h>
  5.  
  6. /*
  7.  *
  8.  */
  9.  
  10. // CONFIG1L
  11. #pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
  12. #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
  13. #pragma config USBDIV = 1       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
  14.  
  15. // CONFIG1H
  16. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator (HS))
  17. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
  18. #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
  19.  
  20. // CONFIG2L
  21. #pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
  22. #pragma config BOR = ON         // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
  23. #pragma config BORV = 3         // Brown-out Reset Voltage bits (Minimum setting)
  24. #pragma config VREGEN = OFF     // USB Voltage Regulator Enable bit (USB voltage regulator disabled)
  25.  
  26. // CONFIG2H
  27. #pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
  28. #pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
  29.  
  30. // CONFIG3H
  31. #pragma config CCP2MX = ON      // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
  32. #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
  33. #pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
  34. #pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
  35.  
  36. // CONFIG4L
  37. #pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
  38. #pragma config LVP = OFF         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
  39. #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
  40.  
  41. // CONFIG5L
  42. #pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
  43. #pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
  44. #pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
  45. #pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
  46.  
  47. // CONFIG5H
  48. #pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
  49. #pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
  50.  
  51. // CONFIG6L
  52. #pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
  53. #pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
  54. #pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
  55. #pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
  56.  
  57. // CONFIG6H
  58. #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
  59. #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
  60. #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
  61.  
  62. // CONFIG7L
  63. #pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
  64. #pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
  65. #pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
  66. #pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
  67.  
  68. // CONFIG7H
  69. #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
  70.  
  71. unsigned char i=0;  //Variable usada en la temporizacion
  72.  
  73. void main(void)
  74. {
  75.     TRISBbits.RB0 = 1;  //Configuramos RB0 como entrada
  76.     TRISBbits.RB1 = 0;  //Configuramos RB3 como salida
  77.     LATB1 = 0;  //Robot parado
  78.    
  79.     //Configuramos INT0
  80.     INTCONbits.INT0IE = 1;  //Habilitamos interrupcion en RB0
  81.     INTCON2bits.INTEDG0 = 1;    //Flanco ascendente
  82.     INTCONbits.GIE = 1;     //Habilitamos todas las interrupciones
  83.    
  84. while(1){
  85.     //Iniciamos secuencia
  86.     if(INTCONbits.INT0IF == 1){
  87.         //Temporizamos 5seg antes del inicio del robot
  88.         for(i=0; i<=10; i++){
  89.             Delay10KTCYx(226);
  90.         INTCONbits.INT0IF = 0;  //Borramos flag de interrupcion en RB0
  91.         INTCONbits.INT0IE = 0;  //Desabilitamos interrupcion en RB0
  92.         INTCONbits.GIE = 0;     //Desabilitamos interrupciones
  93.         LATB1 = 1;  //Inicia escaneo
  94.         }
  95.     }else{
  96.         LATB1 = 0;  //Robot parado
  97.     }
  98. }
  99. }
Otro favor, alguien puede simularlo que a mi no me corre como debería la simulación y no sabré que tiempo a transcurrido cuando pongo a nivel alto RB1.

Gracias y perdón por las molestias.
« Última modificación: 20 de Diciembre de 2015, 19:07:27 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #368 en: 20 de Diciembre de 2015, 19:10:21 »
Hola Miguel, ¿exactamente que es lo que deseas hacer?

No me gusta ese delay y como esta quedando el código (no quiero Criticarte ni nada por el estilo, no te lo tomes a mal), si me dices que quieres hacer,  puedo escribirte un codigo que haga lo que quieres.

Y ya lo modificas tu como quieras.

Te lo haría mañana, hoy ya no puedo, dime que micro estas usando, compilador, etc

Un saludo.

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re:Mini curso "Programación en XC8"
« Respuesta #369 en: 20 de Diciembre de 2015, 19:24:00 »
Y sigo liado, estoy intentando una temporización de 5 segundos y no consigo que me funcione la interrupción en RB0 y no veo el porque ¿Podéis ayudarme?
Código: C
  1. #define _XTAL_FREQ 20000000
  2. #include <xc.h>
  3. //#include "config.h"
  4. #include <delays.h>
  5.  
  6. /*
  7.  *
  8.  */
  9.  
  10. // CONFIG1L
  11. #pragma config PLLDIV = 1       // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
  12. #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
  13. #pragma config USBDIV = 1       // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
  14.  
  15. // CONFIG1H
  16. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator (HS))
  17. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
  18. #pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
  19.  
  20. // CONFIG2L
  21. #pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
  22. #pragma config BOR = ON         // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
  23. #pragma config BORV = 3         // Brown-out Reset Voltage bits (Minimum setting)
  24. #pragma config VREGEN = OFF     // USB Voltage Regulator Enable bit (USB voltage regulator disabled)
  25.  
  26. // CONFIG2H
  27. #pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
  28. #pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)
  29.  
  30. // CONFIG3H
  31. #pragma config CCP2MX = ON      // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
  32. #pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
  33. #pragma config LPT1OSC = OFF    // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
  34. #pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
  35.  
  36. // CONFIG4L
  37. #pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
  38. #pragma config LVP = OFF         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
  39. #pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
  40.  
  41. // CONFIG5L
  42. #pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
  43. #pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
  44. #pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
  45. #pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
  46.  
  47. // CONFIG5H
  48. #pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
  49. #pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
  50.  
  51. // CONFIG6L
  52. #pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
  53. #pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
  54. #pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
  55. #pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
  56.  
  57. // CONFIG6H
  58. #pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
  59. #pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
  60. #pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
  61.  
  62. // CONFIG7L
  63. #pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
  64. #pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
  65. #pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
  66. #pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
  67.  
  68. // CONFIG7H
  69. #pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
  70.  
  71. unsigned char i=0;  //Variable usada en la temporizacion
  72.  
  73. void main(void)
  74. {
  75.     TRISBbits.RB0 = 1;  //Configuramos RB0 como entrada
  76.     TRISBbits.RB1 = 0;  //Configuramos RB3 como salida
  77.     LATB1 = 0;  //Robot parado
  78.    
  79.     //Configuramos INT0
  80.     INTCONbits.INT0IE = 1;  //Habilitamos interrupcion en RB0
  81.     INTCON2bits.INTEDG0 = 1;    //Flanco ascendente
  82.     INTCONbits.GIE = 1;     //Habilitamos todas las interrupciones
  83.    
  84. while(1){
  85.     //Iniciamos secuencia
  86.     if(INTCONbits.INT0IF == 1){
  87.         //Temporizamos 5seg antes del inicio del robot
  88.         for(i=0; i<=10; i++){
  89.             Delay10KTCYx(226);
  90.         INTCONbits.INT0IF = 0;  //Borramos flag de interrupcion en RB0
  91.         INTCONbits.INT0IE = 0;  //Desabilitamos interrupcion en RB0
  92.         INTCONbits.GIE = 0;     //Desabilitamos interrupciones
  93.         LATB1 = 1;  //Inicia escaneo
  94.         }
  95.     }else{
  96.         LATB1 = 0;  //Robot parado
  97.     }
  98. }
  99. }
Otro favor, alguien puede simularlo que a mi no me corre como debería la simulación y no sabré que tiempo a transcurrido cuando pongo a nivel alto RB1.

Gracias y perdón por las molestias.

Hola Miguel_S, tengo una duda, porque habilitas las interrupciones y revisas la bandera INTCONbits.INT0IF mediante un while, cuando quieres utilizar interrupciones tienes que trabajar mediante el vector de interrupcion , en el caso de la interrupcion por RB0 el vector de interrupciones de alta prioridad.
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #370 en: 20 de Diciembre de 2015, 19:26:06 »
Exactamente, no queda claro que estas intentando hacer, te voy a explicar el por que no funciona tu codigo.

Tenes activada la interrupcion y no tenes funcion de interrupcion. No es que el simulador este funcionando mal, sino que el programa esta mal.

Tambien te falta ponerlos como digital, si das una mejor idea que tiene que hacer como dijo juanjo va a ser mas facil darte una solucion.

PD: esto intentaste hacer, eso si, 5s de delay es demasiado, se toma un buen tiempo la PC hasta llegar ahi haciendo nada.

Código: C
  1. void main(void)
  2. {
  3.     unsigned char i = 0;  //Variable usada en la temporizacion
  4.  
  5.     TRISBbits.RB0 = 1;  //Configuramos RB0 como entrada
  6.     TRISBbits.RB1 = 0;  //Configuramos RB1 como salida
  7.     ADCON1 = 0x0F;
  8.     LATB1 = 0;  //Robot parado
  9.  
  10.     //Configuramos INT0
  11.     INTCON2bits.INTEDG0 = 1;    //Flanco ascendente
  12.     INTCONbits.INT0IF = 0;
  13.  
  14.     while(1)
  15.     {
  16.         //Iniciamos secuencia
  17.         if(INTCONbits.INT0IF == 1)
  18.         {
  19.             //Temporizamos 5seg antes del inicio del robot
  20.             for (i=0;i<250;i++) __delay_ms(20);
  21.             INTCONbits.INT0IF = 0;  //Borramos flag de interrupcion en RB0
  22.             LATB1 = 1;  //Inicia escaneo
  23.         }
  24.         else
  25.         {
  26.             LATB1 = 0;  //Robot parado
  27.         }
  28.     }
  29. }

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Mini curso "Programación en XC8"
« Respuesta #371 en: 20 de Diciembre de 2015, 19:45:18 »
Gracias, tengo un compañero de mi hijo que se ha propuesto hacerse un minisumo y me pregunto si me gustaria echarle una mano con ello y eso es lo que intento, la temporización de 5 segundos es el tiempo de espera antes de que el robot empiece a moverse.
Hola Miguel, ¿exactamente que es lo que deseas hacer?

No me gusta ese delay y como esta quedando el código (no quiero Criticarte ni nada por el estilo, no te lo tomes a mal), si me dices que quieres hacer,  puedo escribirte un codigo que haga lo que quieres.

Y ya lo modificas tu como quieras.

Te lo haría mañana, hoy ya no puedo, dime que micro estas usando, compilador, etc

Un saludo.
Gracias Juan José por la intención y para nada me lo tomo a mal pero aunque sea con ayuda de ustedes tengo que intentar hacerlo yo mismo que si no no aprendo.

Nuevamente gracias a todos.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2980
Re:Mini curso "Programación en XC8"
« Respuesta #372 en: 20 de Diciembre de 2015, 20:32:35 »
Citar
tengo que intentar hacerlo yo mismo que si no no aprendo

de acuerdo lo comprendo y eso te honra.

Bueno pues si no he entendido mal, lo que quieres hacer, es que al pulsar un pulsador el robot haga una espera de 5 segundos y empiece a moverse ¿no?

pues entonces te recomiendo, que te olvides de las interrupciones externas y que hagas una función por pulling y evitando rebotes para detectar la pulsación, así te quitas de encima las interrupciones externas y puedes elegir el pin que quieras.

para ello lo primero es hacer lo que dice killer, configurar los pines (Esto hay que hacerlo en casi todo los programas y de las primeras cosas).

Si esta espera no va a interferir en el resto del programa, puedes hacerla con delay_ms() y for como te indica killer y para el pulsador un while para que no pase de ahí hasta que se pulse, pero ojo, esto solo si no va a interferir con el resto del programa.

es decir si solo se va a ejecutar una vez, de lo contrario deberás evitar el uso de delay y de while.

prueba a hacerlo así (o si los compañeros tienen otra idea mas fácil) ¿Qué te parece?

un saludo.


Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re:Mini curso "Programación en XC8"
« Respuesta #373 en: 21 de Diciembre de 2015, 09:38:19 »
Gracias, tengo un compañero de mi hijo que se ha propuesto hacerse un minisumo y me pregunto si me gustaria echarle una mano con ello y eso es lo que intento, la temporización de 5 segundos es el tiempo de espera antes de que el robot empiece a moverse.
Hola Miguel, ¿exactamente que es lo que deseas hacer?

No me gusta ese delay y como esta quedando el código (no quiero Criticarte ni nada por el estilo, no te lo tomes a mal), si me dices que quieres hacer,  puedo escribirte un codigo que haga lo que quieres.

Y ya lo modificas tu como quieras.

Te lo haría mañana, hoy ya no puedo, dime que micro estas usando, compilador, etc

Un saludo.
Gracias Juan José por la intención y para nada me lo tomo a mal pero aunque sea con ayuda de ustedes tengo que intentar hacerlo yo mismo que si no no aprendo.

Nuevamente gracias a todos.

Si es como comenta, tambien puede poner un retardo siempre al inicio, y usar el reset como el pulsador de inicio, es decir cada vez que el micro se encienda, o resetee, 5 seg de espera y luego se ejecuta el programa principal. No tiene ni que usar interrupciones, ni configurar puertos :D, solamente dejar el reset habilitado
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mini curso "Programación en XC8"
« Respuesta #374 en: 21 de Diciembre de 2015, 10:03:02 »
imagino que lo quiere aplicar a un boton, y que sea para comenzar la pelea. es decir entre que se presiona el boton que pasen 5 segundos y "choquen" ambos luchadores de sumo. Lo que no se es si necesita ademas que haga otra cosa dentro de esos 5s. Sino lo mas seguro es ir por interrupciones