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 PINnCTRL
registro 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
};
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).
barrido
ril3y
Kellenjb
ajs410
electrónica