Ich habe noch was anderes probiert:
main.c:
Code:
#include <avr/interrupt.h>
#include "uart.h"
#define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
void uart_init()
{
uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);
// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
UDR;
}
while (UCSRA & (1 << RXC));
}
// Einen 0-terminierten String übertragen.
void uart_puts (const char *s)
{
do
{
uart_putc (*s);
}
while (*s++);
}
// Ein Zeilenumbruch, abhängig davon, was die Gegenstelle haben will
// Windows: "rn"
// Linux : "n"
// MacOS : "r"
#define CR "\r\n"
char text[] = "Hallo Welt." CR;
int main()
{
uart_init();
sei(); // Wird nur gebraucht bei der Interrupt-Version
uart_puts (text);
uart_puts ("Hallo Welt!" CR);
return 0;
}
uart.h:
Code:
#ifndef _UART_H_
#define _UART_H_
#include <avr/io.h>
extern void uart_init();
static inline int
uart_putc (const uint8_t c)
{
// Warten, bis UDR bereit ist für einen neuen Wert
while (!(UCSRA & (1 << UDRE)))
;
// UDR Schreiben startet die Übertragung
UDR = c;
return 1;
}
static inline uint8_t
uart_getc_wait()
{
// Warten, bis etwas empfangen wird
while (!(UCSRA & (1 << RXC)))
;
// Das empfangene Zeichen zurückliefern
return UDR;
}
static inline int
uart_getc_nowait()
{
// Liefer das empfangene Zeichen, falls etwas empfangen wurde; -1 sonst
return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
}
#endif /* _UART_H_ */
Hier compiliert er voll durch, nur ein paar warnings:
In file included from main.c:2:
uart.h:6: warning: function declaration isn't a prototype
uart.h:23: warning: function declaration isn't a prototype
uart.h:34: warning: function declaration isn't a prototype
main.c:7: warning: function declaration isn't a prototype
main.c:45: warning: function declaration isn't a prototype
Auf den externen Quarz (im Makefile definiert) schalte ich per
Code:
uisp -dlpt=0x378 -dprog=dapa --wr_fuse_l=0xee
Ich hoffe das ist richtig?
Auf dem Terminal bekomme ich rein gar nichts...
Wenn ich jetz mit dem Multimeter dran gehe bekomme ich auf dem TXD/RXD pin des Controllers etwa 5V (bei beiden).
An den Pins der Transen für die Invertierung bekomme ich beim RXD 6V für den USB-RS232Wandler und etwa 10V für direkte RS232, am TXD, also der wo eigentlich was raus soll, bekomme ich nur 0,02V raus.
Das ist ja nicht ganz richtig, oder?
Demnach würde ich vermuten dass die Transe kaputt ist? Kann das durch vertauschen der Drähte vom PC kommen?
grüße
dennis
edit:
hm...hat sich irgendwie gelöst...das ganze funktioniert jetzt. Ich weiß nicht wieso, aber ich bekomm auf dem Terminal jetzt mein "hallo Welt"
Lesezeichen