Lectura de un pin como entrada en AVR XMEGA

He estado jugando con la línea XMEGA de AVR . Son microcontroladores bastante sorprendentes. Sin embargo, Atmel cambió mucho con esta nueva línea. Estoy tratando de detectar un pin bajando.

He intentado configurar el PINnCTRLregistro para cada combinación sin suerte. Puedo detectar que el pin va ALTO pero no al revés. A continuación se muestra el código de trabajo para encender el LED en el pin 5 cuando el pin 6 está alto. Sin embargo, quería hacer lo mismo, solo que en lugar de cuando el pin 6 sube, me gustaría que el pin 6 bajara y encendiera el LED en el pin 5.

De todos modos, no he visto muchas cosas de XMEGA aquí, así que pensé en intentarlo.

Estoy usando AVR Studio y el microcontrolador ATXmega256A3 .


Tabla de registro de configuración de AVR PINnCTRL (al menos para las secciones extraíbles 0b00xxx000) HOJA DE DATOS COMPLETA AQUÍ: http://www.atmel.com/dyn/resources/prod_documents/doc8077.pdf .

En la página 131 (sección 13.4) se enumera la definición de toda la tabla a continuación. NOTA: el registro PINxCTRL contiene más que solo los menús desplegables para la configuración. Los bits con los que estoy trabajando son estos: 00xxx000 Las x corresponden con el listado a continuación.

Table 13-4. Output/Pull Configuration
                                                          Description
  OPC[2:0]  Group Configuration       Output configuration        Pull configuration
     000    TOTEM                     Totempole                   (N/A)
     001    BUSKEEPER                 Totempole                   Bus keeper
     010    PULLDOWN                  Totempole                   Pull-down (on input)
     011    PULLUP                    Totempole                   Pull-up (on input)
     100    WIREDOR                   Wired OR                    (N/A)
     101    WIREDAND                  Wired AND                   (N/A)
     110    WIREDORPULL               Wired OR                    Pull-down
     111    WIREDANDPULL              Wired AND                   Pull-up

#include <stdio.h>
#include <avr\io.h>
#define F_CPU 32000000UL
#include <util\delay.h>

void Config32MHzClock(void);

int main(void)
{
    //Init stuff..
    Config32MHzClock();
    CLK.PSCTRL = 0x00; // No division on peripheral clock.
    PORTCFG.CLKEVOUT = PORTCFG_CLKOUT_PE7_gc;

    PORTA.DIR = (1 << 5);  //Sets pin5 as an output (led)

    //011 PULLUP Totempole Pull-up (on input) is what is set
    PORTA.PIN6CTRL = (0x30);  //Sets pullup on input on pin 6.
    PORTA.OUT = (1<<5);       //Turn on the LED

    while(1){                   //Never ending main loop.
        if (PORTA.IN & (1<<6))  //If pin 6 goes HIGH.
            PORTA.OUT = (0x00); //Turn off LED.

        PORTA.OUT = (1 << 5); //Turn LED back on.
    }
}

//Function to setup clock..
void Config32MHzClock(void)
{
    CCP = CCP_IOREG_gc; //Security signature to modify clock
    // Initialize clock source to be 32 MHz internal oscillator (no PLL).
    OSC.CTRL = OSC_RC32MEN_bm; // Enable internal 32 MHz oscillator.
    while(!(OSC.STATUS & OSC_RC32MRDY_bm)); // Wait for oscillator ready
    CCP = CCP_IOREG_gc; //Security signature to modify clock
    CLK.CTRL = 0x01; //Select sysclock 32 MHz oscillator
};
¿Qué prueba lógica está usando para detectar (sin éxito) que el pin 6 está bajo? Además, ¿puedes detectar el pin bajando con un multímetro o alcance? ¿Podría necesitar una resistencia desplegable?
Para las pruebas de lógica, acabo de usar ~ . Por lo tanto, si (PORTA.IN & ~(1<<6)) Modo desplegable = 010, lo he intentado, pero quizás mi ~(1<<6) sea la forma incorrecta de leer esto. No he probado esto en un multímetro. Lo haré cuando llegue a casa. ¿Eso ayuda?
Mi instinto inicial fue como dijo pingswept, verifique si necesita una resistencia desplegable.
@ril3y: no desea usar (PORTA.IN & ~(1 << 6)). Eso sería como (PORTA.IN & 0xBF), lo cual será cierto si cualquier pin, excepto el pin 7, está alto. Creo que lo que quisiste probar es !(PORTA.IN & (1 << 6))
¿Cómo acceder directamente al Pin para leer o escribir datos? Si quiero escribir datos en pin6, ¿cómo puedo hacerlo? O quiero leer datos de un pin específico. Gracias.

Respuestas (1)

Hay algunas preocupaciones que tengo.

1) A menos que comience a contar pines desde 0, (1 << 5) es en realidad el pin 6.

2) De acuerdo con el código, el pin 6 en estado alto hace que el LED se apague.

3) Inmediatamente después de apagar el LED, lo vuelves a encender. Volver a encenderlo probablemente debería estar en un bloque else.

4) Esta parte de tu pregunta es confusa.

Quería hacer lo mismo solo que cuando el pin6 sube, me gustaría que el pin 6 bajara y encendiera el LED en el pin5.

La razón por la que es confuso es porque dices que el pin 6 es una entrada, y luego dices que quieres bajar el pin 6 (lo que implica una salida).