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.
Lesezeichen