Forum: Mikrocontroller und Digitale Elektronik Datenübertragung von PC zum Atmega88


von Luffy M. (monkeydluffy)


Lesenswert?

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.

von irgendwer (Gast)


Lesenswert?

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.

von oldmax (Gast)


Lesenswert?

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

von Luffy M. (monkeydluffy)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?

von Luffy M. (monkeydluffy)


Lesenswert?

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
Noch kein Account? Hier anmelden.