set_tris_b(0B111000); // configuro i_o
int8 val=7;
portb=val; struct { int8 b02:3 ; int8 b35:3 ;} port ; // Declaro la estructura de "port"
#byte port = 6 // La mapeo en la dirección de PORTB
void main(void)
{
int8 p = 0x93 ;
port.b02 = 0x93 ; // Escribe 3 en b0,b1,b2
// ignora el resto
port.b35 = 0x93 ; // Escribe 3 en b3,b4,b5
// ignora el resto
port.b02 = p ; // Se generan las instrucciones
// necesarias para escribir
// 3 en b0,b1,b2
port.b35 = p ; // Se generan las instrucciones
// necesarias y los desplazamientos
// para escribir 3 en b3,b4,b5
}
Otra manera es por medio de estructuras.Código: [Seleccionar]struct { int8 b02:3 ; int8 b35:3 ;} port ; // Declaro la estructura de "port"
#byte port = 6 // La mapeo en la dirección de PORTB
void main(void)
{
int8 p = 0x93 ;
port.b02 = 0x93 ; // Escribe 3 en b0,b1,b2
// ignora el resto
port.b35 = 0x93 ; // Escribe 3 en b3,b4,b5
// ignora el resto
port.b02 = p ; // Se generan las instrucciones
// necesarias para escribir
// 3 en b0,b1,b2
port.b35 = p ; // Se generan las instrucciones
// necesarias y los desplazamientos
// para escribir 3 en b3,b4,b5
}
yo obtendría primero un modulo a 7 del numero que le vas a enviar al puerto b
Luego haces XOR al valor actual del puerto b con el modulo obtenido.
por ejemplo:Código: C
int8 numero; portb = 0b111000 ^ (numero % 7);
El problema del codigo anterior es que borra todo lo que tenia. A vos te interesa dejar lo que tiene el PORTB, imagino que debido a que posiblemente tengas varias salidas
Pero tambien y lo mas comun es hacer esto:Código: C
int8 numero; portb = (portb & 0b111000) | (numero & 0b000111);
Si estas seguro de que numero no supera los 3 bits, entonces se reduce a:Código: C
portb = (portb & 0b111000) | numero;
Respecto a que sea por CCS, tendras que leer con input_b() y output_b() para escribir, siempre y cuando uses el FAST_IO, sino el mismo compilador te lo cambia a entrada o salida por mas que explicites con el set_tris_x
...este simbolo "^" a que equivaldria en ccs?
% seria residuo?
aquí seria hacer una and y luego una or? así lo entiendo cual seria el objetivo de hacer primero una and al puerto?
entiendo que al declarar #fast_io, no importa como se pregunte o escriba en un pin, no cambia el tris como lo haría en standard_io. o estoy equivocado?
....
lo anterior es valido en CCS?
luego hago otra and a numero con el puerto b, pero colocando 1 los bits que si deseo modificar.
(numero & 0b000111)
Todo lo demas que supere esos bits deseo que NO esten, por lo tanto al hacer la AND, si numero era 0b111101 me va a quedar: 0b000101
Finalmente la OR que une los 2 numeros y actualizo el PORTB con el nuevo valor
0b101000 OR 0b000101 = 0b101101
PORTB viejo: 0b101011
PORTB nuevo: 0b101101.Código: C
int8 numero;
portb = (portb & 0b111000) | (numero & 0b000111);
Si estas seguro de que numero no supera los 3 bits, entonces se reduce a:
Código: C
portb = (portb & 0b111000) | numero;
Respecto a que sea por CCS, tendras que leer con input_b() y output_b() para escribir, siempre y cuando uses el FAST_IO, sino el mismo compilador te lo cambia a entrada o salida por mas que explicites con el set_tris_x,cordial saludo,
aquí me confundo si lo hago "XOR" me dan las tablas de verdad pero con "OR" no
por ultimo a continuación,, me dicen que si estoy seguro de no superar los 3 bits lo haga así resumido, entonces cuando se debe hacer con los demás pasos.
Citarcordial saludo,
aquí me confundo si lo hago "XOR" me dan las tablas de verdad pero con "OR" no
La tabla de verdad de la OR es muy sencilla, si tenes algun 1, queda 1.
0b101000
0b000101
-----------
0b101101
Si observas donde existia un 1, queda el 1.... O... unicamente es 0 si ambos bits de esa posicion son cero.Citarpor ultimo a continuación,, me dicen que si estoy seguro de no superar los 3 bits lo haga así resumido, entonces cuando se debe hacer con los demás pasos.
Cuando sabes que numero jamas va a ser 8 o mayor... ya que el 8 en binario es 0b1000. Si tu programa permite que esto ocurra necesitas usar la AND para limitarlo a los bits que deseas cambiar... Si vos sabes que no vas a pasar de 7, es decir de 0 a 7. No necesitas la AND porque siempre vas a tener maximo 3 bits con 1, y todos los demas de mayor peso serian 0.
...este simbolo "^" a que equivaldria en ccs?
% seria residuo?yo obtendría primero un modulo a 7 del numero que le vas a enviar al puerto b
Luego haces XOR al valor actual del puerto b con el modulo obtenido.
por ejemplo:Código: C
int8 numero; portb = 0b111000 ^ (numero % 7);