www.mikrocontroller.net

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


Autor: Ganz neu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mäxchen (Gast)
Datum:

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
-1 lesenswert
nicht 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

Autor: heinz (Gast)
Datum:

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

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
heinz wrote:
>
>   USARTC0.CTRLA = 0x30;
> 

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

Autor: AVRman (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert

Autor: heinz (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: unbekannt (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Peter Dannegger:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
-1 lesenswert
nicht 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

Autor: Guile Lampert (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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

Autor: Penner (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Ganz neu (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo Heinz,

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

Autor: heinz (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Ganz neu (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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) */

Autor: Hoeflinger (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: heinz (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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]

Autor: Ganz neu (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Heinz,

das nenne ich prompte Hilfe- vielen Dank!!

Autor: Anfänger (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,

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

Autor: heinz (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
einfach das data register lesen wenn was da is und feritg...

Autor: Anfänger (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
OK. Aber wie frage ich ihn ab, ob etwas da ist?


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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Ganz neu (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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;
}

Autor: heinz (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Du musst da nichts zurücksetzen...

dein Code müsste genau das machen was du willst

Autor: Ganz neu (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.