Autor Tema: control de bits con codewarrior  (Leído 5842 veces)

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

Desconectado fercuetos

  • PIC10
  • *
  • Mensajes: 4
control de bits con codewarrior
« 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

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: control de bits con codewarrior
« Respuesta #1 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
  1. // Corrimiento (shift) de 1 bit a la derecha
  2. 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).
« Última modificación: 17 de Octubre de 2006, 20:43:49 por Geo »
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado jdhios

  • PIC10
  • *
  • Mensajes: 22
    • BairesRobotics
Re: control de bits con codewarrior
« Respuesta #2 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

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: control de bits con codewarrior
« Respuesta #3 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 !

Desconectado al303576RELOADED

  • PIC10
  • *
  • Mensajes: 11
Re: control de bits con codewarrior
« Respuesta #4 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....


Desconectado jdhios

  • PIC10
  • *
  • Mensajes: 22
    • BairesRobotics
Re: control de bits con codewarrior
« Respuesta #5 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


 

anything