hm, also ich empfange irgendwie mist und habe bisher keine Ahnung woran das liegt. Das RN-Wiki und das AVR Tutorial ahben mir auch nciht so richtig weiter helfen können.
wenn ich mit UART folgende Zeichenkette abschicke:
ABBCCCCDDDDDDDDEEEEEEEEEEEEEEEE
dann kommt folgendes im Terminalprogramm an:
00 18 18 1E 1E 1E 1E 60 60 60 60 60 60 60 60 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 00
vom Prinzip siehts ja gar nciht so schlecht aus, da die Anzahl der gleichen Zeichen stimmt...aber alle Zeichen sind irgendwie "verschoben"
woran kann das liegen?
Die Baudrate ist ja anscheinend schonmal richtig eingestellt[/url]
der Code dazu:
Code:
#include <stdlib.h>
#include <avr/io.h>
#include <stdio.h>
#include <stdint.h>
#define BAUDRATE 9600
void uart_init(){
uint16_t ubrr0 = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
UBRR0H = (uint8_t) (ubrr0>>8);
UBRR0L = (uint8_t) (ubrr0);
// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = (1 << UMSEL00) |(1 << UMSEL01) | (1 << UCSZ01) | (1 << UCSZ00);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do{
uint8_t dummy;
(void) (dummy = UDR0);
}
while (UCSR0A & (1 << RXC0));
}
uart_putc (const uint8_t c){
// Warten, bis UDR bereit ist für einen neuen Wert
while (!(UCSR0A & (1 << UDRE0)));
// UDR schreiben startet die Übertragung
UDR0 = c;
return 1;
}
void uart_puts (const char *s){
do{
uart_putc (*s);
}
while (*s++);
}
int main(void){
unsigned long x,y;
int z=0;
uart_init();
while (1) {
uart_puts ("ABBCCCCDDDDDDDDEEEEEEEEEEEEEEEE");
for(x=0;x<1000000;x++)y++;
}
return 0; // never reached
}
ich vermute, dass ich die Bits für den 8N1 Modus nciht richtig eingestellt habe. Die Zeile sieht so aus:
UCSR0C = (1 << UMSEL00) |(1 << UMSEL01) | (1 << UCSZ01) | (1 << UCSZ00);
eigentlich stand im Tutorial statt UMSEL00 und UMSEL01 ein URSEL...gabs aber bei mir nicht, daher hatte ichs mal umbenannt in eine Variable, die sich so ähnlich angehört hat. Fehler hier?
Lesezeichen