Jap hab auch zwei ATXmega-Boards. Beide mit 128A1. An den 3V3-Pegel muss man sich gewöhnen, aber so schlimm ist es auch nicht. L293D mit 3,3V (IO-Level) macht momentan noch nicht so den Spaß, aber wird schon.
Druckbare Version
Jap hab auch zwei ATXmega-Boards. Beide mit 128A1. An den 3V3-Pegel muss man sich gewöhnen, aber so schlimm ist es auch nicht. L293D mit 3,3V (IO-Level) macht momentan noch nicht so den Spaß, aber wird schon.
Für welche Applikation brauchst du die 64 MHz eigentlich? Wenn ich heute Nachmittag etwas Zeit habe, mach ich mal ein zwei Fotos von den Boards.
AVR Studio meckert bei diesem Programm rum:
Als Fehler kommt das hier:Code:/*
* XMega.c
*
* Timer C0 wird ist auf 1 Sekunde eingestellt.
*
* Created: 22.03.2012 19:42:07
* Author: Daniel
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void Clock_init(void);
void PLL_init(void);
void Int_init(void);
void Port_init(void);
void UART_init(void);
void DAC_init(void);
void ADCA_init(void);
void TimerC0_init(void);
void Send_UART(void);
void ADC_Cal(void);
void Start_Conversion(void);
int main(void)
{
// Variablen
volatile int ADC_Value = 0x00;
volatile int Calibration_Value_ADC; // Buffer für ADC Kalibrationswert
Clock_init(); // Konfiguriert die Clock
PLL_init(); // PLL konfigurieren
Int_init(); // Interrupts konfigurieren
DAC_init(); // DAC konfigurieren
ADCA_init(); // ADC konfigurieren
ADC_Cal(); // ADC kalibrieren
TimerC0_init(); // Timer C0 konfigurieren
Port_init(); // Ports konfigurieren
UART_init(); // UART konfigurieren
while(1)
{
}
}
void DAC_init()
{
DACA.CTRLC = ~(DAC_REFSEL_gm | DAC_LEFTADJ_bm); // Interne 1V Referenz, right adjust (12 Bit);
DACA.CTRLA = (DAC_CH0EN_bm | DAC_ENABLE_bm); // 1CLK Takt, Refresh 16CLKs
// DACA.TIMCTRL = 0x00;
// DAC aktivieren
}
void ADCA_init()
{
ADCA.CTRLA = 0x01; // ADC Enable
ADCA.CTRLB = 0x04; // Unsigned Mode / 8 Bit
ADCA.REFCTRL = 0x00; // Interne 1.0V Referenz
}
void Clock_init(void)
{
OSC.CTRL |= OSC_RC32MEN_bm; // Oszillator auf 32Mhz stellen
while(!(OSC.STATUS & OSC_RC32MRDY_bm)); // Warten bis der Oszillator bereit ist
CCP = CCP_IOREG_gc;
CLK.CTRL = 0x01; // Clock auf 32MHz stellen
}
void PLL_init(void)
{
}
void Int_init(void)
{
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; // Interrupts (Highlevel,Mediumlevel und Lowlevel freigeben)
sei(); // Globale Interruptfreigabe
}
void Port_init(void)
{
PORTB.DIR = 0xFF; // Kompletten PortB auf Ausgang stellen
}
void TimerC0_init(void)
{
TCC0.CTRLA = TC_CLKSEL_DIV1024_gc; // Vorteiler einstellen
TCC0.PER = 31249; // Timer-Topwert einstellen
TCC0.CTRLB = 0x00; // Timer in Normalmodus stellen
TCC0.INTCTRLA = 0x03; // Interrupt konfigurieren
}
void UART_init(void)
{
}
void Send_UART(void)
{
}
void Start_Conversion(void)
{
ADCA.CH0.CTRL = 0x81; // Messung starten und Input-Mode auf Singleended stellen
ADC_Value = ADCA_CH0RES;
}
void ADCA_Cal(void)
{
Calibration_Value_ADC = 0x00;
ADCA_CAL = Calibration_Value_ADC;
}
ISR(TCC0_OVF_vect)
{
PORTB.OUT ^= 0x01;
}
Bild hier
Dabei habe ich die Variablen doch deklariert....
Hat jemand ne Lösung für das Problem?
Danke schonmal!
Ja aber lokal in der main.
Na du hast zwei ADCs im XMega. Den ADCA und ADCB. Beide hängen auch an PortA und PortB. Wenn du jetzt ADCA.CH0 nimmst ist es also PortA.Pin0.
Danke für die Antwort. Aber ich habe mir vorhin im Datenblatt die Stelle nochmal durchgelesen.
Wenn ich es richtig verstehe (und ich weiß nicht ob es so ist ;) ), hat der XMega 2 ADCs (wie du schon sagtest). Jeweils einen an PortB und A. Diese ADCs sind in 4 Kanäle unterteilt. Und dann kann man mittels des Mux Registers diesem Channel nochmal nen Pin zuweisen.
Das sieht man in dem Bild aus dem Datenblatt recht gut:
Bild hier
Das mit den MUX-Registern gibt es auch bei den Megas und Tinys schon. Der ADC tastet ja nur immer einen Port-Pin ab. Damit er weiß welchen, musst du ihm das natürlich sagen. Frei wählen wie bei den externen Interrupts (was ich neben TWI, SPI und USART immer noch am Schärfsten finde ;) ). Dort kannst du explizit per Pin-Maske einen Pin auswählen. Was bei den ADCs nicht in der Funktionalität geht. Dort wird via Multiplexer zwischen den Quellen geschaltet. Daher auch der Name Mu(ltiple)x-Register.
Die Grafik ist für mich so zu deuten, dass man mit den MUX-Registern eine Kanalauswahl trifft. Entweder die differentiellen mit oder ohne Verstärkung oder aber die Single-Ended-Eingänge. Dann folgt die Konfiguration hinsichtlich Auflösung, Referenzspannung und Events. Da mit relativ hoher Wahrscheinlichkeit mehrere Kanäle zum Messen verwendet oder aber die Daten für den DMA gehalten werden müssen, gibt es dann pro Kanal ein Register wo man das Ergebnis abholen kann.
Man kann im Übrigen auch 4 virtuelle Kanäle deklarieren. Das geht über das MUXCTRL-Register.
Code:ADCA.CH0.MUXCTRL
Ich habe mir gerade mal eine Application Note von Atmel angesehen.
Dort habe ich diese Grafik gefunden:
Bild hier
Ich finde die erklärt das ein bischen besser als die im Datenblatt :)
Das mit den Virtuellen Kanälen habe ich noch gar nicht gesehen ^.^ und bisher hab ich nichtmal ne Ahnung wofür ich das brauchen könnte.