Forum: Mikrocontroller und Digitale Elektronik Problem mit xMega


von Nico (Gast)


Lesenswert?

Hallo,

ich muss mich im Rahmen einer Projektarbeit der Uni mit einem 
ATxMega64A3U beschäftigen. Dazu habe ich mir ein kleines Devboard 
gebastelt mit 16MHz Quarz und alle Ausgänge auf Stiftleisten gelegt.
Ich habe bis jetzt nur mit ATMegas (8, 16, 32, 64 und 128) und einigen 
ARM Cortex-M3 Controllern gearbeitet.

Die Anfänge mit dem xMega waren garnicht so schwierig, wenn man das neue 
System mit Peripherie.Funktion verstanden hat.
Allerdings habe ich nun ein Problem:

Die Ports A und B kann ich nicht als digitale Ausgänge verwenden. Wenn 
ich z.B. programmiere
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
6
  PORTA.DIR = 0xFF;
7
  PORTA.OUT = 0xFF;
8
9
  for(;;)
10
  {
11
    ;
12
  }
13
14
  return 0;
15
}

sollten eigentlich alle Pins vom PORT A auf Ausgang und auf High-Level 
sein, ich messe aber überall 0V. Bei PORTC - F messe ich aber auf die 
gleiche Weise die 3,3V !

Ich habe die wage Vermutung, dass das was mit dem ADC zu tun hat. Diesen 
habe ich aber testweise durch ADCA.CTRLA = 0x00; deaktiviert.

Bei PORTB funktionieren die Ausgänge auch nicht. Ich würde gerne den DAC 
benutzen, der reagiert entsprechend aber auch nicht. Ich habe nur 
Spannungen zwischen 0 und 0,36V.

Der ATxMega ist ein Sample direkt von Atmel.

Ist der Controller defekt oder muss ich noch eine Fuse setzen oder 
irgendwas ins Programm einfügen, damit die digitalen Ausgänge 
funktionieren ?

LG
Nico

von Frank K. (fchk)


Lesenswert?

Vermutung: Du hast AVCC/AGND nicht verschaltet. Damit werden nämlich 
auch die Ports mit Analog-Funktionalität versorgt, selbst wenn Du sie 
digital betreibst.

fchk

von Nico (Gast)


Lesenswert?

Hallo Frank,

doch, ich habe sämtliche VCC inklusive AVCC mit 3,3V und alle GND und 
AGND mit GND verbunden. Daran kann es also nicht liegen.

von Frank K. (fchk)


Lesenswert?

Schaltplan und Programm posten!

fchk

von Nico (Gast)


Angehängte Dateien:

Lesenswert?

Bitteschön, Ausschnitt aus dem Schaltplan (sollte reichen) und 
kompletter Code:
1
/*
2
 * main.c
3
 *
4
 *  Created on: 25.01.2013
5
 *      Author: Nico
6
 */
7
8
#include <avr/io.h>
9
10
void initDAC(void);
11
12
//Main-Funktion
13
int main(void)
14
{
15
16
  //Clock source external 16MHz
17
  CLK.CTRL = 0x03;
18
19
  //Oszillator-Einstellungen -> external, 12-16MHz, 16k Startup
20
  OSC.XOSCCTRL = 0xEB;
21
  OSC.CTRL = 0x08;
22
23
  //ADCs von PORTA und PORTB deaktivieren
24
  ADCA.CTRLA = 0x00;
25
  ADCB.CTRLA = 0x00;
26
27
  PORTA.DIR = 0xff;
28
  PORTA.OUT = 0xff;
29
30
  PORTB.DIR = 0xff;
31
  PORTB.OUT = 0xff;
32
33
  //Digital-to-Analog-Converter initialisieren
34
  //initDAC();
35
36
  //Endlosschleife
37
  while(1)
38
  {
39
    /*DACB.CH0DATA = 0xfff;
40
     while (!DACB.STATUS & 0x01);*/
41
  }
42
43
  //wird nie erreicht
44
  return 0;
45
}
46
47
void initDAC(void)
48
{
49
  //Nur Channel0 aktiv, single-channel, AVCC als Referenz
50
  DACB.CTRLA = 0x05;
51
  DACB.CTRLB = 0x00;
52
  DACB.CTRLC = 0x08;
53
}

Ich nutze übrigens AVR-Eclipse mit dem aktuellsten WinAVR und 
AVR-ISP-mkII mit aktuellster Firmware und libusb Treiber.

von Markus M. (adrock)


Lesenswert?

Hi,

...also die Clockinitialisierung funktioniert so nicht, da dass Register 
geschützt ist. Der Controller wird in Deinem jetzigen Code den 
Schreibzugriff ignorieren und mit den 2 MHz interne Takt weiterlaufen, 
aber das ist für Dein Problem ja erstmal unerheblich. Schau' Dir dazu 
mal die Appnote von Atmel an, Du wirst ein kleines Stückchen 
Inline-Assembler brauchen, um den Schreibzugriff richtig zu machen.

Aber Dein eigentliches Problem kann damit nicht zusammenhängen. Also das 
einfache I/O war auch das erste was ich auf dem XMega probiert habe und 
es hat sofort funktioniert.

Hast Du den Controller auf eine Platine gelötet oder "frei" verdrahtet?

Grüße
Markus

von Nico (Gast)


Lesenswert?

Hallo Markus,

dass das mit dem Clock so nicht funktioniert, habe ich mir fast gedacht. 
Bin eben noch nicht so erfahren mit den xMegas. Ich schau mir das die 
Tage mal genauer an. War nur verwundert, dass es keine Fusebits mehr für 
die Taktquelle gibt.

Wie du aber schon richtig sagtest, ist das für die PORT-Ausgänge erstmal 
egal.

Der Controller ist fest auf einer selbstgeätzten Platine verlötet. Ich 
habe mit Durchgangsprüfer sichergestellt, dass keine Kurzschlüsse zu 
Ground oder anderen Portpins vorhanden sind und jeder Pin vom Controller 
definitiv zur Stiftleiste und von da an auch zum Digimultimeter kommt.

Die anderen PORTs von C an aufwärts laufen einwandfrei, kann sie z.B. 
binär hochzählen, alles kein Problem. Nur PORTA und B klappen garnicht. 
Ist schon komisch irgendwie...

von Nico (Gast)


Lesenswert?

Hallo.

Nach langer Zeit wieder eine Meldung!

Ich habe nochmal alle VCC-Eingänge überprüft und festgestellt, dass 
tatsächlich keine Verbindung am AVCC-Eingang anlag. Frank K. hatte 
demnach recht !

Jetzt funktionieren alle Ports.
Danke nochmal für eure Hilfe =)

Liebe Grüße
Nico

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.