Se puede usar dos registros o variables de 8 bit en una variable de 16 bits?

En el caso de que los registros sean consecutivos, en este caso Porta A y B, el CCS permite crear lo siguiente:

Código:
//Placa entrenadora PicEBasic (PIC16F88)
//Test puerto RS232, LCD, I/O
#include <16F88.h>
#device adc=10
#use delay(internal=8000000)
//#use delay (clock = 20000000) //Reloj a 20Mhz
//#FUSES HS         //Fast clock
#fuses NOMCLR
#FUSES PUT        //Power-up Timer
#FUSES BROWNOUT   //Brown-out reset 
#FUSES NOWDT      //No, Watchdog Timer 
#FUSES NOCPD      //No, Data EEPROM Memory Code Protection
#FUSES NOPROTECT  //No, (CP) Flash Program Memory Code Protection
#FUSES NOLVP      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#BYTE PORTA = 0x05
#BYTE PORTB = 0x06
#BYTE TRISA = 0x85 
#BYTE TRISB = 0x86
#BYTE PIR1 = 0x0C

#Include "_FunctionesTmrBase.h"
#Include "DISPLAY 7SEGMENTOS 4 DIGITOS.h"
//#include "Flex_Lcd.c"
//#use rs232 (UART1, BAUD = 4800, PARITY=N, BITS=8, TIMEOUT=1)

#use fast_io (a)
#use fast_io (b)
//#use fast_io (c)

void main(){
   Setup_adc_ports(NO_ANALOGS);
   TRISA = 0b00000000;
   TRISB = 0b00000000;
   PORTB = 0b00000000;
   PORTA = 0b11010000;
   

   struct MyPort {
      Unsigned Int16 PORTAB;
   };
      
   struct MyPort *pPORTAB = &PORTA; //Apunta al puerto A, que será el Byte menos significativo del nuevo puerto unión Port A y B.
 
   while(true) {
          
      pPORTAB -> PORTAB = 0b1000000011111010; //Asigna valor al nuevo puerto. 
      
   }
}

Se crea un STRUCT con un registro de 16Bits.
Se crea un puntero de esa estructura que apunta a la dirección menos significativa, en este caso el Puerto A y listo, ya tenemos un tipo de dato nuevo que trabaja sobre los dos puertos A y B, siendo el puerto A el byte menos significativo y el Puerto B el Byte más significativo del nuevo registro creado de 16bits.
 
Última edición:
Sería más fácil apuntar a la dirección:

PHP:
...
uint16_t var_dst;
...
  var_dst=*(uint16_t *)(PORTA); //La operación implica tomar 2 bytes al que apunta la dirección PORTA (es decir un byte será PORTA y el otro PORB) y almacenarlos en la variable var_dst
...

Aunque la ventaja de usar esa estructura es darle un nombre y una forma más elegante.
 
Última edición:
Hola:

Con un dsPIC de 16 bits a lo mejor puedes hacerlo, y con PIC32 de 32 bits, puedes hacer hasta 4 veces 8 bit de una pasada. Esto en Teoría.

¿Realmente se podrá?

Saludos.
 
Última edición:
yo opino que si

lo que pasa es que digamos que tenemos un int32.

y queremos reflejar esos 4 bytes en diferentes lados no se un DAC, un puerto , o un char

¿como se le hace para separar?

tan simple como recortar el registro en bytes

y despues se empezaron a arrancar el cabello usando funciones estructura y union
 
.
.
.
y despues se empezaron a arrancar el cabello usando funciones estructura y union

El tema no está en complicarse la vida, el mostrar las distintas opciones de hacer una misma tarea es para que el que pregunta vea las opciones posibles. De esta manera si el que pregunta pensaba que hay un método directo, pues realmente puede ver que no. Si no hay una instrucción en lenguaje máquina que haga esto, está claro que un lenguaje de alto nivel tampoco lo puede hacer. Esta tarea se lleva código intermedio y el lenguaje en este caso C, lo que hace mediante el uso de un método u otro es tapar este código intermedio que hay que incorporar para realizar la tarea deseada.

El que se publique un método por un usuario, no implica que en la realidad en un momento dado lo utilice, en mi caso yo siempre opto por el más simple y tradicional. Pero insisto, el mostrar los distintos métodos estás indicándole al que pregunta, ¡oye! no hay un método mágico, esto es lo que se puede hacer.
 
si hay muchos pero terminan por arrancarse el cabello
bueno si es que aun hay cabello por arrancar.

esta el metodo simple de cortar la variable de 16 bits en 2 con rotacion y mascaras
que tambien esta la de union

la opcion la da el programador
 
Atrás
Arriba