TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 19 de Enero de 2008, 04:28:05
-
Hola chamos.... otra vez me encuentro por aquí con mis dudas... Tengo unas pregunticas, he estado leyendo y bueno se me ha hecho dificil el lenguaje C y unas instrucciones para el modulo CCP y el PWM mejorado del 18F4550...
1) Tengo estás instrucciones en C:
SETUP_TIMER_0(RTCC_DIV_256|RTCC_8_BIT); Que quiere decir...? se que el divisor lo pone en 256, pero el RTCC_8_bit? que significa? :?
2) SET_TIMER0(~195); esto es que está cargando 195 al Timer0???
3) SETUP_TIMER_1 (T1_EXTERNAL|T1_DIV_BY_1); Comol es esto? del T1_external, y porque el divisor se coloca en 1??
4) SET_PWM1_DUTY(ciclo_u); Esto activa el ciclo útil??
5) Algo más general.... Para trabajar el PWM mejorado, estoy haciendo un circuito que me permite controlar la velocidad de un motor... Tengo entendido que para trabajar con el PWM mejorado tengo que usar el CCP1 (corrijanme si me equivoco :?), y para el CCP1, tengo que usar el Timer 2, ahora, aqui viene mi enredo.... osea, creo que el valor que uno le asigna al Timer 2 es para establecer el ciclo util de la PWm, es así?
Ahora, el timer0 lo utilizo para modificar el CCP o algo??? :(
Atte: Enigma... La llanerita de Guayana :-)
-
holas
1) div_256 es el preescaler y _8_bit es que estas configurando el timer0 para que funcione a 8bits y no 16bits
2) si, pero mejor ponlo sin ese guion ondulado (creo que significa complemento)
3) external porque el tmr1 se incrementara con pulsos externos, no con ciclos de instruccion, y div_by_1 ya que como es externo pues indica qeu un pulso incrementa en uno el timer 1 (como sabes si el preescaler, y si se coloca digamos en div_2 dice que cada dos pulsos recien se incrementa en 1 el timer1)
4) en realidad no tan asi, obedee a estas formulas si no me equivoco, usando tmr2:
T=(PR2+1)*4*Tosc*Preescaler (periodo; con desde 500 5000Hz y >18KHz)
D=duty*Tosc*Preescaler (Ciclo de trabajo; duty es el que va en set_pwm1_duty())
5) aqui ya me raye, quiza por el sueño que traigo :D, pero si usas el pwm con el timer2 las definiciones son asi
setup_timer_2(t2_div_by_4,0xF0,1); // modo=div_4,PR2=0xf0,posescaler=1
para modificar el pwm creo que basta con jugar con esas formulas, con el PR2 y el duty
pd. ahora si que me caigo de sueño, por la mañana te cuelgo un ejemplo que hice con pwm, con el tmr2, pero como dato te dejo qeu todo lo saque de aca del foro :mrgreen:
un saludo
EDITO: a que rayos, te lo adjunto, es una miniatura :mrgreen:
-
Hola chamos.... otra vez me encuentro por aquí con mis dudas... Tengo unas pregunticas, he estado leyendo y bueno se me ha hecho dificil el lenguaje C y unas instrucciones para el modulo CCP y el PWM mejorado del 18F4550...
1) Tengo estás instrucciones en C:
SETUP_TIMER_0(RTCC_DIV_256|RTCC_8_BIT); Que quiere decir...? se que el divisor lo pone en 256, pero el RTCC_8_bit? que significa? :?
Según la data del 18F: "Software selectable operation as a timer or counter in both 8-bit or 16-bit modes"
2) SET_TIMER0(~195); esto es que está cargando 195 al Timer0???
Exacto
3) SETUP_TIMER_1 (T1_EXTERNAL|T1_DIV_BY_1); Comol es esto? del T1_external, y porque el divisor se coloca en 1??
Los pulsos que harán correr al Timer1 pueden ser del reloj interno del PIC o pulsos externos recibidos por un pin. En este caso se configura para pulsos externos. Y el divisor está en 1 porque así lo ha querido quien hizo ese programa, o lo que es lo mismo, no divide con preescaler.
4) SET_PWM1_DUTY(ciclo_u); Esto activa el ciclo útil??
Yes, my friend
5) Algo más general.... Para trabajar el PWM mejorado, estoy haciendo un circuito que me permite controlar la velocidad de un motor... Tengo entendido que para trabajar con el PWM mejorado tengo que usar el CCP1 (corrijanme si me equivoco :?), y para el CCP1, tengo que usar el Timer 2, ahora, aqui viene mi enredo.... osea, creo que el valor que uno le asigna al Timer 2 es para establecer el ciclo util de la PWm, es así?
Yes, my friend
Ahora, el timer0 lo utilizo para modificar el CCP o algo??? :(
Esta pregunta no la entiendo
Disculpa Cryn, cuando lo tenía escrito te me has adelantado, así que repito muchas cosas.
-
Ahh!! o.k... más fiino!! ya estoy entendiendo estos modulos... Gracias a los dos, son lo máximo!! :mrgreen:
Ahora, a ver, aja, por lo que he estudiado, para el ccp1, pues escribo en el ccpr1l y luego cuando el timer2 se desborda, pues lo que estaba en ccpr1l pasa a ccpr1h para cargar así el ciclo útil no?.... Ahora suponganse que yo quisiera modificar ese ciclo util via lo que sea, via teclado, por pulsadores o lo que sea, yo modificaria los registros CCR1L y CCPR1H o al timer2???
Atte: Enigma... La llanerita de Guayana :?
-
Para cambiar el ciclo útil tú misma lo pusiste antes:
SET_PWM1_DUTY(ciclo_u);
-
Ahh entiendo, osea que tendría que escribir solo en la variable ciclo_u, a través del teclado?? ah o.k.... jejeje rayos!!! gracias muchachos... nos estamos viendo pronto!!! jejeje :-)
Atte: Enigma... La llanerita de Guayana :-)
-
Chamos otra pregunta....
Aja para configurar el Pwm, bueno he leido y me he encontrao con estás formulas:
Para el periodo de la PWM mejorada:
PWM periodo=[(PR2) + 1]*4*Tosc*(Preescaler del TMR2)
y para el ciclo útil:
PWM ciclo útil= (CCPR1L:CCP1CON<5:4>)*Tosc*(Preescaler del TMR2)
He sacado ambas cuentas para un cristal de 4Mhz, un preescaler de 4 y para 10 bits de resolución (1024)....
PWM periodo= 1024 seg.
PWM ciclo útil= 1024 seg.
Aja e aquí mi enredo.... como es esto...??? osea que el ciclo útil va a ser igual que el periodo....??? ahora es necesario, que el preescaler de ambas formulas tengan el mismo valor para poder sacar el ciclo útil y el periodo...? No verdad... Osea, como yo quiero un ciclo útil más grande podría colocar el preescaler en 16 para el periodo, y en 4 para el ciclo util?? o no??? o disminuyo el PR2 en el ciclo util para que este se haga menor que el periodo....
Esto me tiene enredada!!!! :? Ayuda por fa!!!!!
Atte: Enigma... La llanerita de Guayana :-)
-
Con esa fórmula has calculado el máximo valor que podría tomar el ciclo útil. En tu caso, podría ir de 0 a 1024 y, si le pones un valor más alto, será lo mismo que si le pones 1024.
Veámoslo gráficamente:
(http://www.societyofrobots.com/images/PWM.gif)
En ese gráfico la variable period equivale a tu fórmula PWM periodo. La variable pulse width equivale al PWM ciclo útil tuyo. Como ves, el pulse width puede tener cualquier valor entre 0 y period.
-
Si, vi un gráfico de esos y lo entendi, pero me enrede a la hora de aplicar las formulas.... Porque no se de quien depende mi ciclo util.... me explico... Osea, en la formula del ciclo útil, para modificarlo, moverlo, variarlo, lo hago con el preescaler o con el PR2?? es decir, quien de los dos se mantiene fijo, y quien de los dos se mueve??
Al igual que para el calculo del periodo, quien se mueve? el preescaler o los bits de resolución...?? de quien depende este??? :?
No se, si me explico??? :?
Atte: Enigma... La llanerita de Guayana :-)
-
Utiliza el mismo prescaler en ambos y en el Duty Cicle juega con CCPR1L:CCP1CON
-
Ahhh O.k... rayos!!!! :?
Atte: Enigma... La llanerita de Guayana :?
-
holas, te fijaste en mi ejemplo que te adjunte, ahi yo mantengo constante todo, lo unico qeu varia es el set_pwm1_duty(x)
y creo qeu hasta le puse osciloscopio, con los pulsadores incremetnas o decrementas el duty :mrgreen:
un saludo
-
Si, lo vi y lo simule.... pero tengo unas preguntas....
Porque tu variable count llega hasta 8??? sino, lo devuelvo hasta 7??, es un número arbitrario que le pusiste?? Y luego lo multiplicas por 32?? Porque por 32 exactamente!!!!?? :?
Y disculpa mi ignorancia!!!! :(
Atte: Enigma... La llanerita de Guayana :?
-
ahh peqeuños detalles, faciles de comprender :mrgreen:
count se encarga de contar los pulsos que se le de ya sea de inc o dec (incremetno o decremento), y yo lo limite a eso para poder ver solo 8 estados, ocho velocidades digamos, que se incremetan y decrementan con los pulsadores, lo de las condiciones a 7 y 0 es porque son mis limites, si ya estan 7 lo mantengo en 7 (cuando se incremente a 8 ) y lo mismo en el -1
ahora lo multiplico por 32 porque en el set_pwm1_duty(x); x debe ser de 8 bits para fijar el duty, osea 256 maximo 0 minino 128 mitad, nose si se entendio... entonces dividi 256 entre mis 8 estados posibles (por los pulsadores) y 256/8=32, de ahi esos numeros magicos :D claro que puedes hacer con otros valores para obtener mayor cantidad de "velocidades" (254/16=16, por ejemplo) o idear una mejor forma, ya que ahi tuve algunos problemillas con los limites superiores, porque no lo hice llegar a tope (osea duty=100%) :( habria que afinar eso, o como te dije si se te idea algo mejor seria genial :mrgreen:
-
Ahhhhhhhhhhh!!!!!! :D O.k... ya entendi!!!! jejeje naguara que ingenio!!! jejejee :-) ahora si está claro.... Bueno voy a empezar a programar el diseño que tengo que hacer y voy dando detalles jejeje :mrgreen: Porque se, que se me van a presentar dudillas!!! gracias Cryn!!! :D
Atte: Enigma... La llanerita de Guayana :-)
-
ok, qeu bueno que te sirva :mrgreen:
naguara que ingenio!!! jejejee Smile
Que significa naguara :?
:D :D
hay qeuremos ver tus avances, un saludo :mrgreen:
-
Que significa naguara
Jajajaja Naguara, es una expresión, depende de la forma que la digas tiene un significado; por ejemplo:
Expresión de Sorpresa:
Naguara!! :shock: nunca me imagine que ese parque seria tan grande!
Equivalente a decir: Rayos!, nunca me imagine que ese parque seria tan grande!
Expresión de tristeza:
Naguara! :( el proyecto nunca me funciono!
Equivalente a decir: Que malo, el proyecto nunca me funciono!!
Expresión de alegria
Naguara :D Más fino!!! todo el diseño me funciono chevere!!!
Equivalente a decir: Oye!! que fino me funciono chevere!
Naguara es una expersión del coloquio de la Ciudad de Barquisimeto, Edo. Lara - Venezuela... Pero yo siendo Guayanesa se me pego de un barquisimetano que la dijo!! jajaja :mrgreen:
PRONTO DARÉ AVANCES DEL PROYECTO!!! JEJEJE Y DUDAS! :mrgreen:
Atte: Enigma... La llanerita de Guayana :-)
-
ok entendido :D eso deberia estar en wikipedia :( no lo encontre :D
pero ahora con lo que dijiste si lo entendi :mrgreen:
y yo pensaba que me estabas insultando... :x ...... es broma
jajajaja :D :D :D
-
Jajaja para que veas que en wikipedia no se encuentra todo!!! jejeje :D
Atte: Enigma... La llanerita de Guayana :-)
-
Hola, chamos que tal como están... He vuelto con mis dudas!!! Miren, estouy tratando de configurar el PWM mejorado del PIC 18F4550, para hacer un cambio de giro de un motor y para aumentar y disminuir la velocidad del mismo... He pasado toda la noche en esto y no me funciona!!! las salidas del la PWM que deberian modular pues no lo hacen,... Lo he revisado y corrido un y otra vez, y pues nada, a ver si alguien le puede echar un ojito y darme su opinión, por favor.... :(
Por cierto, lo coloque en la PWm normal y pues si modula, pero cuando le coloco el FULL Bridge, que es el modo completo no hace nadita!!!!! :(
Aquí les voy a anexar el .C y el DSN....
Atte: Enigma... La llanerita de Guayana :-)
-
Hola Chamos que tal... Ya descubrimos un amigo y yo cual era el error!!!! No lo creeran, pero fue el Proteus!!!! jejeje al parecer la versión que tengo (7.2 SP0), no carga la PWM mejorado!!!! Monte el circuito en vida real y pues me funcionó cheverismo :lol:... Y pensar que me pudo haber funcionado anoche... Perdi toda una madrugada por culpa de Proteus... En fin, esto me lleva a una conclusión... No Confiar ciegamente en Proteus!!!!!!! Simular las cosas en vida real!!!! :mrgreen:
SEGUIRE DANDO DETALLES DE MI PROYECTO!!!! AHORA COLOCARÉ UNA NUEVA ETAPA!!!!
Atte: Enigma... La llanerita de Guayana :D
-
hola saludos, eso no se me hubiera pasado por la cabeza :shock: y yo que le estaba dando una hojeada a la hoja de datos :mrgreen:
que bueno que ya lo solucionaste, si cada vez hay que desconfiar mas del proteus :x
y donde esta el amigo?? :mrgreen:
un saludo
-
Jajaja creeme que a mi tampoco me pasó.... Pero dije bueno, vamos a probr, a ver que pasa, y cuando lo monte en el proto board... Santo remedio todo funciono.... :D... Lo único que me duele es wue Proteus me quito Horas y horas de sueño :x... Ahora lo que estoy haciendo es, comilando, quemando y probando,,, Cero Proteus! Me ha decepsionado mucho!!!! :(....
El amigo se fue para su casa!!!! jijijijiji :D
Ahora estoy adaptanto el teclado y los displays para ver el ciclo útil de la PWM y mdoficarlo via teclado!!!! Pronto doy avances y dudas!!! jejejeje :-/
Atte: Enigma... La llanerita de Guayana :-)
-
Hola Chamos que tal... Ya descubrimos un amigo y yo cual era el error!!!! No lo creeran, pero fue el Proteus!!!! jejeje al parecer la versión que tengo (7.2 SP0), no carga la PWM mejorado!!!! Monte el circuito en vida real y pues me funcionó cheverismo :lol:... Y pensar que me pudo haber funcionado anoche... Perdi toda una madrugada por culpa de Proteus... En fin, esto me lleva a una conclusión... No Confiar ciegamente en Proteus!!!!!!! Simular las cosas en vida real!!!! :mrgreen:
Atte: Enigma... La llanerita de Guayana :D
Bienvenida al club de los que se desvelaron por culpa del Proteus :mrgreen: :mrgreen: :mrgreen:
-
Bienvenida al club de los que se desvelaron por culpa del Proteus :mrgreen: :mrgreen: :mrgreen:
:shock: hay un club?? qeu se llama? "El Club de los desvelados" :D :D
yo tb quiero ser parte!!, jeje, pero por suerte no me he desvelado, pero si he pasado tardes enteras bobeando con el proteus :z)
en la pagina de este proteus hay algun documento que diga que hace y que no hace? nose como erratas o bugs?
-
Fuertemente Offtopic:
Naguará
una aproximación de lo que significa :
http://ar.answers.yahoo.com/question/index?qid=20070619055933AANGoSP
proviene de la ciudad de barquisimeto Estado Lara, y se usa en la región central y en el oriente según enigma :lol:
una vez oí que la frase provenia del los aborigenes, guará era la mujer y cuando estaba bien buena, la expresión de asombro era una guará, o que mujer tan hermosa, después se le aplicó el calificativo de expresión ó sorpresa.
-
con cada expresion que he visto en el foro, deberiamos hacer un tema para todo de eso :D :D :D :D ... es broma
peor es lo lindo cada pais tiene sus propios modismos, y cuando los oyes hablar a alguien te causa gracias :D y a hasta se te pega :D
-
Yo en mis proyectos utilizo el Proteus solo para probar algunas funciones (programo en C de CCS), pero al momento de hacer y probar bien la aplicacion, utilizo el ICD40 y descargo cada version al PIC sin desconectarlo siquiera.
Con este sistema, llegue a hacer unas diez versiones o mejoras en una hora, programando el PIC via ICD y probandolo tambien, haciendo DEBUG con el ICD...
Es muy buena opcion y no simulas nada, estas probando sobre el hardware real... :mrgreen:
-
ese icd es de microchip?? es muy caro? no creo que este disponible en todos los paise, pro qeu aqui no encuentro nada :(
-
Busca en el foro de programadores el ICD de Microchip, hay varios hilos con data, lo armas y en vez del cristal de 3.6864 MHZ colocale uno de 10 MHZ. Si no lo encuentras baja el manual del usuario del ICD1 de Microchip y alli esta el diagrama para fabricarlo... :)
El micro en vez de un PIC16F876 lo reemplazas por un PIC18F252.
El programa para ese micro te lo paso, cuando conectas el ICD en el entorno de CCS y le arrancas por primera vez, te dice que va a actualizar de version, le dices que si y cuando termina tienes el ICD40 funcionando!!! :mrgreen:
-
ok, gracias. Creo que el ICD usa un potenciometro digital?? ese donde lo consigo? microchip manda muestras de ese??
-
Ese que dices es el ICD2, la copia del ICD1 la puedes bajar desde aqui:
ICD1 (http://www.piclist.com/images/com/multimania/www/http/silicium31/Electronique/PIC/free_icd_en.htm)
El manual de usuario de ICD1 es este:
MPLAB ICD User Guide (http://rs363.rapidshare.com/files/85670165/Guia_del_Usuario_MPLAB_ICD.pdf)
Los archivos adjuntos son el esquematico completo para armarlo, los archivos necesarios para usar el ICD de Microchip en CCS (con el PIC16f876 y cristal 3,6864 Mhz), y por ultimo, el archivo para cargarle al PIC18F252 para usarlo a 40 Mhz (con cristal de 10 Mhz) convirtiendolo en ICD-40 para usarlo en CCS !!
-
y todos los firmware son gratuitos??
-
Las actualizaciones de firmware del CCS vienen con el mismo CCS, incluso si quieres manejar el ICD sin el entorno, puedes bajar el programa directo de la pagina de CCS... :mrgreen:
Bajar software ICD (http://www.ccsinfo.com/downloads.php)
-
este ultimo no lo entendi :( el ICD sin entorno? como es eso??
y es el mismo hardware tanto apra el 16f876 como para el 18f252?? solo hay que cambiar de cristal?, digamos que yo de momento tengo un 16f876a sirve? y despues quisiera actualizarlo al de 40MHz, hay algun jumper??
-
este ultimo no lo entendi :( el ICD sin entorno? como es eso??
Me refiero a que puedes bajar el programa solo para el manejo del ICD, te permite usarlo como programador In-Circuit y para arrancar y para un programa, ya para hacer DEBUG debes contar con el entorno de programacion de CCS...
y es el mismo hardware tanto apra el 16f876 como para el 18f252?? solo hay que cambiar de cristal?, digamos que yo de momento tengo un 16f876a sirve? y despues quisiera actualizarlo al de 40MHz, hay algun jumper??
Si por ahora no tienes un PIC18F252 y si tienes un PIC16F876, con el cristal de 3.6864 Mhz, le cargas el archivo icdboot.hex (del segundo archivo adjunto) y puedes usarlo asi, es mas lento pero funciona, solo te pregunta si quieres programar la linea 16 o linea 18, ya que debe cargar un firmware distinto si usas esta version.
Con el 18F252 no importa que linea utilizes, carga un solo firmware y anda mucho mas rapido... :mrgreen:
-
ok, pense que tenia ese valor de cristal, no lo tengo :( creo que talvez sea mas facil conseguir el pic18 :mrgreen:
una aclaracion, porfavor, el ccs se encargará de pasarle el firmware al pic una vez conectado el icd por 1ra vez?? o se lo debe pasar con otro programador?
-
Si usas el Pic18F252, deberas grabarle el archivo hex que se llama BootICD, el ultimo de los tres que puse, luego al conectarse el programa le actualizara el firmware, pidiendo permiso primero, ya que es muy educado... :D :D
-
ok, muchas gracias por la ayuda, ahora mismo no puedo dedicarme a armarme uno, pero en los siguientes dias qeu veinen me dedicare full a ello, pues seguramente es muy util y hace sentir bien :D
tu tienes armado el icd-40??? tiene algun componente mas qeu sea 'raro' digamos, en comparacion con otros programadores??
-
Lo que mas me costo conseguir siempre fue la inductancia de 330 uH, el resto normal... :D
-
:shock: caray, estaba haciendo fuerza para que no haya uno de esos :(
creo que tb me costará a mi conseguirla :(
ahi la buscare, un saludo, muchas gracias :mrgreen:
-
Hola Muchachos.... He vuelto, lamento la ausencia, es que este nuevo proyecto que estoy haciendo me está dando muuuuchos dolores de cabezas y muuuchos trasnochos!!! :?..... En fin....
Tengo un problema, muy bobo, tonto o como lo quieran llamar, pero es que de pana no veo el eror, por más que lo reviso, lo cambios, lo hago de nuevo no veo donde está el problema...
Es con una simple y sencilla rutina que me lee el teclado y la cifra leida me la muestra en displays!!, es decir si meto 50 en el teclado, ese 50 se tiene que visulaizar en los displays! Estoy haciendo está rutina puesto que necesito modificar el ciclo útil de la pwm via teclado y bueno para eso necesito guardar estos numeros y luego hacer que modifique el registro donde estableci el ciclo útil.... En fin, el hecho es que estoy haciendo la rutina de extracción de números desde el teclado solito, para que cuando me funcione adpatarlo al resto del programa con pwm y todo, ya que anteriormente probe todo junto y pues no me funciono, y ahora voy pasito a pasito :?.... El problema está es que el teclado no me funciona, probe este programita en proteus y en vida real y nada, siempre hace lo mismo, y no entiendo porque.... :x
Si se fijan en los archivos que les dejaré a continuación, pues pareciera que la rutina de teclado nunca es recorrida o no se... :(
En fin, si me pueden echar una manita se los agradezco.... Porque de pana no veo el error, por más que corro en frio el programa!!! :(
PD: Si existe un premio por mayor cantidad de trasnochos a causa del proteus.... pues creo que estoy entre los primertos lugares!!! :(... No aprendo, me he trsnochado cantidades de veces y aún no aprendo que no debo confiar en ese simulador!!!!
Dejo el .DSN y el .C
Atte: Enigma... La llanerita de Guayana
-
Bueno Enigma, te he retocado un poco el código (ya funciona con algún ligero error que ya veras). Pruébalo, estúdialo y si no entiendes algo lo preguntas por el foro que tendré mucho gusto en explicártelo.
Un saludo
-
Rayos no lo he podido descargar.... cuando lo guardo y lo abro me dice error!!!!! :(
Atte: Enigma... La llanerita de Guayana :(
-
Yo lo puedo descargar sin problemas.
Un saludo
-
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 :-)
-
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
-
: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 :-)
-
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
-
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)
-
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
-
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 :-)