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
};