Hallo! Bitte nachsicht ist mein erster Beitrag hier. Bin aber über Anregungen was ich das nächste mal besser machen kann, dankbar. Ich habe mir ein Testboard mit Display, EEProm, Max232, etc. gekauft. Die Taster, die Dioden, das Display funktionieren alle wie sie sollen. Aber die Serielle Schnittstelle bekomme ich nicht zum laufen. Im Programm (GCC) sind ein paar Dinge die ich nicht verstehe. Bin in C++ noch ein neuling, programmiere sonst nur Programme für PC's. Auf dem Board ist ein Quarz, auf dem steht:"A8.000J". Ich denke mal das sollen 8Mhz sein. Im Programm wird aber mit einem anderen Wert gerechnet???? evalboard.h #define version 1.0 #define EEPROM __attribute__((section(".eeprom"))) #define XTAL_CPU 8867238 /* 8.8Mhz 8867238*/ #define UART_BAUD_RATE 9600 /* 9600 baud */ #define i24c64 0xA0 #define i24cxx_max 0xffff /*Grösse des EEProms*/ Ich muss aber gestehen, das ich da noch nicht ganz durchsteige. Verwendet wird eine Libary: uart.c Hat vielleicht jemand für mich ein ganz ganz einfaches Programm in C welches nur einfach Daten auf die Schnittstelle schreibt. Damit könnte ich andere Probleme in dem Programm ausschliessen. Ist ein bischen viel Text, sorry.
Ich habe schon mal weiter getestet. Ich habe sichergestellt, das der Prozessor mit dem externen Quarz arbeitet. Ein kleines Program was eine LED im sekundentakt blinken lässt, hat mir dabei geholfen. Es würde mir schon helfen, wenn mir einer ein ganzes Programm schicken kann, welches Daten über eine Schnittstelle sendet. Bitte keine Code-Schnippsel, dafür sind meine Kenntnisse noch zu gering.
Hi Thorsten, hier ist ein kleines Programm mit meiner uart.c und uart.h. Du musst natürlich sicher sicherstellen, dass Sender und Empfänger am UART auf die selbe Baudrate eingestellt sind. Hier ist die Baudrate in der uart_init() auf 9600 Baud eingestellt (UBRRL = 207). Für andere Baudraten müsstest du im Datenblatt des ATMega nachschauen oder hier nochmal fragen. Gruß bobkins uart.h
1 | void uart_init(void); |
2 | void uart_puts(unsigned char *s); |
3 | void uart_put(unsigned char c); |
4 | uint8_t uart_get(void); |
uart.c
1 | #include <avr/io.h> |
2 | #include "uart.h" |
3 | |
4 | void uart_init(void) |
5 | {
|
6 | UCSRB |= ( 1 << TXEN )|( 1 << RXEN ); // UART TX, RX einschalten |
7 | UCSRC |= ( 1 << URSEL )|( 1 << UCSZ0 )|( 1 << UCSZ1 ); // Asynchron 8N1 |
8 | UCSRA |= ( 1 << U2X); // double speed mode |
9 | UBRRH = 0; // Highbyte ist 0 |
10 | UBRRL = 207; // Lowbyte 207 = 9,6 kBaud |
11 | // Berechnung laut Datenblatt
|
12 | |
13 | // Flash Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
|
14 | do
|
15 | {
|
16 | uint8_t dummy; |
17 | (void) (dummy = UDR); |
18 | }
|
19 | while (UCSRA & (1 << RXC)); |
20 | }
|
21 | |
22 | // Diese Funktion schreibt Strings auf den UART indem die uart_charsenden-Funktion Zeichen für Zeichen aufgerufen wird
|
23 | void uart_puts(unsigned char *s) |
24 | {
|
25 | while (*s) |
26 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ |
27 | uart_put(*s); |
28 | s++; |
29 | }
|
30 | }
|
31 | |
32 | void uart_put(unsigned char c) |
33 | {
|
34 | while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */ |
35 | UDR = c; /* sende Zeichen */ |
36 | }
|
37 | |
38 | uint8_t uart_get(void) |
39 | {
|
40 | while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar |
41 | return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben |
42 | }
|
und hier das eigentliche Programm:
1 | #include <avr/io.h> |
2 | #include <stdint.h> |
3 | #include "uart.h" |
4 | #include <util/delay.h> |
5 | |
6 | int main () |
7 | {
|
8 | unsigned char zeichen=0; |
9 | |
10 | uart_init(); // erstmal den uart-Kram initialisieren |
11 | |
12 | while(1) |
13 | {
|
14 | uart_put(65); // Zeichen mit ASCII-Code 65 (A) per UART senden |
15 | uart_put('A'); // Zeichen senden |
16 | |
17 | uart_puts("Hallo Welt!"); // Einen string senden |
18 | |
19 | zeichen = uart_get(); // Zeichen empfangen |
20 | uart_put(zeichen); // ... und wieder zurückschicken |
21 | |
22 | _delay_ms(500); |
23 | }
|
24 | |
25 | return 0; |
26 | }
|
Thorsten Grube (stubi2) wrote: > Ich habe mir ein Testboard mit Display, EEProm, Max232, etc. gekauft. Gemed Izmir (bobkins) wrote: > Für andere Baudraten müsstest du im Datenblatt des ATMega > nachschauen.... Gemed's Glaskugel scheint ja super zu funktionieren, meine ist leider zur Reparatur..... Deshalb wäre es schön, wenn Thorsten mal sagt was er für einen Controller auf dem Board hat....
1234 (Gast) wrote:
> Ein AVR32 ? ....
na toll, da können wir dann raten:
ein AT32AP700x
oder
ein AT32UC3A
oder
ein AT32UC3B
?
Nah dann wollen wir mal die Glaskugel in den Schrank packen und schauen was auf dem Prozessor drauf steht. Übrigens: Ich dachte das AVR32 schon eindeutig genug sei. Sorry bin halt noch nicht so fitt wie andere. ATMEA32, 16PU, 0807D Danke für die Hilfe, wird mich schon einmal einen Schritt weiter bringen, werde das gleich einmal ausprobieren.
Thorsten Grube (stubi2) wrote: > ATMEA32, 16PU, na, dann sind wir doch schon mal nen Schritt weiter. Also kein AVR32, sondern ein ATMEGA32, 16MHz max.Taktfrequenz, DIL-Gehäuse, Bleifrei. Zieh dir doch mal das Datenblatt dazu von der Atmel-Seite. Da steht genau drin, welche Werte die Register haben müssen, um bei einer bestimmten Quarzfrequenz eine bestimmte Baudrate zu bekommen.
Danke für die Hilfe. Ich werde einen Neuen Beitrag aufmachen, da die Überschrift ja nun gar nicht mehr passt.
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.