Autor Tema: PortDataOutputRegister (PDOR) Vs. PortSetOutputRegister (PSOR)  (Leído 309 veces)

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

Desconectado mojo

  • PIC10
  • *
  • Mensajes: 23
PortDataOutputRegister (PDOR) Vs. PortSetOutputRegister (PSOR)
« en: 11 de Enero de 2017, 18:12:39 »
Hola,

estoy leyendo documentación sobre los puertos de entrada y salida de una placa ARM. La duda viene al ver que en un ejemplo para activar una salida (por ejemplo encender un led), pone a 1 el bit correspondiente al pin que interesa en el registro PDOR.

Recuerdo haber hecho alguna práctica en la cual para activar un pin de salida, utilizaba el registro PSOR en lugar del PDOR. Y leyendo algo sobre el tema no logro entender la diferencia entre ellos.

A ver si alguien sabe algo sobre el tema jeje

Saludos  8)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6116
Re:PortDataOutputRegister (PDOR) Vs. PortSetOutputRegister (PSOR)
« Respuesta #1 en: 11 de Enero de 2017, 18:37:28 »
Tenes que especificar el fabricante si es un microcontrolador. Por que ARM es el propietario del nucleo, todo lo demas que lo rodea es propiedad de otro fabricante.

Por ejemplo para que tengas una idea. Estos son los registros que componen los I/O de Tiva de TI:

Citar
0x000 GPIODATA RW 0x0000.0000 GPIO Data 759
0x400 GPIODIR RW 0x0000.0000 GPIO Direction 760
0x404 GPIOIS RW 0x0000.0000 GPIO Interrupt Sense 761
0x408 GPIOIBE RW 0x0000.0000 GPIO Interrupt Both Edges 762
0x40C GPIOIEV RW 0x0000.0000 GPIO Interrupt Event 763
0x410 GPIOIM RW 0x0000.0000 GPIO Interrupt Mask 764
0x414 GPIORIS RO 0x0000.0000 GPIO Raw Interrupt Status 765
0x418 GPIOMIS RO 0x0000.0000 GPIO Masked Interrupt Status 767
0x41C GPIOICR W1C 0x0000.0000 GPIO Interrupt Clear 769
0x420 GPIOAFSEL RW - GPIO Alternate Function Select 770
0x500 GPIODR2R RW 0x0000.00FF GPIO 2-mA Drive Select 772
0x504 GPIODR4R RW 0x0000.0000 GPIO 4-mA Drive Select 773
0x508 GPIODR8R RW 0x0000.0000 GPIO 8-mA Drive Select 774
0x50C GPIOODR RW 0x0000.0000 GPIO Open Drain Select 775
0x510 GPIOPUR RW - GPIO Pull-Up Select 776
0x514 GPIOPDR RW 0x0000.0000 GPIO Pull-Down Select 778
0x518 GPIOSLR RW 0x0000.0000 GPIO Slew Rate Control Select 780
0x51C GPIODEN RW - GPIO Digital Enable 781
0x520 GPIOLOCK RW 0x0000.0001 GPIO Lock 783
0x524 GPIOCR - - GPIO Commit 784
0x528 GPIOAMSEL RW 0x0000.0000 GPIO Analog Mode Select 786
0x52C GPIOPCTL RW - GPIO Port Control 787
0x530 GPIOADCCTL RW 0x0000.0000 GPIO ADC Control 789
0x534 GPIODMACTL RW 0x0000.0000 GPIO DMA Control 790
0x538 GPIOSI RW 0x0000.0000 GPIO Select Interrupt 791
0x53C GPIODR12R RW 0x0000.0000 GPIO 12-mA Drive Select 792
0x540 GPIOWAKEPEN RW 0x0000.0000 GPIO Wake Pin Enable 793
0x544 GPIOWAKELVL RW 0x0000.0000 GPIO Wake Level 795
0x548 GPIOWAKESTAT RO 0x0000.0000 GPIO Wake Status 797
0xFC0 GPIOPP RO 0x0000.0001 GPIO Peripheral Property 799
0xFC4 GPIOPC RW 0x0000.0000 GPIO Peripheral Configuration 800
0xFD0 GPIOPeriphID4 RO 0x0000.0000 GPIO Peripheral Identification 4 803
0xFD4 GPIOPeriphID5 RO 0x0000.0000 GPIO Peripheral Identification 5 804
0xFD8 GPIOPeriphID6 RO 0x0000.0000 GPIO Peripheral Identification 6 805
0xFDC GPIOPeriphID7 RO 0x0000.0000 GPIO Peripheral Identification 7 806
0xFE0 GPIOPeriphID0 RO 0x0000.0061 GPIO Peripheral Identification 0 807
0xFE4 GPIOPeriphID1 RO 0x0000.0000 GPIO Peripheral Identification 1 808
0xFE8 GPIOPeriphID2 RO 0x0000.0018 GPIO Peripheral Identification 2 809
0xFEC GPIOPeriphID3 RO 0x0000.0001 GPIO Peripheral Identification 3 810
0xFF0 GPIOPCellID0 RO 0x0000.000D GPIO PrimeCell Identification 0 811
0xFF4 GPIOPCellID1 RO 0x0000.00F0 GPIO PrimeCell Identification 1 812
0xFF8 GPIOPCellID2 RO 0x0000.0005 GPIO PrimeCell Identification 2 813
0xFFC GPIOPCellID3 RO 0x0000.00B1 GPIO PrimeCell Identification 3 814

Estos de un STM32F030

Citar
GPIOx_MODER
GPIOx_OTYPER
GPIOx_OSPEEDR
GPIOA_PUPDR
GPIOA_IDR
GPIOA_ODR
GPIOA_BSRR
GPIOA_LCKR
GPIOA_AFRL
GPIOA_AFRH
GPIOA_BRR

Y asi podemos seguir buscando mas.

EDITO: Parece ser que estas usando un Kinetis de Freescale.

Buscando un algun Cortex-M4 como la flia K60, en su reference manual, tenes que:

GPIOx_PDOR = Port Data Output Register
GPIOx_PSOR = Port Set Output Register
GPIOx_PCOR = Port Clear Output Register
GPIOx_PTOR = Port Toggle Output Register

¿ Cuales son las diferencias entre uno y otro ?  En si el estado de las salidas siempre esta en PDOR, la logica seria cambiar estos mismos, pero como sabes al usar ASM, para cambiarlo tenes que llevarlo a uno de los registros internos, cambiarlo y luego escribirlo, esto no solo involucra tiempo ya que tenes que cargar- modificar - guardar, sino que ademas si hay alguna interrupcion que tambien cambie el estado del puerto, puede ocurrir que termines eliminando lo ocurrido de la interrupcion, me explico con un ejemplo de 8 bits:

Tomo del puerto el valor 0x10
Lo cambio a 0x30
----- Ocurre interrupcion, en la interrupcion tomo el puerto 0x10, cambio a 0x11, guardo y salgo. Aca el puerto esta en 0x11
Continuando, Procedo a guardar el nuevo valor, el puerto me queda en 0x30 y no en 0x31.

Como solucionas eso? podes usar los otros 3 registros. Tenes un registro para Set, uno para Clear, uno para Toggle.
En cualquiera el bit escrito con 0 no produce cambios en PDOR, volviendo a otro ejemplo.... esto ocurriria:

PDOR = 0b1010 1010
Envio a PSOR = 0b0000 0001, PDOR queda 0b1010 1011
Envio a PCOR = 0b1000 0000, PDOR queda 0b0010 1011
Envio a PTOR = 0b0000 1111, PDOR queda 0b0010 0100

Ahora si quisiera hacer el mismo ejemplo que antes con la interrupcion, ya no tendria problemas a no ser que ambos cambien el mismo pin.
¿Es insensato usar PDOR? No, si no tuviera el caso de la interrupcion, tranquilamente lo podria usar. Todo depende de lo que se intente hacer.
De todas formas todos los fabricantes ya de ARM proveen algo de este estilo, en los STM se llaman BRR y BSRR, TI no posee un registro directo, sino que lo hace a traves la direccion de acceso y con este produce una especie de "mascara", lo cual podes setear y limpiar cualquier bit.

En fin todo esto es para tratar de eleminar la operacion read-modify-write que se usa comunmente.
« Última modificación: 11 de Enero de 2017, 18:46:16 por KILLERJC »

Desconectado mojo

  • PIC10
  • *
  • Mensajes: 23
Re:PortDataOutputRegister (PDOR) Vs. PortSetOutputRegister (PSOR)
« Respuesta #2 en: 11 de Enero de 2017, 19:05:14 »
Hola, efectivamente debería haber especificado más la placa. Ahora mismo no tengo la que estuve usando últimamente pero era una Freescale KL46z algo así...

Los registros GPIO que tenía eran esos que tu comentas para la K60, y alguno más, pero los que me interesan ahora son esos.

Entonces, lo que propones es que da igual como se active un pin: puedes hacerlo con PTOR, PDOR, PSOR... La cuestión es hacerlo con cuantos más mejor, para así intentar no modificar el mismo a la vez y que se pierdan cambios.

Espero haber entendido bien la explicación.

Saludos  :)

Desconectado mojo

  • PIC10
  • *
  • Mensajes: 23
Re:PortDataOutputRegister (PDOR) Vs. PortSetOutputRegister (PSOR)
« Respuesta #3 en: 11 de Enero de 2017, 19:15:28 »
En mi mensaje anterior estaba equivocado...

¡¡Acabo de entenderlo!!

PDOR es el registro donde figuran todos los pines activados y desactivados. Si quieres activar el pin 5 por ejemplo, meterías en PSOR 0b00100000, pero aunque en PSOR los demás bits sean 0 y sólo sea 1 el bit 5, no quiere decir que los demás pines estén apagados... Es en PDOR donde se ve realmente cuales están encendidos y apagados. PSOR, PTOR, PCOR,... simplemente son como registros "intermediarios" que cuando puedan transmitirán la información a PDOR, haciendo por ejemplo:

PDOR |= PSOR

Podemos modificar directamente PDOR, pero como tu dices, puede haber otro thread haciendo lo mismo y al final la información de uno de los dos se perderá (la del que termine primero).

Vale, ahora creo que sí lo he entendido.

Antes no me había fijado bien en esto:

PDOR = 0b1010 1010
Envío a PSOR = 0b0000 0001, PDOR queda 0b1010 1011
Envío a PCOR = 0b1000 0000, PDOR queda 0b0010 1011
Envío a PTOR = 0b0000 1111, PDOR queda 0b0010 0100

Saludos y muchas gracias.
« Última modificación: 11 de Enero de 2017, 20:41:45 por mojo »