Hallo Forenmitglieder, Ich bin Anfänger bei der Programmierung von AVR-Mikrocontroller und möchte meine Kenntnisse in diesem Gebiet vertiefen. Als Mikrocontroller habe ich zur Verfügung einen Atmega88-Mikrocontroller, der schon auf einer fertigen und funktionsfähigen Platine eingebaut ist. Außerdem habe ich auch ein Netzteil, um meine Platine mit 5V zu versorgen. Mein Ziel wäre ab dem PC Daten im Atmega88-Mikrocontroller zu schreiben und dann Lesen. Damit ich die geschiebene Daten sehe und dann lese, habe ich in meinem PC das Software Hyperterminal installiert. Ich wäre sehr dankbar, wenn jemand von euch mir einem funktionellen C-Code zuschickt, damit ich die Datenübertragung analysiere. Danke im Vorraus. Mit besten Grüßen. Monkeydluffy.
les dir mal das hier durch: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART da ist alles beschrieben, ein beispiel code hab ich jetzt auf anhieb nicht gefunden, aber wenn du ein bisschen mit google rumsuchst wirst du schon was finden.
Hi >Ich bin Anfänger bei der Programmierung von AVR-Mikrocontroller und >möchte meine Kenntnisse in diesem Gebiet vertiefen. Also, ich habe, um mein Wissen zu vertiefen ins Tutorial geschaut und mir die Beispiele vorgenommen. mit C kann ich nicht dienen, aber sicherlich findest du auch Tutorials, die deinen Wissensdurst stillen. Von einem vorgefertigten Code zu lernen, ohne entsprechenden Begleittext, halte ich nicht für besonders praktikabel. Speziel für dich einen Code so zu dokumentieren, das du daraus lernen kannst, dafür wirst du wohl kaum jemanden begeistern können, es sei denn, du kannst dir einen Privatlehrer leisten. Schau mal oben links in die Ecke unter AVR.... da ist die Hilfe für die Allgemeinheit und sicherlich findest du da auch Ansätze für dein Vorhaben. Gruß oldmax
Hallo nochmal´s, seit meinem letzen Post habe ich selber versucht, eine Lösung für mein Problem herauszufinden. Ich habe folgende C-Code geschrieben :
1 | #include <stdlib.h> |
2 | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
4 | #include <inttypes.h> |
5 | |
6 | #define F_CPU 3686400
|
7 | |
8 | // Baudrate
|
9 | #define BAUD 9600UL
|
10 | |
11 | // Berechnungen zur Baudrate:
|
12 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
13 | |
14 | char string[10]; |
15 | |
16 | void uart_init( unsigned int ubrr) |
17 | {
|
18 | //Set baud rate
|
19 | UBRR0H = (unsigned char)(ubrr>>8); |
20 | UBRR0L = (unsigned char)ubrr; |
21 | //Enable receiver and transmitter
|
22 | UCSR0B = (1<<RXEN0)|(1<<TXEN0); |
23 | // Set frame format: 8data, 2stop bit
|
24 | UCSR0C = (1<<USBS0)|(3<<UCSZ00); |
25 | }
|
26 | |
27 | void uart_transmit( unsigned char data ) |
28 | {
|
29 | //Wait for empty transmit buffer
|
30 | while ( !( UCSR0A & (1<<UDRE0)) ); |
31 | //Put data into buffer, sends the data
|
32 | UDR0 = data; |
33 | return 0; |
34 | }
|
35 | |
36 | unsigned char uart_receive( void ) |
37 | {
|
38 | // Wait for data to be received
|
39 | while ( !(UCSR0A & (1<<RXC0)) ); |
40 | // Get and return received data from buffer
|
41 | return UDR0; |
42 | }
|
43 | |
44 | void uart_puts (char *s) |
45 | {
|
46 | while (*s) |
47 | { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ |
48 | uart_putc(*s); |
49 | s++; |
50 | }
|
51 | }
|
52 | |
53 | |
54 | |
55 | |
56 | |
57 | void main( void ) |
58 | {
|
59 | int32_t j,k; |
60 | int32_t i =12241; |
61 | float f=-12.12; |
62 | uart_init(); |
63 | //uart_init(); // USART initialisieren
|
64 | uart_puts("\r\n\n\n"); // sendet einen kleinen Begrüßungstext. |
65 | uart_puts("**** Hallo! Dies ist ein ADNS2610 Test ****\r\n"); |
66 | uart_puts("\r\n"); |
67 | uart_puts("Koord: "); |
68 | uart_puts("\r\n"); |
69 | j=itoa(i,string,10); |
70 | uart_puts("J= "); |
71 | |
72 | |
73 | uart_puts(j) ; |
74 | uart_puts("\r\n"); |
75 | uart_puts("K= "); |
76 | |
77 | uart_puts(dtostrf( f, 6, 2, string )); |
78 | |
79 | uart_puts("\r\n"); |
80 | |
81 | while(1) |
82 | {;//uart_puts("Ende \r\n");; |
83 | }
|
84 | return 0; |
85 | }
|
Bei der Compilierung von dem oberen C-Code, bekomme ich immer die gleiche Fehlermeldung. Die Fehler lautet: ../datenaustauch.c:71: error: too few arguments to function 'uart_init' . Bitte , kann jemand von euch mir bescheid sagen, wo genau die Fehler in meinem C-Code liegt. Danke im vorraus. Luffy.
Luffy Monkey schrieb: > gleiche Fehlermeldung. Die Fehler lautet: ../datenaustauch.c:71: error: > too few arguments to function 'uart_init' . > Bitte , kann jemand von euch mir bescheid sagen, wo genau die Fehler in > meinem C-Code liegt. Der ist aber schon ziemlich selbsterklärend. Das ist deine Funktion
1 | void uart_init( unsigned int ubrr) |
die will also ein Argument haben (die Baudrate ausgedrückt in internen Einheiten) und so rufst du die Funktion auf:
1 | uart_init(); |
Was stimmt da jetzt nicht zusammen?
Hi Karl, ich habe meine definierte Funktion wieder folgendermaße aufgerufen : void uart_init(ubrr); . Das Programm laüft aufwandfrei! Aber ich bekomme nicht über das Hyprterminal die Daten, die gesendet wurde. Jetzt kann mein Rechner sich nicht mehr mit dem Debbuger in Verbindung setzen. Ich weiß nicht woran das liegt. Spinnt jetzt mein Rechner oder der Debbuger. Meine modifizierte c-Code lautet: #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #define F_CPU 3686400 //#define _OPTIMIZE_ // Baudrate #define BAUD 9600UL // Berechnungen zur Baudrate: #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 char string[10]; void uart_init( unsigned int ubrr) { //Set baud rate UBRR0H = (unsigned char)(ubrr>>8); UBRR0L = (unsigned char)ubrr; //Enable receiver and transmitter UCSR0B = (1<<RXEN0)|(1<<TXEN0); // Set frame format: 8data, 2stop bit UCSR0C = (1<<USBS0)|(3<<UCSZ00); } void uart_putdata( unsigned char data ) { //Wait for empty transmit buffer while ( !( UCSR0A & (1<<UDRE0)) ); //Put data into buffer, sends the data UDR0 = data; return 0; } unsigned char uart_receive( void ) { // Wait for data to be received while ( !(UCSR0A & (1<<RXC0)) ); // Get and return received data from buffer return UDR0; } void uart_puts (char *s) { while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ uart_putdata(*s); s++; } } void main( void ) { int32_t j,k; int32_t i =12241; float f=-12.12; void uart_init(ubrr); //uart_init(); // USART initialisieren uart_puts("\r\n\n\n"); // sendet einen kleinen Begrüßungstext. uart_puts("**** Hallo! Dies ist ein ADNS2610 Test ****\r\n"); uart_puts("\r\n"); uart_puts("Koord: "); uart_puts("\r\n"); j=itoa(i,string,10); uart_puts("J= "); uart_puts(j) ; uart_puts("\r\n"); uart_puts("K= "); uart_puts(dtostrf( f, 6, 2, string )); uart_puts("\r\n"); while(1) {;//uart_puts("Ende \r\n");; } return 0; } Läuft zufällig das Programm bei euch ? Viele Grüße !!
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.