Forum: Mikrocontroller und Digitale Elektronik SAMD10 - UART Konfiguration


von Max M. (i_bims)


Lesenswert?

Hallo zusammen,

Ich möchte auf meinem SAMD10 "Hello World" über den UART ausgeben. Ich 
nutze das entsprechende Xplained Board 
(https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/ATSAMD10-XMINI).

Ich bin neu in der Cortex-Programmierung, und möchte gerne einen 
Grundlegenden Überblick über die Ansteuerung des Prozessors erhalten. 
Daher möchte ich vorerst keine Bibliotheken nutzen, sondern die Register 
von Hand setzen. Allerdings fehlt mir manchmal ein wenig Zeit mich 
komplett einzulesen. Da mein C-Code bisher nicht so recht läuft wollte 
ich hier gerne auf kurzem Weg wissen was ich falsch gemacht/übersehen 
habe.

Hier das Datenblatt auf dass sich die Seitenanmerkungen beziehen:
http://ww1.microchip.com/downloads/en/devicedoc/atmel-42242-sam-d10_datasheet.pdf
1
#include "sam.h"
2
3
void init_usart();
4
void Transmit_usart0(char Data);
5
6
int main(void)
7
{
8
    /* Initialize the SAM system */
9
    SystemInit();
10
    /* Replace with your application code */
11
  
12
    init_usart();
13
     REG_PORT_DIR0|= (1<<4);//PA04 als Output
14
  
15
  char A[]="Hello World!";
16
  int i=0;
17
  
18
    while (1) 
19
    {
20
    while(A[i]!=0)//Sende "Hello World"
21
    {
22
      Transmit_usart0(A[i]);
23
      i++;
24
    }
25
    
26
    Transmit_usart0(13);//Cr als Zeilenumbruch/Abschlusszeichen
27
    
28
    i=0;
29
    }
30
}
31
32
void init_usart() 
33
{  
34
  int Baudrate=9600;//ZielBaudrate festlegen
35
  
36
  REG_PM_APBCMASK|=(1<<2);//Enable Clock for SERCOM0 (S.136/137), //Standard ist der Baustein vom Strom getrennt?
37
  
38
  //Vgl. Register A Seite 455
39
  //Rx Standardmäßig auf SERCOM0 PAD[0], daher wird hier nachfolgend //nur Tx geroutet
40
  REG_SERCOM0_USART_CTRLA|=(1<<16);//Schreibe 01 an die Stelle TXPO //=> SERCOM0 PAD[2]   
41
  REG_SERCOM0_USART_CTRLA|=(1<<2);//Internal USART Clck
42
  REG_SERCOM0_USART_CTRLA|=(1<<1);//Enable USART
43
  
44
  
45
  /*Standardmäßig 16 Times Oversampling => S.457 Table 25-10
46
  Auf Seite 434 => Berechnung der Baudrate mit S=16 wegen Oversampling und Fref=8Mhz 
47
  (CPU Takt, steht im Datenblatte vom Entwicklungsboard)
48
  Sonst Takt Fref halt je nach angelegtem Quarz*/
49
  
50
  REG_SERCOM0_USART_BAUD=(65536*(1-(16*Baudrate/8000000)));//Baudrate //nach Formel auf S.434
51
  
52
  //Vgl. Register B Seite 459
53
  REG_SERCOM0_USART_CTRLB|=(1<<16);//TX von SERCOM0 einschalten
54
  REG_SERCOM0_USART_CTRLB|=(1<<17);//RX von SERCOM0 einschalten
55
  
56
  return;
57
}
58
59
void Transmit_usart0(char Data)
60
{
61
  
62
  while((REG_SERCOM0_USART_INTFLAG&(SERCOM_USART_INTFLAG_TXC))==0);//Warte darauf dass TX Buffer leer ist, um neue Daten zu senden
63
  REG_SERCOM0_USART_DATA=Data;
64
  
65
  return;
66
}

Die ganzen Linksschiebegeschichten kann ich sicherlich noch schöner über 
die entsprechenden #defines aus der sam.h ausdrücken...

Wäre cool wenn mir jemand helfen könnte das zum laufen zu kriegen

Besten Dank schonmal!

von Max M. (i_bims)


Lesenswert?

Achja und gleich noch eine Frage:
Im Atmel Studio werden mir verschiedene SamD10 angezeigt. Aufm 
Entwicklungsboard steht aber nur SamD10 ohne Zusätze. Wo sind denn da 
die Unterschiede?

von meimomei (Gast)


Lesenswert?

Max M. schrieb:
> Wo sind denn da die Unterschiede?

Das Datenblatt wird dir alles verraten.

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Da mein C-Code bisher nicht so recht läuft

Geht es auch ein wenig genauer?

Max M. schrieb:
> char A[]="Hello World!";
Max M. schrieb:
> while(A[i]!=0)//Sende "Hello World"

Das kann, muss aber nicht funktionieren.
Wenn hinter deinem String nicht zufällig eine \0 ist, dann sendet er 
munter weiter.

von Peter S (Gast)


Lesenswert?

"Das Datenblatt wird dir alles verraten."
tja..solche Leuten meinen ernsthaft einen Kommentar absondern zu müssen.
Hilfe sieht irgendwie anders aus.
Ich möchte wetten, das er das im Datenblatt findet, weiß er auch, somit 
dürfte er schon mal schlauer sein als du

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Aufm
> Entwicklungsboard steht aber nur SamD10 ohne Zusätze. Wo sind denn da
> die Unterschiede?

Schau mal im Datenblatt auf Seite 5/6 bzw. 3/4.
Pinanzahl, mehr Flash, mehrere ADC...

von Max M. (i_bims)


Lesenswert?

Danke erstmal für eure Beteiligung! :D

Adam P. schrieb:
> Das kann, muss aber nicht funktionieren.
> Wenn hinter deinem String nicht zufällig eine \0 ist, dann sendet er
> munter weiter.

Das stimmt, ist mir bisher so aber noch nie passiert. Soweit ich weis 
schließt ein String in C immer mit \0 ab? Selbst wenn schon, dann wäre 
es nicht schlimm, wichtig ist dass ich überhaupt erstmal was aus dem 
UART raus bekomme. Sonst begrenze ich ebend fix den Index.

Peter S schrieb:
> Hilfe sieht irgendwie anders aus.

Haha, danke dafür! :D sowas wollte ich auch schon schreiben :D

Adam P. schrieb:
> Geht es auch ein wenig genauer?

Also der C-Code selbst lässt sich kompilieren, und auf den Controller 
laden. Allerdings weigert sich der UART am Pin SERCOM0 PAD[2] (PA04 bzw 
Pin 3 am QFN Gehäuse => vgl. S.13)auch nur irgendwas auszugeben.

Bisher habe ich nur avr programmiert. Um den UART dort anzuschmeißen 
brauchte man nur die Entsprechenden EN Bits im UART Register zu setzen 
und die Baudrate einzustellen.

Ich habe den UART-Abschnitt im SAM Datenblatt mal überflogen und alle 
Bits so gesetzt wie es mir sinnvoll erschien. Im Quellcode habe ich das 
entsprechend kommentiert.
Aber es geht wie gesagt nicht. Weder meine UART-USB Brücke, noch das 
Oszi zeigen ein Signal am Tx-Pin. Ich denke ich habe nur ein Bit 
übersehen. Vielleicht ist es hier manchmal auch wichtig in welcher 
Reihenfolge Bits gesetzt werden. Hat SERCOM keinen Takt bringt Bits 
setzen natürlich auch nichts. Deshalb habe ich gleich oben in der 
init_usart()
'REG_PM_APBCMASK|=(1<<2);//Enable Clock for SERCOM0 (S.136/137)' 
gesetzt.
Vielleicht habe ich auch einen Fehler in der BAUD-Register Rechnung und 
der Taktgenerator will nicht arbeiten. Ich weis es nicht.

von Max M. (i_bims)


Lesenswert?

Adam P. schrieb:
> Schau mal im Datenblatt auf Seite 5/6 bzw. 3/4.
> Pinanzahl, mehr Flash, mehrere ADC...

Danke dafür :)

Nochmal bezüglich meines Quellcodes:
Vielleicht kann ja einfach mal jemand drüber sehen ob ich im Register 
CTRLA, CTRLB und BAUD die richtigen Bits gesetzt habe. Bzw. ob es noch 
andere Register gibt in denen ich was setzen muss damit der UART 
arbeitet.
9600 Baud, 1 Stop, kein Parity wären das Ziel

: Bearbeitet durch User
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.