
Zitat von
i-wizard
... ATmega32 mit 16Mhz ... UBRR geht nicht direkt zu beschreiben. Habe es dann mit deiner Idee des schiebens Probiert also URBBL und URBBH. Wie bisher senden geht immer aber empfangen nicht ...
Dazu gibts doch für die RNControl:
1) eine funktionierende Schaltung im RNControl-Schaltplan
2) im C-code auch die dazugehörige(n) Module zum Initialisieren. Bei mir läuft das.
Aktuell (ohne lang suchen zu müssen) hab ich meine lauffähigen Schnippsel zum mega168:
a) die defines
Code:
// Mit Quarz 20 Mhz-CPU
#define F_CPU 20000000
#define BAUD 57600
#define MYUBRR (unsigned int)(F_CPU/16/BAUD-1) //nach doc2545, S 179
b) Aufruf der Initialisierung
Code:
init_USART0(MYUBRR); //USART0 initialisieren mit wählbarer Baudrate (s.o.)
c) Initialisierung des USART0 mit Empfangsroutinen:
Code:
/* ============================================================================== */
/* Initialisiere USART0 mit vorgegebener Baudrate Neu am 07jan2008
Zum Senden von Zeichen im Hauptprogramm entweder nach doc2545, S179
char irgendwas[] = "meintext";
sendUSART(irgendwas); oder direkt
sendUSART("meinText"); verwenden. */
void init_USART0( unsigned int ubrr )
{ // Set baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr; // Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Set frame format: 8data, 2stop bit
UCSR0C |= (1<<UCSZ01)|(1<<UCSZ00); // 8 Data, (async: UMSELnx empty, doc S193)
// no parity weil UPMn1:0 empty, 1 Stop, weil UPMn1:0 empty
}
/* ============================================================================== */
/* ============================================================================== */
/* === Hole Daten vom USART0 ======================== Neu am 22mai2008
=== vgl. dazu doc2545 und AVR-Gcc-Tutorial.... =================== */
char getchar(void) // ... vgl. code sample in doc2545, S 183
{ // Wait for data to be received
while(!(UCSR0A & (1<<RXC0))) //Warten, bis Empfang möglich ist
{ } // Get and return received data from buffer
return UDR0; //hole das Zeichen vom Puffer und return
}
/* ============================================================================== */
void getsUSART(char* Buffer, uint8_t MaxLen)
{
uint8_t NextChar;
uint8_t StringLen = 0;
NextChar = getchar(); // Warte auf und empfange das nächste Zeichen
// Sammle solange Zeichen, bis:
// * entweder das String Ende Zeichen kam
// * oder das aufnehmende Array voll ist
while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
*Buffer++ = NextChar;
StringLen++;
NextChar = getchar();
} // Noch ein '\0' anhängen um einen Standard
// C-String daraus zu machen
*Buffer = '\0';
}
/* ============================================================================== */
Und das läuft so
Lesezeichen