Lesen eines Pins als Eingang auf AVR XMEGAs

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, PINnCTRLohne 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
};
Welchen Logiktest verwenden Sie, um zu erkennen, dass Pin 6 (erfolglos) auf Low geht? Können Sie auch feststellen, dass der Pin mit einem Multimeter oder Oszilloskop niedrig wird? Braucht es vielleicht einen Pulldown-Widerstand?
Für Logiktests habe ich gerade ~ verwendet. Also, wenn (PORTA.IN & ~(1<<6)) Pulldown-Modus = 010 Ich habe das versucht, aber vielleicht ist mein ~(1<<6) die falsche Art, dies zu lesen. Mit einem Multimeter habe ich das nicht getestet. Ich werde, wenn ich nach Hause komme. Hilft das?
Mein erster Instinkt war, wie pingswept sagte, prüfen Sie, ob Sie einen Pulldown-Widerstand benötigen.
@ril3y - Sie möchten (PORTA.IN & ~(1 << 6)) nicht verwenden. Das wäre wie (PORTA.IN & 0xBF), was wahr ist, wenn irgendein Pin außer Pin 7 hoch ist. Ich glaube, was Sie versuchen wollten, ist !(PORTA.IN & (1 << 6))
Wie greife ich direkt auf den Pin zu, um Daten zu lesen oder zu schreiben? Wenn ich Daten auf Pin6 schreiben möchte, wie kann ich das tun? Oder ich möchte Daten von einem bestimmten Pin lesen. Danke

Antworten (1)

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).