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.
Wo hast du denn den Xmega herbekommen? Sorry ich weiss keine Antowrt, aber es nimmt mich einfach wunder.
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
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
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
http://www.atmel.com/dyn/products/app_notes.asp?family_id=607#XMEGA%20Microcontrollers 1307 und 1309
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
Peter Dannegger: wenn du keine Lust hast zu helfen - dann lass es doch!!! Brauchst echt nicht alles kommentieren.
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
@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
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.
Hallo Heinz, danke für deine Hilfe. Gibt es im neuen IAR ein Beispielcode für den Atxmega?
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
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) */
Hallo hier gibt es verschiedene Code-Beispiele für die Atxmega-Reihe: http://www.atmel.com/dyn/products/app_notes.asp?part_id=4298
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]
Hallo, hat jemand zufälligerweise eine Funktion zu Hand mit der man über den UART mit dem Atxmega lesen kann?
OK. Aber wie frage ich ihn ab, ob etwas da ist? while ( !( USARTC0.STATUS & USART_RXCIF_bm) );? receivedData = USARTC0.DATA;
>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.
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; }
Du musst da nichts zurücksetzen... dein Code müsste genau das machen was du willst
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.