Hallo Allerseits. Ich kämpfe mal wieder mit der UART-Schnittstelle meines Atmega328P. Ich will einfach nur erstmal ein Zeichen an den PC senden. Das scheitert daran, das der PC zwar registriert das etwas ankommt, aber im Hterm wird nur immer irgend ein Bit angezeigt. Ich vermute ein Start oder Stopbit. (Siehe Bild Oben). Ursprünglich habe ich einen normalen 4MHZ Quarz verwendet und die Integrierte Schnittstelle im "mySmartUSB Mk2 AVR-Programmer" benutzt. http://www.produktinfo.conrad.com/datenblaetter/175000-199999/191510-da-01-ml-MYSMARTUSB_AVR_PROGRAMMER_de_en.pdf Da hatte ich das gleiche Problem. Keiner der User hier, die mir damals geantwortet hatten, konnten sich einen Reim darauf machen. Also bin ich der Empfehlung gefolgt einen eigenen Max232 und einen Quarzoszillator zu verwenden. Ich habe jetzt eine neue Schaltung aufgebaut, nach dem Vorbild im Tutorial: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART Allerdings habe ich nur Keramikkondensatoren am MAX232 verwendet. Laut Datenblatt sollte das aber gehen. http://www.conrad.de/ce/de/product/1047881/Linear-IC-MAX232IN-PDIP-16-Texas-Instruments?queryFromSuggest=true Bin mittlerweile echt Deprimiert, weil ich schon einiges an Geld in mein Projekt gesteckt habe und es jetzt daran scheitert. Hoffe auf Hilfe Hier noch der Quellcode:
1 | #include <avr/io.h> |
2 | #include <stdlib.h> |
3 | /*
|
4 | UART-Init:
|
5 | Berechnung des Wertes für das Baudratenregister
|
6 | aus Taktrate und gewünschter Baudrate
|
7 | */
|
8 | |
9 | #ifndef F_CPU
|
10 | |
11 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
12 | #define F_CPU 4000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
13 | // Ohne ergeben sich unten Fehler in der Berechnung
|
14 | #endif
|
15 | |
16 | #define BAUD 9600UL // Baudrate
|
17 | |
18 | // Berechnungen
|
19 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
20 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
21 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
22 | |
23 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
24 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
25 | #endif
|
26 | |
27 | //UART-Schnittstelle Initialisieren
|
28 | void uart_init(void) |
29 | {
|
30 | UBRR0H = UBRR_VAL >> 8; |
31 | UBRR0L = UBRR_VAL & 0xFF; |
32 | |
33 | UCSR0B = (1<<TXEN0); // UART TX einschalten |
34 | //UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01); // UART 8-Bit Modus
|
35 | UCSR0C = (1<<USBS0)|(3<<UCSZ00); |
36 | }
|
37 | |
38 | |
39 | //Atmega328P
|
40 | int uart_putc(unsigned char c) |
41 | {
|
42 | while (!(UCSR0A & (1<<UDRE0))) /* warten bis Senden moeglich */ |
43 | {
|
44 | }
|
45 | |
46 | UDR0 = c; /* sende Zeichen */ |
47 | return 0; |
48 | }
|
49 | |
50 | //Hauptprogramm
|
51 | int main(void) |
52 | {
|
53 | //Einmalig abgearbeite Kommandos
|
54 | DDRC |= (1<<PB1); //Definiert PortC Pin 5 als Ausgang |
55 | DDRB &= ~(1<<PB0); //Definiert PortB Pin 0 als Eingang |
56 | uart_init(); //UART-Initialisierung aufrufen |
57 | |
58 | //Lokale Variablen
|
59 | uint8_t Flanke = 0; |
60 | char y; |
61 | |
62 | //Zyklisches Programm
|
63 | while(1) |
64 | {
|
65 | /*if(PINB & (1<<PINB0)){
|
66 | PORTB |= (1<<PB1);
|
67 | if(Flanke==0){
|
68 | y = 6 + '0';
|
69 | uart_putc('1');
|
70 | Flanke = 1;
|
71 | }
|
72 |
|
73 | }else{
|
74 | Flanke=0;
|
75 | } */
|
76 | uart_putc('x'); |
77 | |
78 | }
|
79 | }
|