Autor Tema: Modulos CCp y PWM mejorado  (Leído 23146 veces)

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

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modulos CCp y PWM mejorado
« Respuesta #45 en: 23 de Enero de 2008, 23:28:04 »
O.k ya lo descargue... al parecer era un problema de mi explorador.... Lo estoy probando y si sirve, salvo como dijiste con unos detallitos por allí que me encargaré de afinar.... Gracias por la ayuda o.k te quedo genial tu programa... No soy muy experta en C aún como he mencionado en anteriores post, pero pude observar que para el teclado, hiciste como una llamada de una función hacia otra función, esto:
guarda(Tabla_Display(tecla=1)); Corrijeme si me equivoco.... Alguien me habia dicho que usará una tabla, pero no tenia mucho conocimiento de como hacerlo y con tu ejemplo me ha quedado claro... :-) Cada día aprendo más cosas de C jejeje :mrgreen:
Es así? es como llamar una función dentro de otra??? :?

Otra pregunta hay alguna diferencia el que uno coloco los números en decimal o en Hexadecimal? :?, lo pregunto porque como mandaste todos los números en Hexadecimal....

De nuevo gracias por todo!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Modulos CCp y PWM mejorado
« Respuesta #46 en: 23 de Enero de 2008, 23:54:49 »
Hola Enigma

Paso a contestarte:

pero pude observar que para el teclado, hiciste como una llamada de una función hacia otra función, esto:
guarda(Tabla_Display(tecla=1)); Corrijeme si me equivoco.... Alguien me habia dicho que usará una tabla, pero no tenia mucho conocimiento de como hacerlo y con tu ejemplo me ha quedado claro... :-) Cada día aprendo más cosas de C jejeje :mrgreen:
Es así? es como llamar una función dentro de otra??? :?

Efectivamente el trozo de código:

guarda(Tabla_Display(tecla=1));

Equivale a:

tecla = 1;
Digito = Tabla_Display(tecla);
guardar(Digito);

Fijate que tal y como te lo he puesto primero se asigna el valor 1 a la variable tecla (tecla = 1) y despues se pasa a la función la variable tecla (y por consiguiente el 1 que contiene).

Esto se puede hacer todo en un paso de la forma Tabla_Display(tecla=1); Se asigna y se pasa el valor todo al mismo tiempo (es un pequeño truco).

El resultado que me devuelve la función Tabla_Display se pasa a la función guarda y como en el caso anterior todo se puede hacer de una vez de tal forma que las tres líneas de código quedan en una sola línea.

Como veras el programa queda mucho más reducido y es más fácil localizar las cosas.

La numeración que utilizo es o hexadecimal o en binario. En concreto cuando activo las salidas de un puerto prefiero poner:

a0 = 0b11111110 = 0xFE
a1 = 0b11111101 = 0xFD
a2 = 0b11111011 = 0xFB
a3 = 0b11110111 = 0xF7
a4 = 0b11101111 = 0xEF
a5 = 0b11011111 = 0xDF
a6 = 0b10111111 = 0xBF
a7 = 0b01111111 = 0x7F

Como veras cuanto utilizamos notación binaria contando la posición del cero sé que bit estoy activando, pero si utilizamos la notación hexadecimal no nos dice nada. El resultado es el mismo, pero con un solo vistazo en binario se que patilla activo.

Un saludo

* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modulos CCp y PWM mejorado
« Respuesta #47 en: 24 de Enero de 2008, 00:02:54 »
 :shock: Berro!!! viste, así deberia explicar un profesor!!!! más fino!!! Más claro no canta un gallo, todo lo que no entendia en un mes lo entendi en unos minutos leyendo tu post!!!! Muchas gracias de verdad!!! y gracias por el truquito... Bueno ya he arreglado los detalles y funciona bien bonito... ahora adaptaré la pwm y pronto daré resultados!!!

Gracias amigos,... Muack!! un besote!! :g)

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Modulos CCp y PWM mejorado
« Respuesta #48 en: 24 de Enero de 2008, 02:30:40 »
Jejejejejejeje. bueno no creo que sea para tanto.

Uno de los problemas que tiene el programa es que no esperas a que se suelte la tecla con lo cual la asigna para los dos dígitos. La forma de evitarlo es después de procesar la tecla poner:

while((input_b()&0b11110000)!=0b11110000);   // Espera a que se suelte la tecla.

Quedando un tecla como:

         if(input(pin_B4)==0)                   // verifico si RB4 está en 0 (Ascii =#)
         {
            delay_ms(20);                       // verifica sino es rebote
            if(input(pin_B4)==0)                // verifico otra vez si RB4 está en 0 (Ascii =#)
               guarda(Tabla_Display(tecla=11)); // Tecla 11; Mando el N al display
            while((input_b()&0b11110000)!=0b11110000); // Espera a que se suelte la tecla.
 

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modulos CCp y PWM mejorado
« Respuesta #49 en: 28 de Enero de 2008, 02:03:19 »
Ahhh.... o.k.... bueno yo habia usado está...

if(input(pin_B7)==0)                   // RB7 está en 0? (Ascii =1)
         {
            delay_ms(20);                       // verifica sino es rebote
            if(input(pin_B7)==0)                // verifico otra vez si RB7 está en 0 (Ascii =1)
            {
               if(input(pin_B7)==1)    // Soltó la tecla?
               boton=1;
               guarda(Tabla_Display (tecla=1));  // Tecla 1; Mando el 1 al display
            }
         }

Pero tu rutina ahorra más lineas de instrucción... jejejeje :D

Tengo una pregunta.... Bueno en realidad son tres:  :mrgreen:

1) guarda(Tabla_Display (tecla=1));  // Tecla 1; Mando el 1 al display
Sabes que está variable tecla me guarda el valor para irlo a buscar a la tabla no??? ahora, en la función de la tabla, dicha variable está declarada así:
int Tabla_Display(int _Tecla)

Umm ellas no deberian ser iguales????

2) while((input_b()&0b11110000)!=0b11110000);   // Espera a que se suelte la tecla.
Me puedes explicar que me está diciendo o preguntando está instrucción?? y disculpa mi ignorancia???  :( (pero toy nuevita en C, aún jejeje :lol: )

3) No es necesario abrir las llaves despues de un If, lo pregunto porque en la rutina que me prestaste no las abres.... pense que era necesario abrirlas....

if(input(pin_B6)==0)                   //RB6 está en 0? (Ascii =4)
         {
            delay_ms(20);                       // verifica sino es rebote
            if(input(pin_B6)==0)                // verifico otra vez si RB5 está en 0 (Ascii =4)
               boton=4;
               guarda(Tabla_Display(tecla=4));  // Tecla 4; Mando el 4 al display
         }

PD: de pana explicaste muy bien todo!!! :P

Atte: Enigma... La llanerita de Guayana :g)

« Última modificación: 28 de Enero de 2008, 02:06:24 por Enigma »
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Modulos CCp y PWM mejorado
« Respuesta #50 en: 28 de Enero de 2008, 10:42:23 »
Hola Enigma te paso a contestar tus dudas:

1) guarda(Tabla_Display (tecla=1));  // Tecla 1; Mando el 1 al display
Sabes que está variable tecla me guarda el valor para irlo a buscar a la tabla no??? ahora, en la función de la tabla, dicha variable está declarada así:
int Tabla_Display(int _Tecla)

Umm ellas no deberian ser iguales????

"tecla" es el nombre de la variable donde guardas el valor de la última tecla pulsada y "_Tecla" es el nombre del parámetro que se le pasa a la función, estos nombre pueden ser iguales o distintos, eso es indiferente. Fíjate que si queremos llamar a la función con distintas variables, si los nombres tuvieran que ser iguales no se podría  hacer. Por ejemplo:

tecla1 = Lee_teclado();
tecla2 = Lee_teclado();

Display1 = Tabla_Display(tecla1);
Display2 = Tabla_Display(tecla2);

2) while((input_b()&0b11110000)!=0b11110000);   // Espera a que se suelte la tecla.
Me puedes explicar que me está diciendo o preguntando está instrucción?? y disculpa mi ignorancia???  :( (pero toy nuevita en C, aún jejeje :lol: )

En esta instrucción hacemos lo siguiente:

1º) Leemos el puerto "B": input_b()
2º) Hacemos un AND con el valor binario 11110000, esto hace que los 4 bits menos significativos siempre valgan cero (un and con un cero siempre da 0) y los 4 bist mas significativos depende de los valores del puerto "B".
3º) Verificamos si es distinto al valor binario 11110000. Ya sabemos que los cuatro ceros siempre estarán ahí, pero los 1 solo aparecerán cuando soltemos todas las teclas. Por consiguiente si es distinto a 11110000 hay alguna tecla pulsada y hay que esperar. Si el valor es distinto lo cerramos en un bucle while sin instrucciones esperando que se suelte.

3) No es necesario abrir las llaves despues de un If, lo pregunto porque en la rutina que me prestaste no las abres.... pense que era necesario abrirlas....

if(input(pin_B6)==0)                   //RB6 está en 0? (Ascii =4)
         {
            delay_ms(20);                       // verifica sino es rebote
            if(input(pin_B6)==0)                // verifico otra vez si RB5 está en 0 (Ascii =4)
               boton=4;
               guarda(Tabla_Display(tecla=4));  // Tecla 4; Mando el 4 al display
         }

En esto me has pillado por lo menos parcialmente. Efectivamente en este caso hay que poner llaves para que afecte a todas las instrucciones de tal forma que quedaría como:

if(input(pin_B6)==0)                   //RB6 está en 0? (Ascii =4)
         {
            delay_ms(20);                       // verifica sino es rebote
            if(input(pin_B6)==0)                // verifico otra vez si RB5 está en 0 (Ascii =4)
               {
               boton=4;
               guarda(Tabla_Display(tecla=4));  // Tecla 4; Mando el 4 al display[/color]         }
               }

Pero no es necesario poner siempre la llaves. Estas se ponen si hay que controlar más de una instrucción. Si solo hay una instrucción no hace falta. Por ejemplo:

            if(input(pin_B6)==0)               
               guarda(Tabla_Display(tecla=4));
               boton=4;

El "if" solo afecta a: guarda(Tabla_Display(tecla=4)); y boton=4; siempre se ejecuta.

Pero con:

            if(input(pin_B6)==0)
               {
               guarda(Tabla_Display(tecla=4));
               boton=4;
               }

el "if" afecta a las dos instruccines.

De echo es muy habitual cuando solo hay una instrucción poner:

if(input(pin_B6)==0)   guarda(Tabla_Display(tecla=4));

Se pone en la misma línea el "if" y la instrucción.

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modulos CCp y PWM mejorado
« Respuesta #51 en: 31 de Enero de 2008, 02:19:15 »
Una pregunta, los modulos de comparación del CCP2 solo actuan con interrupción? ajuero cuando el TIMER1 o 3 se desborda produce interrupción... o se puede programar para que simplemente se desborde y haga algún cambio a la salida del CCP2 y ya...??

Atte: Enigma... La llanerita de GUayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!