Leyendo un pin como una entrada en AVR XMEGAs

4

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

He intentado establecer el registro PINnCTRL en cada combinación sin suerte. Puedo detectar el pin 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 sube. Sin embargo, quería hacer lo mismo, 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é que lo intentaría.

Estoy usando AVR Studio y ATXmega256A3 microcontrolador.

Tabla de registro de configuración AVR PINnCTRL (al menos para las secciones de extracción 0b00xxx000) HOJA DE DATOS COMPLETA AQUÍ: enlace .

En la página 131 (sección 13.4) esto enumera la definición de toda la tabla a continuación. NOTA: el registro PINxCTRL contiene más que solo las configuraciones para la configuración. Los bits con los que estoy trabajando son estos: 00xxx000 Las x corresponden a la lista 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
};
    
pregunta ril3y

1 respuesta

1

Hay algunas preocupaciones que tengo.

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

2) De acuerdo con el código, el pin 6 que va arriba hace que el LED se apague.

3) Inmediatamente después de apagar el LED, vuelve a encenderlo. Probablemente, volver a encenderlo debería estar en otro bloque.

4) Esta parte de tu pregunta es confusa.

Quería hacer lo mismo en lugar de cuando el pin6 se eleva. 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 manejar el pin 6 bajo (lo que implica una salida).

    
respondido por el ajs410

Lea otras preguntas en las etiquetas