Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: fercuetos en 17 de Octubre de 2006, 10:44:35
Título: control de bits con codewarrior
Publicado por: fercuetos en 17 de Octubre de 2006, 10:44:35
hola foreros estoy investigando para un proyecto sobre los microcontroladores motorola ahora llamado freescale. Tras ver las diferencias con los pic y el distinto juego de instrucciones me surge la duda de como controlar los bits de un registro en c.
El programa con que se programan estos micros es el codewarrior y aunque posee lenguaje C es el basico para programacion.
te interesaría saber como rotar un byte hacia izquierda o derecha.
muchas gracias por vuestra ayuda. ciao
Título: Re: control de bits con codewarrior
Publicado por: Geo en 17 de Octubre de 2006, 20:40:22
Para correr (shift) un bit a la derecha o izquierda utilizas los operadores de corrimiento de C: << y >>.
Código: C
// Corrimiento (shift) de 1 bit a la derecha
resultado = variable >>1;
Yo recién estoy utilizando estos microcontroladores, estoy usando un HC08 QY4, por ahora lo que supongo habría que hacer es realizar el corrimiento y checar si hay un acarreo en el registro de control (me parece que es el CCR) para así armar la rotación, aunque no he visto si dicho registro ya está definido en CodeWarrior o si hay que buscar su dirección.
Edit: -------------------------- Jaja, ahorita le eché un vistazo rápido a un documento de Freescale y me entero que hay 5 registros no se encuentran en el mapa de memoria, entre ellos el CCR. Así que para rotación por lo pronto sólo se me ocurre mejor utilizar ensamblador :D (repito, recién estoy utilizando este microcontrolador, a ver si alguien más nos aclara :P).
Saludos, JJ (Geo).
Título: Re: control de bits con codewarrior
Publicado por: jdhios en 11 de Octubre de 2007, 18:53:16
Hola Muchachos, para la rotacion en C si es que quieren que sea igual que en assembler hay que usar comparaciones: lo que escribio Geo >> es desplazamiento nada mas pero si ustedes quieren que el bit deplazado vuelva a entrar por el bit mas significativo, no hay instruccion en C que lo haga o sea tiene que hacerlo a pulmon. Primero checkear el bit menos significativo con una and, luego desplazar y luego poner en 1 o 0 el mas significativo de acuerdo a la comparacion anterior. Espero haber sido clar, sino les hago un ejemplo.
Saludos Jorge www.bairesrobotics.com.ar
Título: Re: control de bits con codewarrior
Publicado por: RICHI777 en 11 de Octubre de 2007, 19:24:11
Normalmente en los micros FreeScale ( Ex Motorola ) los registros no estan mapeados en memoria, estan implicitos en el OPCODE a ejecutar. Saludos !
Título: Re: control de bits con codewarrior
Publicado por: al303576RELOADED en 26 de Octubre de 2007, 13:52:24
Saludos.... mira si lo que quieres es hacer algo como el "BSF" de microchip pudes hacer un macro como el que te muestro a continuacion:
#define BitSetM(Register,Bit) Register|=(1<<Bit) //Macro to Set a single bit into a direct acces register #define BitClrM(Register,Bit) Register&=~(1<<Bit) //Macro to Clear a single bit into a direct acces register
y solo madar llamar los macros como te muestro a continuacion:
BitClrM(PTBD,0); //limpia el bit 0 del PTBD BitSetM(PTBDD,0);//Activa el bit o del PTBDD
estos macros solo fucnionan con los registros de acceso directo osea los que estan en las primeras direcciones del mapa de memoria (HCS08 bueno solo los he probado en esos)
Ahora que si lo que quieres es activar a limpiar un bit de un registro que no esta en las direcciones de acceso rapido lo que tienes que hacer es lo siguiente:
por ejemplo si deceas activar el bit 4 del registro PTAD. Bueno pues lo que tienes que hacer es un OR con dicho registo y el valor que activa ese bit... mira eso quedaria de la sigueinte manera
PTAD|=0x10;
y listo ahora que si lo que quieres es limpiar un bit de un registo pues puede hacer lo siguiente, (limpiar el bit 4 del registro PTAD)
PTAD&=~(0x10);
si tienes alguna duda por aca estoy.... bye....
Título: Re: control de bits con codewarrior
Publicado por: jdhios en 17 de Noviembre de 2007, 14:00:34
Hola Gente: En todos los casos de duda con CodeWarrior, lo mejor es ir a opciones del compilador y tildar en la solapa output -> make a listing con lo cual obtendran un listado en assembler. Cada linea de C es traducida a assembler. Asi pueden verificar si lo que hacen en C es lo que quisieran hacer en asm
Saludos Jorge Miguel Dhios www.bairesrobotics.com.ar www.marketingenlared.com.ar