Mensajes recientes

Páginas: [1] 2 3 4 5 6 7 8 9 10
1
Todo en microcontroladores PIC / Re:Descomponer numero 16 bits
« Último mensaje por Picuino en Hoy a las 15:43:05 »
Es mucho más eficaz (y algo más complicado) utilizar una rutina de conversión de binario a BCD.
Algo así: https://my.eng.utah.edu/~nmcdonal/Tutorials/BCDTutorial/BCDConversion.html

Edito:
Esta es la rutina que yo utilizo para hacer la conversión de un número de 48 bits a BCD

Código: C
  1. /*
  2.    Transform 48bit unsigned integer to BCD string
  3. */
  4. #define DEC_DIG_48   15
  5. void ltoa48(unsigned char *str, uint48 bin) {
  6.    unsigned char maxdig, digcnt, bitcnt;
  7.    static unsigned char *p, carry;
  8.  
  9.    // Clear string
  10.    p = str;
  11.    digcnt = DEC_DIG_48 + 1;
  12.    do {
  13.       *p++ = 0;
  14.    } while (--digcnt);
  15.  
  16.    // Transform binary to BCD
  17.    bitcnt = 48;
  18.    maxdig = (DEC_DIG_48 - 1);
  19.    str += (DEC_DIG_48 - 1);
  20.    do {
  21.       // Shift left binary number with carry
  22.       carry = 0;
  23.       if (bin.b47==1) carry |= 1;
  24.       bin = sl48(bin);
  25.      
  26.       // Shift left decimal number with carry
  27.       p = str;
  28.       digcnt = DEC_DIG_48 - maxdig;
  29.       do {
  30.          carry = (*p<<1) + carry;
  31.          if (carry>=10) {
  32.             *p-- = carry - 10;
  33.             carry = 1;
  34.             if (digcnt==1) {
  35.                maxdig--;
  36.                digcnt++;
  37.             }
  38.          }
  39.          else {
  40.             *p-- = carry;
  41.             carry = 0;
  42.          }
  43.       } while(--digcnt);
  44.    } while(--bitcnt);
  45.  
  46.    // Transform BCD to ASCII
  47.    digcnt = DEC_DIG_48;
  48.    do *str-- += '0'; while (--digcnt);
  49. }
  50.  
  51.  
  52. /*
  53.    Shift left
  54.    return a<<1
  55. */
  56. uint48 sl48(uint48 a) {
  57.    st48.carry = 0;
  58.    if (a.b47==1) st48.carry = 1;
  59.    ans.dword = a.dword<<1;
  60.    if (a.b15==1) ans.b16 = 1;
  61.    ans.word[0] = a.word[0]<<1;
  62.    return ans;
  63. }
  64.  
  65.  
  66. /*
  67.    Shift right
  68.    return a>>1
  69. */
  70. uint48 sr48(uint48 a) {
  71.    st48.carry = 0;
  72.    if (a.b0==1) st48.carry = 1;
  73.    ans.word[0] = a.word[0]>>1;
  74.    if (a.b16==1) ans.b15 = 1;
  75.    ans.dword = a.dword>>1;
  76.    return ans;
  77. }
  78.  
  79.  
  80. // Unsigned 48 bit integer definition
  81. typedef union {
  82.    unsigned char  byte[6];
  83.    unsigned int   word[3];
  84.    struct {
  85.       unsigned int __word;
  86.       unsigned long dword;
  87.    };
  88.    struct {
  89.       unsigned char mantissa[5];
  90.       unsigned long exp;
  91.    };
  92.    struct {
  93.       unsigned b0:1;
  94.       unsigned b1:1;
  95.       unsigned b2:1;
  96.       unsigned b3:1;
  97.       unsigned b4:1;
  98.       unsigned b5:1;
  99.       unsigned b6:1;
  100.       unsigned b7:1;
  101.       unsigned b8:1;
  102.       unsigned b9:1;
  103.       unsigned b10:1;
  104.       unsigned b11:1;
  105.       unsigned b12:1;
  106.       unsigned b13:1;
  107.       unsigned b14:1;
  108.       unsigned b15:1;
  109.       unsigned b16:1;
  110.       unsigned b17:1;
  111.       unsigned b18:1;
  112.       unsigned b19:1;
  113.       unsigned b20:1;
  114.       unsigned b21:1;
  115.       unsigned b22:1;
  116.       unsigned b23:1;
  117.       unsigned b24:1;
  118.       unsigned b25:1;
  119.       unsigned b26:1;
  120.       unsigned b27:1;
  121.       unsigned b28:1;
  122.       unsigned b29:1;
  123.       unsigned b30:1;
  124.       unsigned b31:1;
  125.       unsigned b32:1;
  126.       unsigned b33:1;
  127.       unsigned b34:1;
  128.       unsigned b35:1;
  129.       unsigned b36:1;
  130.       unsigned b37:1;
  131.       unsigned b38:1;
  132.       unsigned b39:1;
  133.       unsigned b40:1;
  134.       unsigned b41:1;
  135.       unsigned b42:1;
  136.       unsigned b43:1;
  137.       unsigned b44:1;
  138.       unsigned b45:1;
  139.       unsigned b46:1;
  140.       unsigned b47:1;
  141.       unsigned b48:1;
  142.    };
  143. } uint48;
  144.  
  145.  
2
C, C#, C++ / Re:teclado_pic16f887a
« Último mensaje por DominusDRR en Hoy a las 13:52:50 »
resumiendo quiero controlar un motor, por ejemplo ingreso 50 en pwm y 100 en tiempo luego presiono *, luego ingreso 100 en pwm y 1000 en timpo asi sucesivamente, luego al final de ingresar los datos que quiero presiono # y ejecuta todo lo que ingrese de manera secuancial. estaba pensando en switch case, pero no puedo separar los datos.

Crea una variable estructura así:

Código: C
  1. typedef struct
  2. {
  3.    unsigned char ancho;
  4.    unsigned int tiempo
  5. } ESTRUCTURA_ANCHO_TIEMPO;
  6.  
  7.  

Luego declaras un arreglo de la estructura, digamos hasta 100 anchos/tiempos que puedas guardar:

Código: C
  1. ESTRUCTURA_ANCHO_TIEMPO anchoTiempo[100];
  2.  

Para almacenar los valores sería algo así:

Código: C
  1. punteroAnchoTiempo = 0; // lo inicializas en alguna parte.
  2.  
  3. // cada vez que ingresas un nuevo valor de ancho y tiempo sería así:
  4.  
  5. anchoTiempo[punteroAnchoTiempo].ancho = ancho de pulso que se ingresó;
  6. anchoTiempo[punteroAnchoTiempo].tiempo = tiempo que se ingresó;
  7. punteroAnchoTiempo++; //incremento puntero para el próximo ancho-tiempo
  8.  
  9.  

Y para ejecutarlo de manera secuencial  Sería lgo así:

Código: C
  1. for (k = 0; k < punteroAnchoTiempo; k++)
  2. {
  3.      j = 0;
  4.     for (i = 0; i < anchoTiempo[k].tiempo; i++) /
  5.    {
  6.         setPWM(anchoTiempo[k].ancho);
  7.         j += valorIncrementar;
  8.         retardo(anchoTiempo[k].tiempo);
  9.    }
  10. }
  11.  


3
C, C#, C++ / Re:teclado_pic16f887a
« Último mensaje por gaitan en Hoy a las 13:33:39 »
resumiendo quiero controlar un motor, por ejemplo ingreso 50 en pwm y 100 en tiempo luego presiono *, luego ingreso 100 en pwm y 1000 en timpo asi sucesivamente, luego al final de ingresar los datos que quiero presiono # y ejecuta todo lo que ingrese de manera secuancial. estaba pensando en switch case, pero no puedo separar los datos.
4
C, C#, C++ / Re:teclado_pic16f887a
« Último mensaje por DominusDRR en Hoy a las 13:25:46 »
gracias amigo, me fue muy util tu ayuda, ahora me falta otra parte: estoy buscando que se almacene el valor de pwm y el tiempo en una variable, luego ingresar otro valor de pwm y tiempo en otra, para después con una tecla del teclado ejecutar toda la secuancia y tenga varias velocidades, ya que lo que quiero es controlar un motor.

O sea tu dices, por ejemplo:

Ingreso ancho pwm = 50 tiempo 300, luego pwm = 200 tiempo 1000, y finalmente pwm = 170 tiempo 2300 y presionas una tecla y pasa lo siguiente:

El pwm incrementa el ancho de pulso de 0 a 50 en intervalos de 200 s, luego incrementa de 0 a 200 en pasos de 1000 s y finalmente incrementa de 0 < 170 en pasos de 2300 s.

¿Es así?
5
C, C#, C++ / Re:teclado_pic16f887a
« Último mensaje por gaitan en Hoy a las 02:58:07 »
gracias amigo, me fue muy util tu ayuda, ahora me falta otra parte: estoy buscando que se almacene el valor de pwm y el tiempo en una variable, luego ingresar otro valor de pwm y tiempo en otra, para después con una tecla del teclado ejecutar toda la secuancia y tenga varias velocidades, ya que lo que quiero es controlar un motor.
6
No, tampoco es asi, el output_low(PIN_B6); ha de estar fuera del for para que se apague al finalizar el conteo del for si no, se apagara cuando pasen los 500ms, sin que i se haya incrementado ni una sola vez, la instruccion correcta es asi:

void main(){
 
   while(true){
      if(input(PIN_B7) == 1){

         for (i=0; i<100 ; i++){
             output_high(PIN_B6);
             delay_ms(500);
             }

            output_low(PIN_B6);

      }
   }
}

la accion durara unos 50 seg encendido al pulsar y luego se apagara porque es la multiplicacion de 500ms x 100 veces del for

Supongamos que quieres que este encendido 10 segundos cuando pulsas, cambias el 100 del for o cambias el 500 del delay.
Si cambias el delay serian 100ms de delay, y 100ms x 100 veces del for =10000ms, en total que son 10 segundos encendido.
Y si cambias el 100 del for pones 20 (i=0; i<20; i++) y 500ms x 20 veces del for = 10000 ms que son 10 segundos encendido.

Añado, para esos fallos tan tocanarices que no encuentras, necesitas un debugger con proteus por ejemplo y veras donde esta el fallo casi al instante, solo has de crear un fichero cof en el compilador y lo cargas en el pic como si fuese el hex pero en lugar de darle a play en proteus le das a step y se abrira una ventana donde veras en este caso la variable i y la accion que se realiza y el incremento actuando sobre el puerto RB6 al accionar RB7.
7
Foro Técnico / Re:programador eprom's Willem de Aliexpress
« Último mensaje por Sispic en Hoy a las 00:58:29 »
http://www.mpu51.com/eprom/eprom.html#SCHPCB
se supone es el mismo pero alimentado por un puerto usb 5v.
Indica No funciona con daptador USB a Puerto Paralelo LPT .

con win10 Boton derecho propiedades , compatibilidad , ejecutar windows95 .
ver los Switch ON/OF .
Tienes en el software Test/HW y verificar que llegue cada linea al pin del dispositivo . Vpp , Vcc , CE , etc.

8
Todo en microcontroladores PIC / Re:Necesito Ayuda porfavor -PIC16F84-
« Último mensaje por novato23 en 25 de Septiembre de 2021, 18:49:18 »
Que tal Novato23,

Es importante que leas los errores reportados de otra manera no sabrás cuál es el problema.
En tu caso es muy simple el problema. Solo te falta una comilla en la siguiente isntrucción:

Código: [Seleccionar]
movlw b’00000110 ;configuración OPTION

debería ser:

Código: [Seleccionar]
movlw b’00000110' ;configuración OPTION

Saludos,

elreypic.

PROBLEMA SOLUCIONADO, MUCHISIMAS GRACIAS DE VERDAD LO AGRADEZCO.  ((:-))
9

Además de lo comentado por Killerjc  también tenés que corregir el for:
Código: [Seleccionar]
   for (i=0; i=100 ; i++){

De esa manera se ejecuta una sola vez, debe ser:
Código: [Seleccionar]
   for (i=0; i<100 ; i++){


10
Es por eso que siempre es mejor ser ordenado al programar, siempre identar el codigo

Código: C
  1. void main(){
  2.  
  3.    while(true){
  4.       if(input(PIN_B7) == 1){
  5.          for (i=0; i=100 ; i++){
  6.             output_high(PIN_B6);
  7.             delay_ms(500);
  8.             output_low(PIN_B6);
  9.             i=0;
  10.          }
  11.       }
  12.    }
  13. }

Tenes 2 errores...

El primero es poner a 0 el i, dentro del for, sino nunca va a parar. Ya que siempre i va a valer 0 y no se va a cumplir la condicion i>100

El Segundo es ver lo que se esta repitiendo

            output_high(PIN_B6);
            delay_ms(500);
            output_low(PIN_B6);

Si observas se prende, se espera 500ms encendido, luego se apaga, y comienza la otra vuelta, donde se prende de nuevo...
El tiempo entre que se apago y se encendio debe haber sido de microsegundos, por eso no lo notas. La solucion es ponerle una demora tambien al apagado


Código: C
  1. void main(){
  2.  
  3.    while(true){
  4.       if(input(PIN_B7) == 1){
  5.          for (i=0; i=100 ; i++){
  6.             output_high(PIN_B6);
  7.             delay_ms(500);
  8.             output_low(PIN_B6);
  9.             delay_ms(500);
  10.          }
  11.       }
  12.    }
  13. }
Páginas: [1] 2 3 4 5 6 7 8 9 10