Forum: Mikrocontroller und Digitale Elektronik Xmega- Code für SPI oder UART


von Ganz neu (Gast)


Lesenswert?

Ich beschäftige mich ganz neu mit MC und steige mit einem Xmega in diese 
Welt ein.

Hat mit jemand ein SPI oder UART- Ansteuerung für den Xemga. (zum 
nachvollziehen)?

Wie stelle ich z.B. den SPI-Mode ein. In der include steht:

typedef enum SPI_MODE_enum
{
  SPI_MODE_0_gc = (0x00<<2),   /* SPI Mode 0 */
  SPI_MODE_1_gc = (0x01<<2),   /* SPI Mode 1 */
  SPI_MODE_2_gc = (0x02<<2),   /* SPI Mode 2 */
  SPI_MODE_3_gc = (0x03<<2),   /* SPI Mode 3 */
} SPI_MODE_t;
#endif /* !defined (_ASSEMBLER_) */

Wahrscheinlich ist es ganz einfach- habe aber noch keine Anhung.

von mäxchen (Gast)


Lesenswert?

Wo hast du denn den Xmega herbekommen?
Sorry ich weiss keine Antowrt, aber es nimmt mich einfach wunder.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Du mußt das Datenblatt und das Manual, nicht die Include lesen!

von Peter D. (peda)


Lesenswert?

Ganz neu wrote:
> Ich beschäftige mich ganz neu mit MC und steige mit einem Xmega in diese
> Welt ein.

Schöne Idee, mit den neuesten Chips anzufangen.
Da betritt man Neuland und braucht nicht mit der Hilfe von anderen zu 
rechnen.


> Hat mit jemand ein SPI oder UART- Ansteuerung für den Xemga. (zum
> nachvollziehen)?

Wenn Atmel nicht schon entsprechende Application-Notes hat.

Ansonsten haben wohl kaum Leute Zeit, ständig neue Chips zu nehmen und 
schnell man Beispielcode dafür zu schreiben, den sie auch noch 
veröffentlichen.


Peter

von heinz (Gast)


Lesenswert?

1
void setup_uartc0(char valueBAUDCTRLA, char valueBAUDCTRLB)                     
2
{
3
  PORTC.DIR |= 0x08;                                                            //TX-PIN Ausgang RX-PIN Eingang
4
  USARTC0.BAUDCTRLA = valueBAUDCTRLA;                                           //Baudrate einstellen
5
  USARTC0.BAUDCTRLB = valueBAUDCTRLB;           
6
  USARTC0.CTRLB = 0x18;                                                         //RX+TX Enable CLK
7
  USARTC0.CTRLC = 0x03;                                                         //8N1
8
  USARTC0.CTRLA = 0x30;                                                         //Interrupt Level High
9
}

Damit is der Uart Initialisiert übergabewerte sind eben die Werte für 
die Baudrateneinstellung die du dir errechnen musst laut datenblatt

zum senden einfach das register USARTC0.DATA schreiben
zum empfang dieses lesen

von Peter D. (peda)


Lesenswert?

heinz wrote:
>
1
>   USARTC0.CTRLA = 0x30;
2
>

Ich hätte eigentlich vermutet, daß Atmel auch bei den Xmega Bitnamen 
vergeben hat, die man anstelle kryptischer Hexwerte verwenden sollte.

> zum senden einfach das register USARTC0.DATA schreiben

Bisher kannte ich UARTs eigentlich so, daß man vorher ein Flag prüfen 
muß, ob das Senderegister frei ist.

> zum empfang dieses lesen

Bisher kannte ich UARTs eigentlich so, daß man vorher ein Flag prüfen 
muß, ob das Empfangsregister voll ist.


Ich sage mal, so eine Art Beispielcode ist nicht hilfreich für Anfänger.


Peter

von AVRman (Gast)


Lesenswert?


von heinz (Gast)


Lesenswert?

in meinem include file vom IAR sind nur Bitmasken enthalten und ich hab 
keine lust die langen wörter zu tippen

ja es is wohl bequemlichkeit aber solange es mich und meine kollegen 
nicht stört...

ok ja hab das vergessen zu erwähnen man sollte natürlich immer die 
status bits abfragen bevor man schreibt
da ich lesen nur mit interrupt mache ist das dabei nicht erforderlich

von unbekannt (Gast)


Lesenswert?

Peter Dannegger:

wenn du keine Lust hast zu helfen - dann lass es doch!!! Brauchst echt 
nicht alles kommentieren.

von Peter D. (peda)


Lesenswert?

unbekannt wrote:
> wenn du keine Lust hast zu helfen - dann lass es doch!!! Brauchst echt
> nicht alles kommentieren.

Ich kommentiere ja nicht, sondern ich zeige Ungenauigkeiten auf und das 
ist bestimmt sehr hilfreich für nen Anfänger.
Der kann ja nicht wissen, was für alte Programmierhasen offensichtlich 
ist.


Peter

von Guile Lampert (Gast)


Lesenswert?

@Peter:
Lies doch einfach mal die Netiquette. Wenn jemand im Forum eine Frage 
stellt und man hat keine direkte Antwort darauf, postet man einfach 
nicht und wartet, bis jemand postet der eine Antwort hat.
Ich persönlich habe schon vor einiger Zeit Code für den XMega 
geschrieben. Dein allererster Kommentar ist einfach unnütz spiegelt aber 
das allgemeine Zwischenmenschliche Verhalten speziell in diesem Forum 
wieder - möglichst schön aufeinander rumhacken.

Außerdem: Wenn niemand eine Antwort zum XMega hat, bleibt dieser Thread 
eben leer. Aber jetzt muß sich jeder der eine ähnliche Frage hat, durch 
sinnlose Kommentare quälen (meinen eigenen eingeschlossen).

So vieleicht schaffen wir es ja diesmal diesen Thread aufgrund meines 
Posts nicht in einen Flamewar ausarten zu lassen und Du überlegst Dir 
einfach mal ob ich nicht ein bisschen recht haben könnte.

Schönen Gruss
Guile

von Penner (Gast)


Lesenswert?

Peter:
Ungenauigkeiten aufzuzeigen und Fachleute (die schnell helfen wollen) 
oder Anfänger (die es nicht besser wissen können) zu kritisieren sind 
zwei verschiedene Dinge. Letzteres ist aber nicht konstruktiv.

von Ganz neu (Gast)


Lesenswert?

Hallo Heinz,

danke für deine Hilfe. Gibt es im neuen IAR ein Beispielcode für den 
Atxmega?

von heinz (Gast)


Lesenswert?

also meines wissens gibts das nicht habe aber auch nicht danach gesucht 
sondern den prozessor erstmal(was ich recht hilfreich empfinde) in 
Assembler programmiert habe 1-2 tage mit kleinen spielreien wie 
lauflichtern, tastern, timern usw um die Register besser kennenzulernen 
und somit konnte ich dann schön drauf los programmieren

von Ganz neu (Gast)


Lesenswert?

Hallo Heinz,

ok. Werde mich am WE noch einmal mit den "Grundlagen" beschäftigen.

Trotzdem kann mir vielleicht jemand erklären mit welchem Befehl ich den 
SPI-Mode setze:


Der Befeht muss ja auf die include-Daten zugreifen:

dort steht:

typedef enum SPI_MODE_enum
{
  SPI_MODE_0_gc = (0x00<<2),   /* SPI Mode 0 */
  SPI_MODE_1_gc = (0x01<<2),   /* SPI Mode 1 */
  SPI_MODE_2_gc = (0x02<<2),   /* SPI Mode 2 */
  SPI_MODE_3_gc = (0x03<<2),   /* SPI Mode 3 */
} SPI_MODE_t;
#endif /* !defined (ASSEMBLER) */

von Hoeflinger (Gast)


Lesenswert?

Hallo

hier gibt es verschiedene Code-Beispiele für die Atxmega-Reihe:

http://www.atmel.com/dyn/products/app_notes.asp?part_id=4298

von heinz (Gast)


Lesenswert?

ich hab für spi was geschrieben aber nur zum senden da meine peripherie 
sowieso nichts zurücksendet

ABER: noch nicht getestet!!!

[c]
#define bit_get(p,m) ((p) & (m))
#define bit_set(p,m) ((p) |= (m))
#define bit_clear(p,m) ((p) &= ~(m))
#define BIT(x) (0x01 << (x))



void InitSPIMaster(char SPCR_Control,char SingleSpeed)
{
  SPIF.CTRL = SPCR_Control|(1<<4);//Übergeben Wert+Master Mode
  if(SingleSpeed != 0)
    SPIF.CTRL |= (1<<7);
}

void SPI_MasterTransmit(char data)
{
  SPIF.DATA = data;
  while(bit_get(SPIF.STATUS, BIT(7))==0);
}

[\c]

von Ganz neu (Gast)


Lesenswert?

Heinz,

das nenne ich prompte Hilfe- vielen Dank!!

von Anfänger (Gast)


Lesenswert?

Hallo,

hat jemand zufälligerweise eine Funktion zu Hand mit der man über den 
UART mit dem Atxmega lesen kann?

von heinz (Gast)


Lesenswert?

einfach das data register lesen wenn was da is und feritg...

von Anfänger (Gast)


Lesenswert?

OK. Aber wie frage ich ihn ab, ob etwas da ist?


while ( !( USARTC0.STATUS & USART_RXCIF_bm) );?
receivedData = USARTC0.DATA;

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>OK. Aber wie frage ich ihn ab, ob etwas da ist?

Das läßt Du am besten den Interrupt machen, oder für Fortgeschrittene: 
die DMA-Einheit. Fehlerbehandlung nicht vergessen.

von Ganz neu (Gast)


Lesenswert?

Muß ich den Interrupt (wenn etwas empfangen wurde) rücksetzen? Damit der 
MC vom Interrupt-Register wieder in die main springt?

Wenn ja wie mach ich es? Habe bis jetzt erst das hier:

ISR(USARTE0_RXC_vect)
{
receivedData = USARTE0.DATA;
}

von heinz (Gast)


Lesenswert?

Du musst da nichts zurücksetzen...

dein Code müsste genau das machen was du willst

von Ganz neu (Gast)


Lesenswert?

Vielen Dank.
Soweit so gut. Ich habe eine externe Taktquelle an Xtal 1 angeschlossen.
Und möchte diese Taktquelle für die Baudrate des Uart's nehmen. Wie 
stelle ich das in der UART-INIT ein?
Den Takt habe ich so eingestellt:

OSC.CTRL = OSC_XOSCEN_bm;
while( !(OSC.STATUS & OSC_XOSCRDY_bm))
CCP = 0xD8;  //Schutz (Konfiguration übernehmen)
CLK.CTRL = CLK_SCLKSEL1_bm | CLK_SCLKSEL0_bm;  // Externer Clock
CLK.PSCTRL = 0x00;  //Prescaler 0


Die UART_INIT sieht so aus:

void USART_Init(unsigned int bsel)
{
   /* Set baud rate */
   unsigned char bscale = 0b1101; //-3

    USARTE0.BAUDCTRLB = (unsigned char)(bsel>>8);
    USARTE0.BAUDCTRLB = ((USARTE0.BAUDCTRLB & ~USART_BSCALE_gm) | 
(bscale<<4) );

   USARTE0.BAUDCTRLA = (unsigned char)bsel;

   USARTE0.CTRLA = USART_RXCINTLVL_HI_gc;   //RX interrupt high level


   /* Set frame format: 8data, 1 stop bit */
  USARTE0.CTRLC = (USARTE0.CTRLC & ~USART_CHSIZE_gm) | 
USART_CHSIZE_8BIT_gc;


   /* Enable receiver and transmitter */

   USARTE0.CTRLB = (USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm); 
//Tx enabel/ Rx enable / douple speed

}

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.