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.
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
charstring[10];
15
16
voiduart_init(unsignedintubrr)
17
{
18
//Set baud rate
19
UBRR0H=(unsignedchar)(ubrr>>8);
20
UBRR0L=(unsignedchar)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
voiduart_transmit(unsignedchardata)
28
{
29
//Wait for empty transmit buffer
30
while(!(UCSR0A&(1<<UDRE0)));
31
//Put data into buffer, sends the data
32
UDR0=data;
33
return0;
34
}
35
36
unsignedcharuart_receive(void)
37
{
38
// Wait for data to be received
39
while(!(UCSR0A&(1<<RXC0)));
40
// Get and return received data from buffer
41
returnUDR0;
42
}
43
44
voiduart_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
voidmain(void)
58
{
59
int32_tj,k;
60
int32_ti=12241;
61
floatf=-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
return0;
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
voiduart_init(unsignedintubrr)
die will also ein Argument haben (die Baudrate ausgedrückt in internen
Einheiten)
und so rufst du die Funktion auf:
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 !!