- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 20

Thema: UART bei ATTINY AVR 1 Serie (ATTINY 412)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459

    UART bei ATTINY AVR 1 Serie (ATTINY 412)

    Hallo!

    Ich scheitere daran, den UART eines ATTINY412 zum Laufen zu bekommen... Ich möchte erstmal einfach Zeichen übertragen mit 9600 Baud, 8N1. An der Gegenstelle (Notebook) hängt ein USB-UART-Konverter (CP2102) und ein einfacher serieller Monitor (ich benutze den von der Arduino IDE). Damit habe ich auch schon Daten von einem ATTINY13 mit Soft-Serial-Emulation empfangen. Wenn ich Daten vom Notebook sende und TX mit RX verbinde, kommen sie über diesen Loopback auch an. Also der Monitor geht.

    Das Programmieren grundsätzlich klappt - ein Blinkskript kriege ich jedenfalls zum Laufen. (Zum Programmieren verwende ich ATMEL Studio 7.)
    Ich hab zwar einige Erfahrung mit Computern, Programmierung und Elektronik, aber mit Mikrocontrollern bin ich noch nicht besonders erfahren. Dazu kommt, dass die "neuen" Tinys" irgendwie etwas anders funktionieren, als die früheren Modelle (ATMEGA328, TINY85, ...). Deshalb finde ich auch keine Codeschnipsel, aus denen ich mir was basteln kann.

    Was ich bisher probiert habe, läuft auf folgende Codeteile hinaus:

    Code:
    #define FOSC 20000000UL //Clock Speed
    #define BAUDX 9600UL
    #define MYUBRR FOSC/16/BAUDX-1
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    void	USART_Init( unsigned int ubrr)
    {
    	// Set Tx to output
    	PORTA_DIRSET = 2;
    	// Set Tx high
    	PORTA_OUTSET = 2;
    	// Set baud rate
    	USART0_BAUDL = (unsigned char)ubrr;
    	USART0_BAUDH = (unsigned char)(ubrr>>8);
    	// Enable transmitter
    	USART0_CTRLB = (1<<USART_TXEN_bp);
    	// Set Frame format 8 bit, 1 stop
    	USART0_CTRLC = 3;
    }
    
    int main(void)
    {
    	
    	USART_Init(MYUBRR);
    	
    	while (1)
    	{
    		
     		// Put data into buffer
    		USART0_TXDATAL = ('A');
    		_delay_ms(1000);
    	}
    }
    Wenn ich das Programm mit dem Simulator und Debugger teste, schreibt er auch alle Register wie erwartet.
    - PA1 wird auf Output high gesetzt.
    - In USART0.BAUD steht 129
    - CTRLC und B werden entsprechend gesetzt.

    Unsicher bin ich mir bei der Baudeinstellung. Aus dem Datenblatt werd ich nicht schlau - es heißt dort, dass die oberen 10 Bit des 16-Bit-Registers für die Ganzzahl sind, die unteren 6 für den Nachkommaanteil. Wie soll das funktionieren?
    Ist der RC-Takt von 20000000 für die Berechnung maßgeblich oder der interne Takt (standardmäßig mit Prescaler 6, also auf 3333333 Hz)? Ichhab beides probiert - ohne Erfolg.


    Hat jemand von euch ein Codebeispiel mit dem man das Ding zum Laufen kriegt? Mir genügt es erstmal, wenn wenigstens einzelne Buchstaben ankommen - darauf könnte ich dann wenigstens aufbauen.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Wenn das das komplette Programm ist, dann läuft der tiny wahrscheinlich nicht mit 20MHz, sondern mit 3.33MHz.
    Manual, Seite 59:
    "After any Reset, CLK_MAIN is provided by the 16/20MHz oscillator (OSC20M) and with a Prescaler
    division factor of 6."

    mfg
    Achim

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459
    Das stimmt, der Tiny läuft definitiv mit 3333333 Hz - die Frage ist nur, von welchem Takt der UART ausgeht - vom RC-Takt oder vom runtergeteilten Systemtakt.
    Ich hab aber wie gesagt beides ausprobiert - ohne Erfolg. Daran alleine kanns also nicht liegen.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Also lt. Block (S. 57) nimmt der UART seinen Takt auch vom MAIN CLOCK PRESCALER.
    Ich weiß nicht, wie genau der interne RC-Takt ist, vielleicht hilft's, den Wert fürs Baudraten-Register etwas nach oben oder unten zu variieren?
    mfg
    Achim

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459
    Zitat Zitat von seite5 Beitrag anzeigen
    Also lt. Block (S. 57) nimmt der UART seinen Takt auch vom MAIN CLOCK PRESCALER.
    Ich weiß nicht, wie genau der interne RC-Takt ist, vielleicht hilft's, den Wert fürs Baudraten-Register etwas nach oben oder unten zu variieren?
    mfg
    Achim
    Auf der Zeichnugn finde ich keinen UART - nur "Other Peripherals" und laut Text und Bild nehmen alle Teile außer NVM, RAM und CPU den Takt von CLK_PER. So stehts auch in Kapitel 24.3.2.1. Also, der UART müsste mit 3333333Hz laufen.
    Variieren ist nicht das Thema, denn es kommt ja gar nichts an - wenns nur ein wenig verzerrt wäre, hätte ich wenigsens Buchstabensalat. Außerdem hat der 412 eine interne Kalibrierung, die wohl ab Werk eingemessen ist.

    - - - Aktualisiert - - -

    Zitat Zitat von wkrug Beitrag anzeigen
    Ich hab man kurz ins Datenblatt geschaut.
    Der USART hat hier insgesamt 13 Register - Sind die auch alle richtig befüllt?
    Soweit Ich das verstehe sind auch 3 unterschiedliche Taktquellen möglich.

    Ausgehend von den "alten" Tiny Controllern würde ich vermuten, das der USART mit dem Prozessortakt läuft.
    Wenn Du ein Oszilloskop hast, könntest Du ja mal gucken, welche Bitlänge Du hast - Dann sollte das eindeutig sein.
    Das Startbit ist ja eigentlich immer 0 und sollte sich so detektieren lassen. Mit dem Bitmuster 0xAA sollte dann auch ein ständiger Wechsel zwischen 0 und 1 detektierbar sein.
    Laut Datenblatt sind für die Initialisierung Tx auf out high zu schalten, BAUD und Frame zu setzen, Operation mode zu setzen und Tx zu aktivieren.
    Die meisten Register sind schon nach Initialisierung korrekt. Mode und Frame müsste man gar nicht setzen.
    Ich hab im Simulator die Register geprüft - es wird alles so weit ich das beurteilen kann - korrekt gesetzt. CLK steht auf 20 MHz internal und Prescaler enabled und 0x8 (also Prescaler 6).

    Oszi hab ich nicht. Aber irgendwas müsste ja rauskommen. Selbst wenn ich eine LED an den Ausgang hänge, hab ich keinerlei Flackern oder sowas.

    - - - Aktualisiert - - -

    - - - Aktualisiert - - -

    Zitat Zitat von seite5 Beitrag anzeigen
    Woher stammt Deine Baudratenformel? Auf Seite 252, Datenblatt, steht was ganz anderes.
    mfg
    Achim
    Stimmt. Hab ich inzwischen auch korrigiert - die Formel war aus einem Codeteil eines Atmega328. Jetzt lautet es:
    #define MYUBRR 4 * FOSC/BAUDX

    Bringt aber auch nichts.



    Laut Anleitung soll der BAUD-Wert in das 16-Bit-Register BAUD. Dabei wären die oberen 10 Bit der Ganzzahlteil und die unteren 6 Bit der Nachkommaamteil (Kap. 24.3.2.1). Versteht das jemand?
    Wenn ich rechne, komme ich auf 4 * 3333333 / 9600 = 1388,88875.
    1388 passt schon mal nicht in 10 Bit, da ist ja bekanntlich bei 1023 Schluss.
    Und wie soll man den Nachkommaanteil in das Register bekommen?
    Mein Code schreibt brav 0x56C in das 16-Bit Regsiter - das entspricht aber nicht der Teilung auf 10 und 6 Bit.
    Das mit den Nachkommastellen versteh ich eh nicht. Da hätte man doch auch den Wert gleich mit 64 multiplizieren können um alles 6 Bit nach links zu shiften... Außerdem kommt mir ein Prescaler mit Nachkommastellen etwas komisch vor.
    Kanns ich da jemand einen Reim drauf machen?
    Geändert von Gnom67 (26.12.2018 um 12:46 Uhr)

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Datenblatt: The USART.BAUDL and USART.BAUDH register pair represents the 16-bit value, USART.BAUD (s. 273)
    Wie kommst Du auf 10bit?
    Schreib die Werte doch mal direkt:
    Datenblatt: For a write operation, the low byte of the 16-bit register must be written before the high byte.
    USART0_BAUDL=0x6C;
    USART0_BAUDH=0x05;

    mfg
    Achim

    Ich glaube, Du verwendest ein falsches Datenblatt.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    Ich hab man kurz ins Datenblatt geschaut.
    Der USART hat hier insgesamt 13 Register - Sind die auch alle richtig befüllt?
    Soweit Ich das verstehe sind auch 3 unterschiedliche Taktquellen möglich.

    Ausgehend von den "alten" Tiny Controllern würde ich vermuten, das der USART mit dem Prozessortakt läuft.
    Wenn Du ein Oszilloskop hast, könntest Du ja mal gucken, welche Bitlänge Du hast - Dann sollte das eindeutig sein.
    Das Startbit ist ja eigentlich immer 0 und sollte sich so detektieren lassen. Mit dem Bitmuster 0xAA sollte dann auch ein ständiger Wechsel zwischen 0 und 1 detektierbar sein.

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    Woher stammt Deine Baudratenformel? Auf Seite 252, Datenblatt, steht was ganz anderes.
    mfg
    Achim

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    .. der Tiny läuft definitiv mit 3333333 Hz - die Frage ist nur, von welchem Takt der UART ausgeht ..
    Mal n´ etwas schräger Vorschlag (mit dem Hintergrund - egal welche Baudrate - es blinkt wenn gesendet wird) : für meinen Fuseretter war eine der Grundideen, dass beim Senden sehr vieler "U"s mit 8N1 die Bitfolge "010101010101010101010101010101010101010101.." übermittelt wird. WENN Du also an Deinem RX-Pinn (oder misstrauisch auch am TX) eine LED anschließt und von Deinem Controller mal ne Kiste "U"s sendest:

    Code:
      init_uart0 ((u16)(F_CPU/ 600 / 16 - 1.0));   //
      for (u16 n=0; n<10000; n++)   // LED blinken lassen
      {                             // TestLED
        uputs0 ("U");
      }             // Ende von for (u16 n=0; n<10000; n++)
    dann werden entsprechend viele "U" gesendet, binär eben diese "..0101010101.."-Kolonne. Das sieht man am Flackern der LED selbst bei 600 Bd. Mit 400 Bd noch deutlicher *gg* - habe ich grad mit nem mega328p getestet. Ergebnis: auch ohne Oszilloskop sieht man grob, ob etwas gesendet wird.

    Im Übrigen: viel Erfolg - egal wie.

    Nachtrag: als grobe Beurteilung könnte man noch (optisch - mit der MEthode des genauen Hinsehens) prüfen, ob zwischen 600 Bd und 400 Bd bzw. 300 Bd ein deutlicher Unterschied feststellbar ist.

    Nachtrag2: das große "C", ASCII 0b 100 0011, geht noch deutlicher *gg*.
    Geändert von oberallgeier (26.12.2018 um 19:20 Uhr)
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Attiny 13a
    Von Fileplayer im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 15.11.2017, 17:40
  2. Attiny als UART Switch
    Von Gast_Avr im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 07.10.2014, 22:59
  3. AtTiny 12L + 1*16 LCD ?
    Von Robin1508 im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 27.12.2007, 15:55
  4. UART geht mit AT90S2313 und nicht mit ATtiny 2313?!?
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 38
    Letzter Beitrag: 11.11.2006, 10:24
  5. ATtiny 13 mit Stk 500
    Von AVRboy im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 01.10.2006, 17:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress