Martin.
08.10.2009, 20:12
Hallo !
Ich hab mir einen USB->UART Converter gemäß dem Datenblatt zusammengelötet. Nun möchte ich eigentlich mit ner Baudrate von 9600 und nem externen 16 MHz Quarz mal ein Testsignal an den PC schicken. HTerm kommt aber auf nichts vernünftiges. Genauer gesagt: HTerm empfängt nur bei BAUD 115200 etwas, kann es sein, dass ich über FPROG beim FT232RL eine Baudrate einstellen muss und nicht nur beim MC und beim HTerm? Das nächste Problem: Die RX Diode leuchtet nicht. Also hab ich das Oszi genommen und überprüft ob ein ordentliches Signal anliegt. Beim Anstecken des Masseanschlusses begann die LED zu leuchten und HTerm hat auch bei Baud 9600 Daten empfangen, nur nix richtiges. Kann es sein, dass ich da ne Masseschleife hergestellt habe? Ich hab doch nur das Oszi mit der Masse von meiner Atmega32 Platine verbunden. Der Converter ist übrigens BUS powered. Achja er wurde übrigens von Windows Problemlos erkannt und ich kann auch mit FProg auf ihn zugreifen.
Hier noch der MC Code:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
// Ohne ergeben sich unten Fehler in der Berechnung
#endif
#define BAUD 9600UL // Baudrate
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
/*#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif*/
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)));
UDR = c;
return 0;
}
void uart_puts (char *s)
{
while (*s)
{
uart_putc(*s);
s++;
}
}
int main(void)
{
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0);
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
uart_puts('a');
uart_puts('b');
uart_puts('c');
uart_puts('d');
uart_puts('e');
uart_puts('f');
while(1!=0)
{
uart_puts('g');
_delay_ms(1000);
}
}
hier der Schaltplan:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2390
Danke für eure Hilfe!
Martin
Ich hab mir einen USB->UART Converter gemäß dem Datenblatt zusammengelötet. Nun möchte ich eigentlich mit ner Baudrate von 9600 und nem externen 16 MHz Quarz mal ein Testsignal an den PC schicken. HTerm kommt aber auf nichts vernünftiges. Genauer gesagt: HTerm empfängt nur bei BAUD 115200 etwas, kann es sein, dass ich über FPROG beim FT232RL eine Baudrate einstellen muss und nicht nur beim MC und beim HTerm? Das nächste Problem: Die RX Diode leuchtet nicht. Also hab ich das Oszi genommen und überprüft ob ein ordentliches Signal anliegt. Beim Anstecken des Masseanschlusses begann die LED zu leuchten und HTerm hat auch bei Baud 9600 Daten empfangen, nur nix richtiges. Kann es sein, dass ich da ne Masseschleife hergestellt habe? Ich hab doch nur das Oszi mit der Masse von meiner Atmega32 Platine verbunden. Der Converter ist übrigens BUS powered. Achja er wurde übrigens von Windows Problemlos erkannt und ich kann auch mit FProg auf ihn zugreifen.
Hier noch der MC Code:
#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
// Ohne ergeben sich unten Fehler in der Berechnung
#endif
#define BAUD 9600UL // Baudrate
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
/*#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif*/
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)));
UDR = c;
return 0;
}
void uart_puts (char *s)
{
while (*s)
{
uart_putc(*s);
s++;
}
}
int main(void)
{
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC |= (1<<URSEL)|(3<<UCSZ0);
UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
uart_puts('a');
uart_puts('b');
uart_puts('c');
uart_puts('d');
uart_puts('e');
uart_puts('f');
while(1!=0)
{
uart_puts('g');
_delay_ms(1000);
}
}
hier der Schaltplan:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2390
Danke für eure Hilfe!
Martin