Hi Leute hab da ein kleines Problem mit meiner UART schaltung oder der Software bin nicht sicher. Und zwar hab ich einen Atmega8515. Die Uart ausgabe von uC zum PC klappt allerding scheint es so als würde der uC nichts vom PC empfangen.Die Leitungen sind soweit alle in Ordnung (denke ich). hier mein Programm: #include <avr/io.h> #include <stdio.h> #include <inttypes.h> #include <stdlib.h> #include <eeprom.h> // 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-1000) // Fehler in Promille #define BAUD 9600L uint8_t ein; uint8_t Taster; uint8_t myByte; uint8_t uart_getc(void) { while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben } 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<<TXEN); // UART TX einschalten UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UCSRB |= (1<<RXEN); //UART RX einschalten UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; while(1) { ein=uart_getc(); uart_putc(ein); } }
Schreib das mal vernünftig hin:
1 | UCSRC = 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0; // Asynchron 8N1 |
Das andere kannst du auch in einer Anweisung schreiben:
1 | UCSRB = 1<<TXEN | 1<<RXEN; |
Ansonsten: "UART geht nicht" kommt ungefähr 7392 mal jeden Tag, also bitte Forensuche und die Artikelsammlung belästigen.
>// 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-1000) // Fehler in Promille >#define BAUD 9600L Habe mir nicht alles angeschaut aber sollte man die BAUD nicht vorher definieren bevor man sie verwenden kann. der compiler müsste doch meckern oder wird das in C so gemacht? Außerdem ist F_CPU auch nirgends definiert.
Mr K. wrote: >>// 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-1000) // Fehler in Promille >>#define BAUD 9600L > > Habe mir nicht alles angeschaut aber sollte man die BAUD nicht vorher > definieren bevor man sie verwenden kann. Das ist schon ok. > der compiler müsste doch > meckern Der Compiler kriegt das so nie zu Gesicht. Das sind Anweisungen an den Preprozessor, er möge doch bitte Textersetzungen im eigentlichen Quelltext vornehmen. Im Grunde ist das nur die Anweisung: Wenn immer du im Quelltext auf den Text UBRR_VAL stösst, dann ersetzte diesen Text doch bitte durch "((F_CPU+BAUD*8)/(BAUD*16)-1)". In diesem ersetzten Text wird dann wieder BAUD durch "9600L" ersetzt usw. bis es nichts mehrzum Ersetzen gibt. Die Reihenfolge in der du dem Präprozessor aber die zu ersetzenden Texte bekannt gibst, ist ziemlich unerheblich, solange sie nur vor dem eigentlichen Quelltext passieren. > Außerdem ist F_CPU auch nirgends definiert. Das könnte tatsächlich ein Problem sein. F_CPU wird aber auch zb. von AVR-Studio extern bereits vorbelegt, wenn man im Optionen- dialog eine Taktrate eingestellt hat.
wieder was über C gelernt. das mit dem preprozessor Anweisungen ist mir klar aber wusste nicht das die Reihenfolge egal ist. Mit compiler meinte den gesammten Compilervorgang; von lexikalischen analyse bis zum linker bzw. von ascii source bis zum hex code. ich sollte mal aufhören in assembler und basic zu programmieren und endlich mal anfangen C zu lernen ;)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.