Mensajes recientes

Páginas: 1 2 3 4 5 6 7 8 9 [10]
91
Hola a todos, cómo están. En esta oportunidad les traigo un código adaptado para filtral el rebote de los botones mediante programa, el mismo está basado en un filtro digital el cual no recuerdo su nombre pero si se que es básicamente una suma ponderada durante aproximadamente unos 200 o 300 ms -depende de quien lo implemente.

El código es el siguiente:

Código: [Seleccionar]
enum btnStat_t{
    high,
    low,
    rising,
    falling,
};

enum btnStat_t doDebounce(uint8_t *state, volatile bool value) {
       uint8_t old  =  *state & 0x7F;
       bool flag = (*state & 0x80)? true : false;
       enum btnStat_t btnStd = (true == flag)? low : high;
 
       // Digital filter part, value = (old * .75) + (new * .25)
       old -= (old >> 2);                     // 1 - (1/4) = .75
       old += value? 0x1F : 0x00;             // if bit set, add .25
 
       // Software schmitt trigger
       // Newly detected rising edge
       if ( (true == flag) && (old > 0x70) ) {
               flag = false;
               btnStd = rising;
       }
       // Newly detected falling edge
       else if ( (false == flag) && (old < 0x07) ){
               flag = true;
               btnStd = falling;
       }
 
       // Update the state variable
       *state = (old & 0x7F) | ((flag & 0x01) << 7);
 
       // Return the state
       return btnStd;
}

La función que más me interesa de las dos es "enum btnStat_t doDebounce(uint8_t *state, volatile bool value)", yo entiendo perfectamente que hacen las funciones de filtro digital, shmitt trigger y casi todo el código interno de la función excepto lo siguiente:

no entiendo por qué definen en la cuarta línea de la segunda función el enumerador de la siguiente forma:

Código: [Seleccionar]
       enum btnStat_t btnStd = (true == flag)? low : high;

y tampoco entiendo por qué la función es definida como un enumerador de la forma en que está con argumento.

Alguien podría explicarme eso por favor?

Muchas gracias de antemano por la ayuda brindada.
92
Lenguaje C para microcontroladores PIC / Re:Problema con bootloader y puerto serie
« Último mensaje por remi04 en 30 de Mayo de 2020, 05:35:06 »
No termino de entender cual es el error. La pantalla que has puesto parece correcta, saca lo que tiene que sacar por el código que veo.

 ¿Te refieres a que si le envías una trama, a partir de entonces todos los valores se muestran a cero?? , es decir, que en la terminal sigues viendo bien los enunciados pero los valores a cero..  ??.

 Si es así el problema, más que en el puerto serie,  puede estar en el parseo de los valores hacia los datos de la estructura mytime. Desconozco cómo lo hará la librería, pero puede pasar que tenga problemas con el puntero al primer elemento cuando se utiliza el bootloader.

   
93
Lenguaje C para microcontroladores PIC / Re:Necesito ayuda con este codigo en C
« Último mensaje por KILLERJC en 29 de Mayo de 2020, 23:22:52 »
Pero no mostras cual es el error, solo decis que la compilacion fallo, pero usualmente te indica donde.


Y:

Citar
HITECH PICC Toolsuite PIC COMPILER (PICC.EXE)

Es tan viejo que no tiene ni sentido ponerse a renegar... intenta portarlo a una version mas nueva como XC8. Y tambien tenes varias librerias agregadas que no estan en el codigo y posiblemente puedan tener errores.
94
Lenguaje C para microcontroladores PIC / Necesito ayuda con este codigo en C
« Último mensaje por kevinNiler en 29 de Mayo de 2020, 22:47:08 »
Lo que pasa es que estoy usando el microcontrolador 16f877 en proteus pero antes necesito compilar mi codigo en mplab HITECH PICC Toolsuite PIC COMPILER (PICC.EXE)  y me sale este error
ERROR
--------------------------------------------
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC-Lite\9.50\BIN\PICL.EXE" -C -E"16F877.cce" "16F877.c" -O"16F877.obj" -Zg9 -O -ASMLIST -Q -MPLAB -16F877
BUILD FAILED: Fri May 29 20:28:49 2020
--------------------------------------------
EL CODIGO ES EL SIGUIENTE

//programa principal
#include"lcdlibrary.h"
#include"pic1687x.h"
#include"stdio.h"
#include"string.h"
#include"usart.h"
#include"time.h"

CHAR number[MAX_DISPLAY_CHAR+1];
CHAR len[11] = {'0','1','2','3','4','5','6','7','8','9'};
VOID limpia_buf(CHAR *buf);
VOID calc_display(CHAR *buf);
VOID calculate();
static void interrupt atencion_interrupciones(void); // La función de atenció a las interrupciones
VOID serie(char con);
INT uni=0;
INT dec=0;
INT cent=0;
INT contador=0;
unsigned char input;

VOID main()
{
INT i=0;

T0IE = 1; //Declaraciones de las interrupciones
T0CS = 1;
T0SE = 1;
TMR0 = 0xFF;
GIE = 1;
for(i=0;i<=12000;i++)
{}
lcd_init();
for(;;)
{
if(contador == 1)
{
serie('X');
Contador_piezas(len[cent],len[dec],len[uni]);
pause(5000);
contador=0;
}
if(PORTC == 0xA0)
{
calculate();
}
}
}
static void interrupt atencion_interrupciones(void)
{
if(T0IF)
{
if((uni<10) && (dec<10) && (cent<10))
{
uni++;
}
if(uni==9 && dec<10)
{
uni=0;
dec++;
}
if((dec==9) && (cent<10))
{
uni++;
dec=0;
cent++;
}
if((uni==9) && (dec==9) && (cent==9))
{
uni=0;
dec=0;
cent=0;
}
/*Contador_piezas(len[cent],len[dec],len[uni]); pause(5000);*/
contador=contador +1;
}
T0IF = 0;
TMR0 = 0xFF;
}
VOID calculate()
{
CHAR key;
INT8 pos;
pos = 0;
while(pos<4)
{
key = calc_getkey();
if((calc_testkey(key)) && (PORTC!=0x10))//CAMBIO C POR D
{
if(pos != MAX_DISPLAY_CHAR - 6)
{
number[pos++] = key;
number[pos] = 0;
calc_display(number);
mensajes(number);
pause(2000);
}
}
}
PORTC=0x10;//CAMBIO C POR D
pos=0;
pause(5000);//super inportante para que me escriba array
}
VOID Contador_piezas(CHAR uni,CHAR dec, CHAR cent)
{
pause(5000);
clearscreen();
wrdata(uni);
pause(2000);
wrdata(dec);
pause(2000);
wrdata(cent);
lcd_init();
pause(2000);
}
VOID mensajes(CHAR *buf)
{
//**************************************************************
**********************
//*******************AVERIA*************************************
**********************
//**************************************************************
**********************
if((buf[0] == '1') && (buf[1] == '0') && (buf[2] == '0') && (buf[3] == 'A'))
{
CHAR cod[] = "Av.";
calc_display(cod);
serie("\n");
serie('A');
limpia_buf(buf);
}
if((buf[0] == '1') && (buf[1]=='0') && (buf [2] == '1') && (buf [3] == 'A'))
{
CHAR cod[8] = "ATASCOS";
calc_display(cod);
serie('B');
limpia_buf(buf);
}
//**************************************************************
**********************
//*******************CAMBIOS************************************
***********************
//**************************************************************
**********************
if((buf[0] == '2') && (buf[1] == '0') && (buf[2] == '0') && (buf[3] == 'B'))
{
CHAR cod[14] = "CAMBIO REFER.";
calc_display(cod);
serie('C');
limpia_buf(buf);
}
if((buf[0] == '2') && (buf[1]=='0') && (buf [2] == '1') && (buf [3] == 'B'))
{
CHAR cod[10] = "ETALONADO";
calc_display(cod);
serie('D');
limpia_buf(buf);
}
//********************************************************************
************
//********************************************************************
***************
if((buf[0] == '3') && (buf[1]=='0') && (buf [2] == '1') && (buf [3] == 'C'))
{
CHAR cod[9] = "FALTA MAT";
calc_display(cod);
serie('E');
limpia_buf(buf);
}
if((buf[0] == '3') && (buf[1]=='0') && (buf [2] == '2') && (buf [3] == 'C'))
{
CHAR cod[12] = "FALTA ASIST.";
calc_display(cod);
serie('F');
limpia_buf(buf);
}
if((buf[0] == '3') && (buf[1]=='0') && (buf [2] == '3') && (buf [3] == 'C'))
{
CHAR cod[14] = "FALTA PERSONAL";
calc_display(cod);
serie('P');
limpia_buf(buf);
}
if((buf[0] == '4') && (buf[1]=='0') && (buf [2] == '0') && (buf [3] == 'D'))
{
CHAR cod[14] = "PARADA CALIDAD";
calc_display(cod);
serie('N');
limpia_buf(buf);
}
if((buf[0] == '5') && (buf[1]=='0') && (buf [2] == '1') && (buf [3] == 'E'))
{
CHAR cod[6] = "AJUSTE";
calc_display(cod);
serie('X');
limpia_buf(buf);
}
if((buf[0] == '5') && (buf[1]=='0') && (buf [2] == '5') && (buf [3] == 'E'))
{
CHAR cod[8] = "DESCANSO";
calc_display(cod);
serie('Ñ');
limpia_buf(buf);
}
if((buf[0] == '5') && (buf[1]=='0') && (buf [2] == '7') && (buf [3] == 'E'))
{
CHAR cod[9] = "BOCADILLO";
calc_display(cod);
serie('G'); limpia_buf(buf);
}
//********************************************************************
**************************
//*********************OPERARIOS**************************************
***************************
// if((buf[0] == '0') && (buf[1]=='0') && (buf [2]== '1') && (buf [3] == 'F'))
// {
// CHAR cod[31] = "JAVIER";
// calc_display(cod);
// limpia_buf(buf);
// }
// if((buf[0] == '0') && (buf[1]=='0') && (buf [2]== '2') && (buf [3] == 'F'))
// {
// CHAR cod[31] = "CARLES";
// calc_display(cod);
// limpia_buf(buf);
// }
}
VOID limpia_buf(CHAR *buf)
{
INT i=0; for(i=0;i<=MAX_DISPLAY_CHAR;i++)
{ buf=' ';}
}
BOOL calc_testkey(CHAR key)
{
if((key >= '0') && (key <= 'F'))
return TRUE;
else
return FALSE;
}
CHAR calc_getkey(VOID)
{
CHAR mykey;
while((mykey = keypadread()) == 0x00);
return mykey;
}
VOID calc_display(CHAR *buf)
{
INT8 i; clearscreen();
for(i=0; buf != 0; i++)
{
wrdata(buf);
}
}
VOID pause(INT num)
{
while(num--) {}
}
VOID serie(char con)
{
init_comms();
input = con;
putch(input);
pause(1000);
ult_comms();
}

FUE SACADO DE UN TRABAJO "Control productivo basado en micro controladores para la industria."
Aqui el link del trabajo: https://upcommons.upc.edu/bitstream/handle/2099.1/3760/54360-1.pdf?sequence=1&isAllowed=y
Si alguien tuviera el proyecto no me vendría mal que me lo compartieran :D
95
* PROYECTOS * / Re:Control servos con Pca9685
« Último mensaje por mariana en 29 de Mayo de 2020, 16:40:32 »
como se puede usar PCA9685 para el pic 16F877A en ccs?
96
Simuladores de circuitos / Cambiar 2d Grafic de capa
« Último mensaje por PicMinor en 29 de Mayo de 2020, 08:16:05 »
Saludos al foro!

Estoy intentando cambiar un gráfico 2D de una capa a otra en el ARES, pero no consigo pasarlo a la capa Inner 3 que es la que necesito. El gráfico está en la Inner 1 así que seguro que puede hacerse, pero no consigo encontrar la forma de hacerlo. ¿Alguna sugerencia?

¡Gracias por anticipado!

Nota: Insisto que es un gráfico 2D, no un track ni un pad. :-)
97
Lenguaje C para microcontroladores PIC / Problema con bootloader y puerto serie
« Último mensaje por DiegoGlez1992 en 29 de Mayo de 2020, 07:27:54 »
Buenas

Llevo unos días haciendo pruebas con bootloader y me he topado con un problema con el puerto serie. No entiendo por qué al cargar el código tras el bootloader se comporta de una manera errónea. No entiendo por qué me envía "0" en vez de los caracteres, pero sin embargo si no envío los datos de las variables, los caracteres se envían perfectamente. Este mismo código lo grabo directamente en el PIC sin bootloader y funciona correctamente.

¿Alguien puede echarme una manita? No entiendo si tengo algo mal definido en el bootloader o por qué me pasa esto. Es la primera vez que trabajo con bootloader.

Adjunto captura de pantalla de lo que recibo por puerto serie en formato CHAR y DECIMAL.

El bootloader lo he creado con el asistente de PCWHD Compiler v5.070 de CCS y el código lo envío a través de SIOW.

Bootloader:
Código: C
  1. #include <18F2520.h>
  2. #device ADC=10
  3.  
  4. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  5. #FUSES NOBROWNOUT               //No brownout reset
  6. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  7. #FUSES NOLPT1OSC                //Timer1 configured for higher power operation
  8. #FUSES NOMCLR                   //Master Clear pin used for I/O
  9. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  10. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  11. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  12. #FUSES EBTRB                    //Boot block protected from table reads
  13.  
  14. #use delay(internal=8000000)
  15. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)
  16.  
  17. #define _bootloader
  18.  
  19. // NOTE - User must include bootloader.h in application program
  20. #include <bootloader.h>
  21. #include <loader.c>
  22.  
  23. #define PUSH_BUTTON PIN_E3
  24.  
  25. #INT_GLOBAL
  26. void isr(void){
  27.    jump_to_isr(LOADER_END+9);
  28. }
  29.  
  30. #org LOADER_END+2, LOADER_END+4
  31. void application(void) {
  32.   while(TRUE);
  33. }
  34.  
  35. void main()
  36. {
  37.  
  38.    // Enter Bootloader if Pin E3 is low after a RESET
  39.    if(!input(PIN_E3))
  40.    {
  41.       load_program();
  42.    }
  43.    
  44.    application();
  45.  
  46. }

Código: C
  1. #include <18F2520.h>
  2. #FUSES HS,INTRC_IO,NOPROTECT,NOCPD,MCLR,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOFCMEN,NOIESO
  3. #use delay(clock=8000000)
  4.  
  5. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, PARITY=N, STOP=1, ERRORS)
  6. #use I2C(MASTER, SLOW=10000, SDA=pin_C4, SCL=pin_C3, STREAM = DS3231_STREAM)
  7.  
  8. #define defined(__PCH__)
  9.  
  10. #include <bootloader.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include "DS3231.c"
  14. #include "2432.c"
  15.  
  16. char  Trama[80];        //Datos de entrada puerto serie
  17. int   d=0;
  18. signed int16 chip_temp;
  19. // DS3231 library variable declaration
  20. RTC_Time *mytime;
  21.  
  22. #SEPARATE
  23. #INT_RDA
  24. //Interrupcion que sucede cuando llega algun caracter al buffer
  25. void leer (void)
  26. {
  27.    unsigned int   a=0;     //Reinicio posición del buffer "Trama[a]"
  28.    //a=0;
  29.    Trama[a] = fgetc();
  30.    if (Trama[a]=='>')
  31.    {
  32.       while(Trama[a]!='<')
  33.       {
  34.          a++;
  35.          Trama[a] = fgetc();
  36.       }
  37.    }
  38. }
  39.  
  40. void main (void)
  41. {
  42.    unsigned int   a=0;     //Aux de cuentas buffer
  43.    setup_oscillator(OSC_8MHZ|OSC_INTRC);  //Configuramos el oscilador interno
  44.    delay_ms(10);
  45.    enable_interrupts(INT_RDA);   //Habilitamos la interrupción del RS232
  46.    delay_ms(10);
  47.    enable_interrupts(GLOBAL); //Habilitamos las interrupciones globales
  48.    delay_ms(10);
  49.    init_ext_eeprom();
  50.    delay_ms(10);
  51.    for(a=0;a<80;a++) Trama[a]="";   //Borramos el array del puerto serie
  52.    printf("Iniciando...\n");
  53.    if(ext_eeprom_ready())
  54.    delay_ms(10);
  55.    write_ext_eeprom(0x00, 0xF0);
  56.    delay_ms(10);
  57.    d=read_ext_eeprom(0x00);
  58.    while(true)
  59.    {
  60.       mytime = RTC_Get();
  61.       chip_temp = Get_Temperature();
  62.       printf("TIME: %02u:%02u:%02u\n", mytime->hours, mytime->minutes, mytime->seconds);
  63.       printf("DATE: %02u-%02u-20%02u\n", mytime->day, mytime->month, mytime->year);
  64.       printf("TEMP: %02Lu.%02Lu%cC\n", chip_temp / 100, chip_temp % 100, 186);
  65.       printf("TIME:\n");
  66.       printf("DATE:\n");
  67.       printf("TEMP:\n");
  68.       delay_ms(1000);
  69.       /////////////////////////////////////////////////////////////////////////
  70.       //Atender el puerto serie
  71.       if(STRLEN(Trama)>0)  //Si hay datos en el array del puerto serie
  72.       {
  73.          if(Trama[0]=='>') //Cabecera de trama
  74.          {
  75.             if(Trama[1]=='C') //Parametros de configuración
  76.             {
  77.                if(Trama[2]=='F' && Trama[3]=='H')  //Fecha y hora
  78.                {
  79.                   // set RTC time to 21:08:47 (hh:mm:ss) and date to 03-01-19 (dd-mm-yy)
  80.                   mytime->hours   = Trama[8];
  81.                   mytime->minutes = Trama[9];
  82.                   mytime->dow     = Trama[7];
  83.                   mytime->day     = Trama[4];
  84.                   mytime->month   = Trama[5];
  85.                   mytime->year    = Trama[6];
  86.                   // write time and date to the RTC chip
  87.                   RTC_Set(mytime);
  88.                   printf("\nOK >CFH< Configurar fecha y hora\n");
  89.                }
  90.             }
  91.          }
  92.          for(a=0;a<80;a++) Trama[a]="";   //Borramos el array
  93.       }
  94.    }
  95. }
  96.  

Un saludo
98
Microcontroladores 8 bits / Re:Problema Libreria Lcd
« Último mensaje por BroncoITC en 29 de Mayo de 2020, 01:37:40 »
hola, mira si andas en eso de entender finamente el funcionamiento de los lcd hitachi 44780 genéricos, te recomiendo que con la hoja de datos en mano veas los videos del U2, donde muestran como los manejan manualmente a fuerza de mini interruptores dip.
Luego te bajas y estudias las librerias de Donald Weiman, donde hace funcionar esos lcd, muy didacticamente.

http://web.alfredstate.edu/faculty/weimandn/index.html

Ahira de todo ésto y sabiendo como funcionan los integrados i2c pcf8574, podrás entender  como hacer tu propia librería versión i2c, o mejor usar una ya lista, como es el caso del greco Vassilis Serasidis, donde muestra hasta con video como controla varias cosas i2c...

https://www.serasidis.gr/circuits/i2c_sensors/I2C_sensors.htm

Hice todo lo que digo y llegue a buen puerto, y logre que me funcionen esas librerias i2c, que en realidad las escribio un tal Davide Gironi, y con el WinAvr, con el Studio 7, te ira mejor.

Muchas gracias, me ha sido de gran utilidad, en este momento me estoy estudiando la libreria lcd_4bit de Donald Weiman, haber que saco de ella
99
Microcontroladores 8 bits / Re:Problema Libreria Lcd
« Último mensaje por BroncoITC en 29 de Mayo de 2020, 01:28:54 »
Hola LeonPic, "lcd_std.h" es el archivo de cabecera, esto :
Código: C
  1. #define LCD_PORT              PORTB
  2. #define LCD_DDDR              DDRB
  3. #define LCD_BACKLIGHT         0x08
  4. #define LCD_NOBACKLIGHT       0x00
  5. #define LCD_FIRST_ROW         0x80
  6. #define LCD_SECOND_ROW        0xC0
  7. #define LCD_THIRD_ROW         0x94
  8. #define LCD_FOURTH_ROW        0xD4
  9. #define LCD_CLEAR             0x01
  10. #define LCD_RETURN_HOME       0x02
  11. #define LCD_ENTRY_MODE_SET    0x04
  12. #define LCD_CURSOR_OFF        0x0C
  13. #define LCD_UNDERLINE_ON      0x0E
  14. #define LCD_BLINK_CURSOR_ON   0x0F
  15. #define LCD_MOVE_CURSOR_LEFT  0x10
  16. #define LCD_MOVE_CURSOR_RIGHT 0x14
  17. #define LCD_TURN_ON           0x0C
  18. #define LCD_TURN_OFF          0x08
  19. #define LCD_SHIFT_LEFT        0x18
  20. #define LCD_SHIFT_RIGHT       0x1E
  21. #define LCD_TYPE              2 // 0 -> 5x7 | 1 -> 5x10 | 2 -> 2 lines
  22.  
  23. //prototipos
  24.  
  25. //static void lcd_write_4bit(unsigned char Nibble);
  26. //static void lcd_cmd(unsigned char cmd);
  27. void lcd_write_char(unsigned char data);
  28. void lcd_write_string(char* str);
  29. void lcd_set_cursor(unsigned char row, unsigned char column);
  30. void lcd_clear();
  31. void lcd_init();
  32.  
100
Delphi / Dispositivo HID STM32F103 + Programa de prueba DELPHI
« Último mensaje por demure en 28 de Mayo de 2020, 20:09:41 »
t=416s

Puedes descargar los códigos
Páginas: 1 2 3 4 5 6 7 8 9 [10]