Ich habe mit der XMEGA- Linie von AVR herumgespielt . Sie sind ziemlich erstaunliche Mikrocontroller. Atmel hat sich jedoch mit dieser neuen Linie stark verändert. Ich versuche zu erkennen, dass ein Pin niedrig wird.
Ich habe versucht, das Register auf jede Kombination einzustellen, PINnCTRL
ohne Erfolg. Ich kann erkennen, dass der Pin auf HIGH geht, aber nicht umgekehrt. Unten ist der Arbeitscode zum Einschalten der LED an Pin 5, wenn Pin 6 hoch geht. Ich wollte jedoch dasselbe tun, nur anstatt wenn Pin 6 hoch geht, möchte ich, dass Pin 6 niedrig geht und die LED an Pin 5 einschaltet.
Wie auch immer, ich habe hier nicht viel XMEGA-Zeug gesehen, also dachte ich, ich würde es versuchen.
Ich verwende AVR Studio und den Mikrocontroller ATXmega256A3 .
AVR PINnCTRL Configuration Register Table (zumindest für die Pull-Abschnitte 0b00xxx000) VOLLSTÄNDIGES DATENBLATT HIER: http://www.atmel.com/dyn/resources/prod_documents/doc8077.pdf .
Auf Seite 131 (Abschnitt 13.4) listet dies die Definition der gesamten Tabelle unten auf. HINWEIS: Das PINxCTRL-Register enthält mehr als nur die Pullups für Einstellungen. Die Bits, mit denen ich arbeite, sind diese: 00xxx000 Die x entsprechen der Auflistung unten.
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
};
Es gibt ein paar Bedenken, die ich habe.
1) Wenn Sie die Pins nicht bei 0 zählen, ist (1 << 5) eigentlich Pin 6.
2) Gemäß dem Code bewirkt Pin 6, dass die LED ausgeschaltet wird.
3) Unmittelbar nach dem Ausschalten der LED schalten Sie sie wieder ein. Das Wiedereinschalten sollte wahrscheinlich in einem Else-Block erfolgen.
4) Dieser Teil Ihrer Frage ist verwirrend.
Ich wollte dasselbe tun, nur anstatt wenn Pin6 hoch geht, möchte ich, dass Pin 6 niedrig geht und die LED an Pin5 einschaltet.
Der Grund, warum es verwirrend ist, ist, dass Sie sagen, dass Pin 6 ein Eingang ist, und dann sagen, dass Sie Pin 6 auf Low treiben möchten (was einen Ausgang impliziert).
Ping gefegt
ril3y
Kellenjb
ajs410
Elektronik