Xmega- Code für SPI oder UART

Gast #994780
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.
#994795
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
Gast #994799
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
#994815
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
Gast #994822
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
#994893
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
Gast #994928
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
Gast #994942
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.
Gast #994972
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
Gast #995038
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) */
Gast #995056
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]
Gast #1076534
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;
}
Gast #1076562
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

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren