Autor Tema: crear un registro de la union de dos puertos  (Leído 1924 veces)

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

Desconectado ricardinjo

  • PIC10
  • *
  • Mensajes: 15
crear un registro de la union de dos puertos
« en: 05 de Abril de 2022, 14:18:10 »
Buenas tardes y gracias de antemano, se puede crear un registro o un puerto ficticio en cual este compuesto por ejemplo por el puerto A (solo parte alta) y puerto B (solo parte baja)? o por ejemplo coger 2 pines del puerto A, 3 del puerto B y 3 del puerto C?

Algo asi:
#define PORTconf1 DDRA&0xF0 | DDRB&0x0C | DDRC&0x03
#define PORTconf2 DDRA&0xF0 | DDRB&0x0C | DDRC&0x03
#define PORTin   PINA&0xF0 | PINB&0x0C | PINC&0x03
#define PORTout PORTA&0x0F | PORTD&0xF0

Se que asi no se hace pero es para explicarme.
No se si me he explicado bien, esto se puede hacer?
Un saludo.
PD: Estoy con MPLABX y XC8 con Atmega328 pero tambien seria interesante para PICs supongo que de poderse hacer seria similar.
« Última modificación: 06 de Abril de 2022, 03:38:37 por ricardinjo »

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:crear un registro de la union de dos puertos
« Respuesta #1 en: 05 de Abril de 2022, 16:17:09 »
Buenas tardes y gracias de antemano, se puede crear un registro o un puerto ficticio en cual este compuesto por ejemplo por el puerto A (solo parte alta) y puerto B (solo parte baja)? o por ejemplo coger 2 pines del puerto A, 3 del puerto B y 3 del puerto C?

Algo asi:
#define PORTconf1 DDRA&0xF0 | DDRB&0x0C | DDRC&0x03
#define PORTconf2 DDRA&0xF0 | DDRB&0x0C | DDRC&0x03
#define PORTin   PINA&0xF0 | PINB&0x0C | PINC&0x03
#define PORTout PORTA&0x0F | PORTD&0xF0

Se que asi no se hace pero es para explicarme. Necesito poder poner por ejemplo
No se si me he explicado bien, esto se puede hacer?
Un saludo.
PD: Estoy con MPLABX y XC8 con Atmega328 pero tambien seria interesante para PICs supongo que de poderse hacer seria similar.

Me parece que si se puede. podrías ir a donde está creado, por ejemplo PORTAbits (clic derecho sobre eso y escoger "ir a definición") y puedes ver como está creado la estructura de ese registro con sus bits.

Podrías tomar de referencia eso y crear tu propio puerto.

Sería algo así MiPuerto.bit0 sería un bit del PortB y MiPuerto.bit7 sería  un bit de PortA, etc.

Me parece que vi alguna vez eso en algún código.

¿La pregunta es porque lo necesitas hacer?

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ricardinjo

  • PIC10
  • *
  • Mensajes: 15
Re:crear un registro de la union de dos puertos
« Respuesta #2 en: 05 de Abril de 2022, 16:23:13 »
Lo he intentado con struct pero no consigo hacerlo.
Pues lo quiero hacer por qué estoy diseñando una placa en la que tiene un conector de 8 pines y cada pin va a un puerto distinto. Si consigo hacer lo que he puesto antes puedo controlar el conector de la placa como si fuese un puerto de microcontrolador.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:crear un registro de la union de dos puertos
« Respuesta #3 en: 05 de Abril de 2022, 16:27:01 »
Lo he intentado con struct pero no consigo hacerlo.
Pues lo quiero hacer por qué estoy diseñando una placa en la que tiene un conector de 8 pines y cada pin va a un puerto distinto. Si consigo hacer lo que he puesto antes puedo controlar el conector de la placa como si fuese un puerto de microcontrolador.

Podrías hacer una función donde realizas ese proceso de activar y desactivar los bits de cada puerto. Algo así:

Código: C
  1. void miPuerto (unsigned char valor)
  2. {
  3.     if (0x01 & valor)
  4.     {
  5.        PortBbits.bit0 = 1;
  6.     }
  7.     else
  8.    {
  9.      PortBbits.bit0 = 0;
  10.    }
  11.     if (0x02 & valor)
  12.     .... etc
  13. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:crear un registro de la union de dos puertos
« Respuesta #4 en: 05 de Abril de 2022, 16:35:30 »
No, no se puede hacer lo que estas planteando.

Lo mas próximo es crear una función como te lo plantearon. Si vas a necesitar la parte alta y baja como comentaste entonces quedaría

Código: C
  1. void escribirmipuerto(uint8_t valor) {
  2.   PORTA = (PORTA & 0xF) | ( valor &0xF0);
  3.   PORTB = (PORTB & 0xF0) | ( valor &0xF);
  4. }
  5.  
  6. uint8_t leermipuerto(void) {
  7.   return (PORTA & 0xF0) | (PORTB & 0xF);
  8. }

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:crear un registro de la union de dos puertos
« Respuesta #5 en: 05 de Abril de 2022, 16:45:05 »
Lo he intentado con struct pero no consigo hacerlo.
Pues lo quiero hacer por qué estoy diseñando una placa en la que tiene un conector de 8 pines y cada pin va a un puerto distinto. Si consigo hacer lo que he puesto antes puedo controlar el conector de la placa como si fuese un puerto de microcontrolador.

Yo lo he realizado con Harmony y XC32 de esta manera. No se si es lo que estás buscando y sea útil:

Código: C
  1. void apagarSalidas(void)
  2. {
  3.  for(i = 0x00; i < 0x08; i++)
  4.  {
  5.    PLIB_PORTS_PinWrite(PORTS_ID_0,puertoSalidaFisica[i],bitsSalidasFisicas[i],0x00); //Salida Física
  6.  }
  7. }

Código: C
  1. static const PORTS_BIT_POS bitsSalidasFisicas[] =
  2. {
  3.     PORTS_BIT_POS_2,
  4.     PORTS_BIT_POS_2,
  5.     PORTS_BIT_POS_9,
  6.     PORTS_BIT_POS_1,
  7.     PORTS_BIT_POS_8,
  8.     PORTS_BIT_POS_10,
  9.     PORTS_BIT_POS_5,
  10.     PORTS_BIT_POS_15
  11. };
  12.  
  13. static const PORTS_CHANNEL puertoSalidaFisica[] =
  14. {
  15.     PORT_CHANNEL_F,
  16.     PORT_CHANNEL_B,
  17.     PORT_CHANNEL_B,
  18.     PORT_CHANNEL_B,
  19.     PORT_CHANNEL_B,
  20.     PORT_CHANNEL_B,
  21.     PORT_CHANNEL_E,
  22.     PORT_CHANNEL_B        
  23. };

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado ricardinjo

  • PIC10
  • *
  • Mensajes: 15
Re:crear un registro de la union de dos puertos
« Respuesta #6 en: 06 de Abril de 2022, 03:36:13 »
Gracias por vuestras respuestas, usare una función como habéis dicho.
Un saludo.