Autor Tema: consulta  (Leído 7291 veces)

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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #15 en: 14 de Agosto de 2020, 08:53:52 »
https://www.ccsinfo.com/downloads/ccs_c_manual.pdf

Pagina 183

Si, deberias usar el  use delay (clock=27120000) para que tus delays respeten el tiempo

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #16 en: 15 de Agosto de 2020, 17:42:25 »
Hola nuevamente
 esta configuracion pertence a un pic 16877A

#BIT Data_Pin = 0x08.0                       // Pin mapped to PORTD.0
#BIT Data_Pin_Direction = 0x88.0             // Pin direction mapped to TRISD.0
 
Cambie de pic por un 18f4520 y el sensor colgado de ese pin anterior no lo ve
  donde puedo sacar informacion acerca del pin D0 de del 18F
Debería buscarla en su datasheet pero no la encuentro o estoy interpretando mal el data
Gracias
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #17 en: 15 de Agosto de 2020, 19:27:37 »
Del datasheet del PIC18F4520.. Ahí esta toda la informacion.

El mayor problema es que los PIC18 poseen 3 registros, el PORTx para leer, el TRISx para entrada/salida, y el LATx para la salida.
Distinto de los PIC16.

Y ni hablo de los nuevos que tienen vaaaaaaarios registros. Ademas si esos pines tienen para analogico/digital, tambien vas a tener algun registro, ya sea los ANSELx o ADCONx para configurarlo como digital primero.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #18 en: 16 de Agosto de 2020, 22:45:30 »
Gracias por tus aportes KillerJC. Muy útiles como siempre!.lo que me permite avanzar.

Otra consulta.  Necesito comparar un par de números de dos cifras  Uno de ellos lo obtengo a traves de un contador realizado de la siguiente forma:
 
char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0;    //  i=unidades y j=decenas
 y los muestro en el lcd mediante

TabNum[j] y TabNum ( j decena e i unidad)  de la siguiente forma

printf(lcd_putc,"%c%c",tabNum[j],tabNum);

El otro número lo obtengo de una medición y después de hacer este  tratamiento

message1 [7]=(Temp/100)%10+48; (decenas)
message1[8]=(Temp/10)%10 + 48; (unidades)

lo muestro por lcd en un chard mediante

printf(lcd_putc, message1); 

Ambos pares se presentan perfectamente en pantalla
 
Lo que quiero hacer es compararlos y decidir
 La pregunta es : ¿Se puede hacer de la siguiente manera?

If ((message1(7)>=TabNum ) && (message1(8)>=TabNum [j]));   //( si la medicion ( message1 ) es mayor o igual que el nro (j,i)

bit_set(port_b,0);

else

bit_set(port_b,1);

Gracias por su colaboración






Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #19 en: 16 de Agosto de 2020, 23:19:28 »
Lo que tenes en message1 lo tenes en Temp

entonces... mejor compararlo con eso...

if (Temp >= (TabNum[j]*10 y TabNum))


Ahora TabNum solo es un puntero... No se que son TabNum ni como lo manejas. Y pieso que estas intentando comparar eso.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #20 en: 17 de Agosto de 2020, 14:47:21 »
Lo que sucede es TEMP tiene tres digitos y uno de ellos corresponde al decimal de la medición. Por ejemplo. TEMP es 254 y lo arreglo de tal forma que quede  25.4
Lo que quiero es comparar solo el 25. con los tabNum [j] y tabNum que salen de aquí
char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0;    //  i=unidades y j=decenas

 y se incrrementan de esta manera

void asendente(void)                  //funcion cuenta ascendente

{         
            i++;                  //incremento contador para visualizar siguiente digito
            if(i>9){                     //¿se ha mostrado digito 9?
            i=0; //SI -> restaura valor indice(para mostrar digito 0)
            j++;
            if(j>9){
              J=0;
           
            }}
Debido a esta particularidad de comparar solo los enteros es que se me ocurre la comparacion de número x número
 Gracias
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #21 en: 17 de Agosto de 2020, 15:17:17 »
Te vuelvo a decir

tabNum[j] -> accede al elemento j del array tabNum
tabNum  (asi solo) es el puntero al array, y no el contenido.

Si queres comparar numero a numero, entonces tenes que comparar decenas primero
- Si es mayor por ejemplo tabNum entonces ya queda decido
- Si es menor tabNum entonces tambien queda decido
- Si son iguales luego tenes que revisar las unidades.

Si son muchos ya te conviene un for y pasar los arrays

Ves que es mas complicado ?
Si tenes Temp como 254, dividilo por 10, y listo... te queda 25.


No te puedo dar codigo hasta que no definas exactamente como estan guardado los numeros.
Y usualmente, se hace todo con enteros, y unicamente para mostrar se pasa a ASCII. Ya que trabajar en ASCII es mas complejo (normalmente, hay excepciones)

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #22 en: 17 de Agosto de 2020, 18:26:55 »
if ((message1(7)>=TabNum ) && (message1(8)>=TabNum [j]));   //( si la medicion ( message1 ) es mayor o igual que el nro (j,i)
 Gracias Killerjc. Hay un error en la expresión que escribí
 Lo correcto es así:

if ((message1(7)>=TabNum) && (message1(8)>=TabNum [j]));   //( si la medicion ( message1 ) es mayor o igual que el nro (j,i)

Aquí estoy comparando el contenido de message1 en la posiición 7 y el contenido de tabNum en la posición i

message1(7)>=TabNum

Lo que sugieres lo puedo presentar de esta manera?


if (Temp/10 >= (TabNum[j]*10 + TabNum)) y decido ....

sería comparar..... siguiendo con el ejemplo 254/10 con el contenido de j *10 + el contenido de i
 
Gracias killerjc




Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #23 en: 17 de Agosto de 2020, 18:49:23 »
Despues de discutir sobre que no aparece el
Código: [Seleccionar]
[i]
Es por que el foro lo saca, ya que es el código BB de la itálica. Por eso mejor ponerlo en un recuadro de código como hice arriba.

-----------------------------------------------------------------------

Código: [Seleccionar]
if ((message1(7)>=TabNum[i]) && (message1(8)>=TabNum [j]));   //( si la medicion ( message1 ) es mayor o igual que el nro (j,i)
Tampoco, porque estas pidiendo que ambos numeros sean mayor o igual, entonces si en message1 tenes 32  y en TabNum tenes 23 esto falla. Por eso te decia... primero las decenas y luego las unidades.


Código: C
  1. if (Temp/10 >= (TabNum[j]*10 + TabNum[i]))

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #24 en: 18 de Agosto de 2020, 21:01:15 »
Hola Killerjc. Gracias por tus aportes. Se avanza y se aprende.
Estoy con estas líneas de programa.

if (Temp/10>= (tabNum[j]*10+tabNum))    //si la temperatura supera un determinado valor high D2
        output_High(PIN_D2);
 else
      output_low(PIN_D2);

Como no puedo producir la variacion de temp.  Provoco el incremento del seteo 
como empiezo desde (J,i) = (00) y ya mido temperatura 24° se ejecuta high D2. Tengo un led que se prende. Se apaga cuando el  incremento del seteo todavía es menor y llega a 12. se debería apagar cuando ese seteo supera los 24°. O sea cuando la temperatura es menor que el seteo.
Busque cambiar las posiciones j,i pero igual no responde a la expresión.
Lo positivo es que se prende y se apga el led pero no con los valores que quiero.

Probé también con esta expresión

if ((message1[7]>=tabNum[j]) && (message1[8]>=tabNum))     
        output_High(PIN_D2);
     
    else
     
     output_low(PIN_D2);

Aquí la salida se pone a uno cuando se cumple las dos condiciones o solo una. Lo que no deberia ser. lo ideal sería solamente las dos se cumplen.
No se en que le estoy errando

 
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #25 en: 18 de Agosto de 2020, 22:02:57 »
Perdon, eso es porque crei que tabNum era algun array que tenia valores numericos (estoy con la cabeza en mil lados). Y no me di cuenta que era el array de los caracteres.

Código: C
  1. if (Temp/10>= (j*10+i))    //si la temperatura supera un determinado valor high D2
  2.         output_High(PIN_D2);
  3.  else
  4.       output_low(PIN_D2);

La otra forma seria:

Código: C
  1. if (message1[7]>tabNum[j]) {
  2.         // Decena mas grande en mensaje
  3.         output_high(PIN_D2);
  4. }
  5. else if (message1[7]==tabNum[j]) {
  6.         if(message1[8]>=tabNum[i]) output_high(PIN_D2);   // Decena igual, Unidad igual o mas grande
  7.         else  output_low(PIN_D2);   // Decena igual, Unidad mas pequeña
  8. } else {
  9.      output_low(PIN_D2); // Decena mas pequeña.
  10. }

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #26 en: 19 de Agosto de 2020, 18:51:09 »
Bien funcionó con .... if (Temp/10>= (j*10+i)). Todo anda perfectamente pero trataré de optimizarlo

Me queda la duda del tabNum[j] y el j ( lo mismo para la i) que diferencia si uno me muestra el contenido de J y el otro el valor de j que es lo mismo.

De todas formas voy a hacer una modificación en mi programa Voy a implementar el seteo de los valores máximos y mínimos mediante una interrupción por RB2.
Muchas gracias gracias Killerjc!!! Sin duda sirve de mucho el foro :-/ :-/
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #27 en: 19 de Agosto de 2020, 21:03:30 »
Citar
Me queda la duda del tabNum[j] y el j ( lo mismo para la i) que diferencia si uno me muestra el contenido de J y el otro el valor de j que es lo mismo.

Es que j es un numero del 0 al 9 (decimal del 0 al 9)

Mientras que tabNum[j] es un numero ASCII, es decir '0' a '9', pero estos números codificados en ASCII tienen un valor hexadecimal 0x30 a 0x39 respectivamente, o de 48 a 57 decimal




Y ahora que lo pienso, el array TabNum no tiene sentido.... ya que si queres obtener el equivalente en ASCII solo haces:

Código: C
  1. j + '0'

Y es lo mismo que con tu array hacer:

Código: C
  1. TabNum[j]
« Última modificación: 19 de Agosto de 2020, 21:06:41 por KILLERJC »

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #28 en: 19 de Agosto de 2020, 21:49:40 »
Gracias!!
Lo que me planteo es setear con interrupciones externas por RB2.

Sé que que ingresa a la interrupción porque se ejecuta una parte de este programa.
 Es decir... el led se prende y apaga 5 veces y sale de la interrupcion.

Lo que debería suceder de acuerdo a mi teoría además se tendría que meter al do - while y hasta que el pin b2 no se pulse se tiene que quedar. Accionando b1 incremento un tmax  y muestro conteo.

 Compila todo muy bien. Pero no se mete en el do while a contar

Dejo las líneas del programa. Gracias!!

 PortB_Interrupt() //Nombre de la interrupción.

{
 
ext_int_edge(1,H_TO_L); //Detecta el cambio de estado de RB1 en el flanco negativo.
 
int tmax;  //variable de conteo

 for(n=1; n<=5; n++){ //El LED conectado en el puerto D1 titila 5 veces.
 output_high(PIN_D2);
 delay_ms(300);
 output_low(PIN_D2);
 delay_ms(300);
 }

 do{
     if(!input(PIN_B0)){                  //¿se ha pulsado el boton?
         do{                           //SI -> eliminar...           
         }while(!input(PIN_B0));
         tmax++;
         delay_ms(500);
         if (tmax >40)
         tmax=0;
        lcd_gotoxy(7,4);
        printf(lcd_putc,"%u",tmax);
     } 
     }while (bit_set(port_b,2)==1);
 

}
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #29 en: 20 de Agosto de 2020, 20:58:01 »
Por el momento ya lo solucioné. Me meto en las interrupciones solo para incrementar los valores de seteo max y min. No hago todo el protocolo de seteo. Pero aún no se porque no entra en el lazo.
Gracias.  :-/ :-/ :-/

Si quieres trascender..., enseña humildemente  lo que sabes.


 

anything