Forum: Mikrocontroller und Digitale Elektronik ATXmega - Pin Eingang oder Ausgang


von Fabian H. (Firma: Technische Universität Berlin) (brein)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe mal ne recht einfach frage. Wie stelle ich fest, durch eine 
Messung, ob ein Pin eines Mikrocontrollers als Eingang oder Ausgang 
definiert wurde?

Es geht genauer um folgendes.
Ich habe mir das Xminilab von Gabotronics besorgt. 
http://www.gabotronics.com/development-boards/xmega-xminilab.htm
Nun versuchte ich, das Oszilloskop über USART anzusteuern und 
auszulesen.
Dies wollte mir nicht so recht gelingen, also habe ich den Support dort 
angeschrieben und die haben mir gesagt, dass sie die USB Pins PD6 und 
PD7 als nutzen und nicht PE2 und PE3 wie im Schaltplan vorgesehen.
Ich könne aber die Pins von Port D mit den Pins von Port E verbinden.
1
I recently changed the firmware so that the serial port is on pins PD6, PD7 (Micro USB connector) instead of PE2, PE3 (External Port). 
2
This was done because the USB stack is not ready and most users will buy the USB to UART cable to connect to the PC.
3
 
4
[...]
5
 
6
But if you wish to try now, you could solder the TX and RX to the little vias that are close to the micro USB connector.
Leider wurde mir noch nicht verraten, welche Pins mit welchen zu 
verbinden sind.
Tx->D-;
Rx->D+;
oder umgekehrt?
Auf mein Nachfragen wurde bisher noch nicht geantwortet.

Da ich bisher noch nie nen ATXmega programmiert habe, sondern nur die 
8-Bit-Varianten, werde ich leider auch aus dem Source Code so schnell 
nicht schlau.

Habt Ihr eine Idee ob und wie man messen kann, ob ein Pin als Eingang 
oder Ausgang fungiert?

Oder kann jemand den Source lesen:
1
    // PORTS CONFIGURATION
2
    // Initial value PORTA.DIR       = 0x00; // CH2, CH1, 1V, K1, K2, K3, K4, REF
3
//    PORTCFG.MPCMASK   = 0b00011110;   // // Pull up on pin PA4, PA3, PA2, PA1
4
    PORTA.PIN7CTRL  = 0x07; // Input Disable on pin PA7
5
    PORTA.PIN6CTRL  = 0x07; // Input Disable on pin PA6
6
    PORTA.PIN5CTRL  = 0x07; // Input Disable on pin PA5
7
    PORTA.PIN4CTRL  = 0x18; // Pull up on pin PA4
8
    PORTA.PIN3CTRL  = 0x18; // Pull up on pin PA3
9
    PORTA.PIN2CTRL  = 0x18; // Pull up on pin PA2
10
    PORTA.PIN1CTRL  = 0x18; // Pull up on pin PA1
11
    PORTA.INTCTRL   = 0x02; // PORTA will generate medium level interrupts
12
    PORTA.INT0MASK  = 0x1E; // PA4, PA3, PA2, PA1 will be the interrupt 0 sources
13
    PORTB.DIR       = 0x0B; // RES, AWG, D/C, R/W
14
    // Initial Value PORTB.OUT       = 0x00; //
15
    // Initial Value PORTC.DIR       = 0x00; // LOGIC
16
    PORTC.INT0MASK  = 0x01; // PC0 (SDA) will be the interrupt 0 source
17
    PORTC.INT1MASK  = 0x80; // PC7 (SCK) will be the interrupt 1 source
18
    PORTD.DIR       = 0x1F; // USB, EXT, GREEN, TX, RX, CLK, RED
19
    PORTD.OUT       = 0x04; // LCD voltage off
20
    PORTE.DIR       = 0x08; // TX, RX, RTS, CTS
21
    // Initial Value PORTE.OUT       = 0x00; //
22
    PORTCFG.VPCTRLA = 0x41; // VP1 Map to PORTE, VP0 Map to PORTB
23
    PORTCFG.VPCTRLB = 0x32; // VP3 Map to PORTD, VP2 Map to PORTC
24
    key = 0;

Vielen Dank
Fabian

von Nico (nico123)


Lesenswert?

Laut dem Code sind nur die unteren 5 Portausgänge von Port D auf Ausgang 
gesetzt (PORTD.DIR = 0x1F;)!
Schau dir mal den Code der seriellen Schnittstelle an, da müßten 
irgendwo noch Port D6 und D7 definiert sein.

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Angehängte Dateien:

Lesenswert?

Das habe ich jetzt so nicht gefunden.

Das einzige was ich jetzt noch so in der Main dazu fand war:
1
    // Initialize USARTE0 for External Interface Port
2
    USARTE0.BAUDCTRLA = 0x17;   // BSCALE = -6, BSEL = 1047
3
    USARTE0.BAUDCTRLB = 0xA4;   // ==> 115211 bps (~115.2kbps)
4
    USARTE0.CTRLC = 0x03;       // Async, No Parity, 1 stop bit, 8 data bits
5
    USARTE0.CTRLB = 0x18;       // Enable RX and TX
6
  USARTE0.CTRLA = 0x20;       // Enable RX interrupt
7
8
    // Event System
9
    EVSYS.CH0MUX = 0xE0;    // Event CH0 = TCE0 overflow used for ADC
10
    EVSYS.CH1MUX = 0x20;    // Event CH1 = ADCA CH0 conversion complete
11
    EVSYS.CH3MUX = 0xD0;    // Event CH3 = TCD0 overflow used for DAC
Aber wo PD6 und PD7 explizit neu gesetzt wurden, fand ich jetzt nicht.

Ich habe mal auch noch die main.h in den Anhang als Ergänzung zur main.c 
gepackt. Vll gibt das Aufschluss.

Ich würde auch gern den ganzen Code in den Anhang packen. Aber ich frage 
mich, wie sinnvoll das ist, zumal man es sich über den Link im ersten 
Post auch ziehen kann.

Gruß
Fabian

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

Also, Messtechnisch gibt es da keinen Lösungsansatz?

von STK500-Besitzer (Gast)


Lesenswert?

Fabian Hoemcke schrieb:
> Also, Messtechnisch gibt es da keinen Lösungsansatz?

Wenn er Ausgang ist, sollte er auch entweder bei einer gewissen 
Belastung noch nicht zusammenbrechen, oder GND-Pegel haben.
Eingänge haben i.d.R. eine relativ hohen Pull-Up-Widerstand, dessen 
Ausgangsspannung bei Belastung zusammenbrechen müsste, wenn man ihn 
stark genug belastet.
Der Ausgangswiderstand der Pins sollte aus dem Datenblatt hervorgehen.

von Wolfgang (Gast)


Lesenswert?

Fabian Hoemcke schrieb:
> Also, Messtechnisch gibt es da keinen Lösungsansatz?
Du kannst dir immer eine Serienschaltung aus 2 x 4k7 Widerständen bauen, 
die Enden mit VCC bzw. Gnd verbinden und an der Mittelanzapfung die 
Spannung messen (vorzugsweise mit einem Oszi) und damit an den µC-Pins 
rumstochern. Solange du in der Luft oder an einem Eingang bist (und da 
niemand anderes dran zieht) mißt du VCC/2, wenn du an einen Ausgang 
gerätst, geht die Spannung näherungsweise auf VCC bzw. Gnd.

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

Wolfgang schrieb:
> Fabian Hoemcke schrieb:
>> Also, Messtechnisch gibt es da keinen Lösungsansatz?
> Du kannst dir immer eine Serienschaltung aus 2 x 4k7 Widerständen bauen,
> die Enden mit VCC bzw. Gnd verbinden und an der Mittelanzapfung die
> Spannung messen (vorzugsweise mit einem Oszi) und damit an den µC-Pins
> rumstochern. Solange du in der Luft oder an einem Eingang bist (und da
> niemand anderes dran zieht) mißt du VCC/2, wenn du an einen Ausgang
> gerätst, geht die Spannung näherungsweise auf VCC bzw. Gnd.

Hi, das hört sich gut an. Wie muss ich mir das vorstellen?

In etwa so:
1
xxxxxxxxx            Vcc
2
        xxx           |
3
        x            xxx
4
        xxx          x x 4k7
5
   µC   x            x x
6
        xxx          xxx
7
        x             |
8
        xxx-----------+---------------
9
        x             |              |
10
        xxx          xxx           xxxxx
11
        x            x x 4k7       x V x
12
        xxx          x x           xxxxx
13
        x            xxx             |
14
        xxx           |              | 
15
xxxxxxxxx            GND            GND

Gruß
Fabian

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Fabian Hoemcke schrieb:
> // Initialize USARTE0 for External Interface Port
>     USARTE0.BAUDCTRLA = 0x17;   // BSCALE = -6, BSEL = 1047
>     USARTE0.BAUDCTRLB = 0xA4;   // ==> 115211 bps (~115.2kbps)

Wer soll das lesen können ? Richte dich doch bitte nach der für alle 
AVRs üblichen Syntax:
1
// serial port setup
2
#define USART USARTF0
3
/* Set baud rate */
4
static void USARTInit(void)
5
{
6
  USART_PORT.DIRSET   = PIN3_bm;   // Pin 3 (TXD0) as output.
7
  USART_PORT.DIRCLR   = PIN2_bm;   // Pin 2 (RXD0) as input.
8
  // USARTD0, 8 Data bits, No Parity, 1 Stop bit
9
  USART.CTRLC = (uint8_t) USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc | false;
10
   /* Target: Internal RC 32MHz (default) 
11
    * Example (9600bps)  :   - I/O clock = 16MHz
12
   *                        - 9600bps can be acheived by 9600bps / 2^0
13
   *                        - UBRR = 16MHz/(16*19200)-1 = 51
14
   *                        - ScaleFactor = 0
15
  */  
16
  USART.BAUDCTRLA = BSEL_VALUE;
17
  // Enable both RX and TX
18
  USART.CTRLB |= USART_RXEN_bm;
19
  USART.CTRLB |= USART_TXEN_bm;
20
}
Ist doch gleich viel besser zu lesen, oder ?

Fabian Hoemcke schrieb:
> nie nen ATXmega programmiert habe, sondern nur die
> 8-Bit-Varianten

XMegas sind 8-bit Controller, nur mal nebenbei :P

von Wolfgang (Gast)


Lesenswert?

Fabian Hoemcke schrieb:
> Hi, das hört sich gut an. Wie muss ich mir das vorstellen?

Genau so. Wenn der µC die Datenrichtung im Programm wild ändert, muß man 
natürlich schon mit dem Oszi genau hinsehen.

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

Wolfgang schrieb:
> Fabian Hoemcke schrieb:
>> Hi, das hört sich gut an. Wie muss ich mir das vorstellen?
>
> Genau so. Wenn der µC die Datenrichtung im Programm wild ändert, muß man
> natürlich schon mit dem Oszi genau hinsehen.

Oh, vielen Dank! Das werde ich ausprobieren.

Gruß
Fabian

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

Matthias Sch. schrieb:
> Wer soll das lesen können ? Richte dich doch bitte nach der für alle
> AVRs üblichen Syntax:

Ich hatte ja bereits geschrieben, von wem der Source stammt.
Und wenn Du schon auf für alle üblichen Syntax wert legst, dann lass das 
Plenken sein. ;)

Danke für das Aufdröseln, des Sources, jedoch müsste demzufolge ganz 
normal PE2 und PE3 Rx und Tx sein. Sind sie aber nicht. Laut der Firma 
sind es PD6 und PD7. Die Zuordnung aber brauche ich. Und die finde ich 
nicht im Source Code.


______

Matthias Sch. schrieb:
> XMegas sind 8-bit Controller, nur mal nebenbei :P

Ja, hatte irgendwie gedacht, dass das schon die 32-Variante sein.
Wofür hat denn diese Serie das "X" bekommen?

Gruß
Fabian

von Fabian H. (Firma: Technische Universität Berlin) (brein)


Lesenswert?

Mich würde mal generell interessieren, wenn ich auf gut Glück die 
jeweiligen Leitungen verbinden würde und ich bei der fifty-fifty Chance 
die falschen Verbindungen ziehen würde, ob dass schlecht für den/die 
Controller wäre?.

Ich vermute mal, bei den Pins, die beide als Eingänge fungieren, 
entsteht kein Problem. Aber bei den beiden Ausgängen. Wenn der eine 
gerade HIGH ausgibt und der andere ein LOW, dann habe ich doch einen 
harten Kurzschluss oder?

Oder ist es gar unbedenklich, wenn ich es auf diese Art und Weise 
ausprobieren würde?

Gruß
Fabian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.