Forum: Mikrocontroller und Digitale Elektronik UART Kommunikation


von Steff G. (steff_123)


Lesenswert?

Hallo Leute, so jetzt bin ichs nochmal.

Ich bin heut schon fast am verzweifeln, weil ich versuche eine 
Verbindung zwischen meinem Arduino Mega2560 Board und dem PC aufzubauen.
Das ganze soll ohne die Arduino IDE durchgeführt werden.
-> C-Program über Atmel Studio 7

Das Ziel ist eigentlich die Bibliothek von Peter Fleury zu verwenden.
(ebenfalls probiert und das Programm läuft auch nicht)

Da das aber jetzt nicht geklappt hat wollte ich es vorerst mal ohne die 
Bibliothek probieren - leider funktionierts wieder nicht.

Eig. sollte das Board z.B. test empfangen und wieder an den PC 
zurückschicken.
Als Terminalprogramm verwende ich das von Atmel Studio bereitgestellte.
1
#define FOSC 16000000 // Clock Speed
2
#define BAUD 9600
3
#define MYUBRR FOSC/16/BAUD-1
4
#include <avr/io.h>
5
unsigned char USART_Receive( void )
6
{
7
    /* Wait for data to be received */
8
    while ( !(UCSR0A & (1<<RXC0)) )
9
    ;
10
    /* Get and return received data from buffer */
11
    return UDR0;
12
}
13
void USART_Transmit( unsigned char data )
14
{
15
    /* Wait for empty transmit buffer */
16
    while ( !( UCSR0A & (1<<UDRE0)) )
17
    ;
18
    /* Put data into buffer, sends the data */
19
    UDR0 = data;
20
}
21
void USART_Init( unsigned int ubrr)
22
{
23
    /* Set baud rate */
24
    UBRR0H = (unsigned char)(ubrr>>8);
25
    UBRR0L = (unsigned char)ubrr;
26
    /* Enable receiver and transmitter */
27
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
28
    /* Set frame format: 8data, 1stop bit */
29
    UCSR0C = (3<<UCSZ00);
30
    //UCSR0C |= ((1<<UCSZ01) | (1<<UCSZ00));
31
}
32
int main(void)
33
{
34
    USART_Init ( MYUBRR );
35
    
36
    /* Replace with your application code */
37
    while (1)
38
    {
39
        USART_Transmit(USART_Receive());
40
    }
41
}

Über jegliche Hilfe wäre ich dankbar.

von Falk B. (falk)


Lesenswert?

@Stefan G. (steff_123)

>Ich bin heut schon fast am verzweifeln, weil ich versuche eine
>Verbindung zwischen meinem Arduino Mega2560 Board und dem PC aufzubauen.

Woran die Jugend heute schon verzweifelt . . .

>Das ganze soll ohne die Arduino IDE durchgeführt werden.
>-> C-Program über Atmel Studio 7

Warum? Bist du schon soooo fit, das ohne Arduino hinzukriegen? Ist die 
Arduino-Funktion sooo schlecht?

>Das Ziel ist eigentlich die Bibliothek von Peter Fleury zu verwenden.
>(ebenfalls probiert und das Programm läuft auch nicht)

Die macht am Ende auch nicht mehr als der Arduino, denn der hat auch 
einen Software-FIFO.

Dein Programm sieht erstmal OK aus. Versuch erstmal, nur "Hello World" 
zu senden und per PC zu empfangen. Richtigen COM-Port am PC ausgewählt? 
Nimm mal ein normales Terminalprogramm, Tera Term ist gut.

von Jim M. (turboj)


Lesenswert?

Da fehlt das DDR Bit für den TX Pin, der muss IIRC auf Output stehen.

von Falk B. (falk)


Lesenswert?

Nö, das wird beim UART automatisch gesetzt.

von Stefan F. (Gast)


Lesenswert?

Test zuerst mal mit einer Loopback Verbindung:

Lege den REST Pin des µC fest auf Low, damit er inaktiv bleibt.
Mach dann eine Brücke von Rx nach Tx.

Dann schau mit einem Tewrminalprogramm, ob die gesendeten Texte zurück 
kommen.

Wenn das nicht funktioniert, hast du ein Problem auf dem PC oder der 
USB-UART Chip funktioniert nicht.

Erst danach würde ich die eigene Software untersuchen, weil das 
schwieriger ist.

Zur Berechnung der Baudrate solltest du die setbaud.h bentzen, um Fehler 
zu vermeiden. Sie ist in der avr-libc ausführlich dokumentiert - sehr 
lesenswerter Stoff.

von Karl B. (gustav)


Lesenswert?

Hi,
meiner ehrlichen Meinung nach fehlt der Max232 oder ähnlicher 
Schnittstellenbaustein auf dem

http://circuit-diagramz.com/wp-content/uploads/2016/05/Schematic-Circuit-Diagram-for-Arduino-Mega-2560.jpg

Mega Board.

Die Kommunikation mit dem PC erfolgt nach alter Väter Sitte nach dem 
V24er Standard und Rs232 Protokoll mit + - 12V über  Sub D Min 9 pol 
male socket am PC ?....
Oder wieder über den ("ominös hostmäßig umgebogenen") USB Port?

ciao
gustav

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Karl B. (gustav)

>meiner ehrlichen Meinung nach fehlt der Max232 oder ähnlicher
Schnittstellenbaustein auf dem>

>http://circuit-diagramz.com/wp-content/uploads/201...
>Board.

Wer redet in dieser Diskussion von diesem Board? Zumal der Link nicht 
funktioniert.

>Oder wieder über den ("ominös hostmäßig umgebogenen") USB Port?

Der ArduinoMEGA hat eine USB-Anbindung mit virtuellem COM-Port.

von Karl B. (gustav)


Lesenswert?

Stefan U. schrieb:
> Wenn das nicht funktioniert, hast du ein Problem auf dem PC oder der
> USB-UART Chip funktioniert nicht.

Falk B. schrieb:
> Wer redet in dieser Diskussion von diesem Board? Zumal der Link nicht
> funktioniert.


Stefan G. schrieb:
> Ich bin heut schon fast am verzweifeln, weil ich versuche eine
> Verbindung zwischen meinem Arduino Mega2560 Board und dem PC aufzubauen.

Hier nochmal der Link

http://circuit-diagramz.com/wp-content/uploads/2016/05/Schematic-Circuit-Diagram-for-Arduino-Mega-2560.jpg

Also USB, alles andere vergessen.

Wie wird jetzt der USB-Port richtig konfiguriert?

ciao
gustav

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Karl B. (gustav)

>Wie wird jetzt der USB-Port richtig konfiguriert?

Das macht die Installation der Arduino-IDE schon richtig.

@OP

Schreib mal ein kleines Testprogramm in der Arduino-IDE, dann weißt du, 
ob das damit funktioniert.

von dünnwandiger Flachbandtroll (Gast)


Lesenswert?

Das Einfachste ist Das USRT zu initialisieren und einen Character 
repetitiv zu senden, zum Beispiel 0x55, zB alle Sekunde. Daran kann man 
mit dem Oszilloskop schon die Baudrate kontrollieren.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:
> Schreib mal ein kleines Testprogramm in der Arduino-IDE, dann weißt du,
> ob das damit funktioniert.



Stefan G. schrieb:
> Das ganze soll ohne die Arduino IDE durchgeführt werden.
> -> C-Program über Atmel Studio 7

OK.
Testprog. in ASM füt ATMega32U2 beigefügt. Ist nicht derselbe MC. OK.
Die Strings sind vergleichbar können sicher auf die korrekte 
Target-"Syntax"  umgeschrieben werden.


Achtung!

Der Bootloader wird evtl. überschrieben.
Überneme keine Garantie für zerschossene Target MCs und 
Kollateralschäden!!!
ciao
gustav

: Bearbeitet durch User
von Steff G. (steff_123)


Lesenswert?

Hallo Leute - vielen Dank für eure Tipps und Hinweise.
Dieses Forum ist echt klasse.

Karl B. schrieb:
>Der Bootloader wird evtl. überschrieben.
>Überneme keine Garantie für zerschossene Target MCs und
>Kollateralschäden!!!

Das ganze is mir doch bisschen zu heiß - versuche jetzt vorerst 
anwerweitig ans Ziel zu gelangen - aber danke für die Mühe.

Falk B. schrieb:
>Schreib mal ein kleines Testprogramm in der Arduino-IDE, dann weißt du,
>ob das damit funktioniert.

Habe ich gemacht und es funktioniert einwandfrei - sowohl senden als 
auch empfangen.
Somit sollte es kein hardwareseitiges Problem sein. (hoffe ich)

1. Mein erstes Testprogramm läuft jetzt.
   Falls ich jedoch über das Terminal "test" an das Board schicke 
bekomme
   ich nur "tes" zurück - also er schneidet nach 3 Buchstaben ab.
   Könnte mir hier evtl. jemand weiterhelfen.

2. Hab jetzt auch schon mal die Bilbiothek von Peter Fleury eingebunden 
und versuche einen Text an den PC zu senden:

Der Code ist der Beispielcode, der bei dir Bibliothek von Peter Fleury 
angehängt ist.
Es wird jedoch kein "Hallo" übertragen, sondern irgendwelche Zeichen.
Baudrate am Terminal ist auch auf 9600 eingestellt.
Habe ich hier irgendwas übersehen?

In Atmel Studio 7 habe ich sowohl die *.h & *.c Datei von Hr. Fleury 
"geaddet".
1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <avr/pgmspace.h>
6
#include <util/delay.h>
7
8
#include "uart.h"
9
10
/* define CPU frequency in Hz in Makefile */
11
#ifndef F_CPU
12
#define F_CPU 16000000UL
13
#endif
14
15
/* Define UART buad rate here */
16
#define UART_BAUD_RATE      9600      
17
18
19
int main(void)
20
{
21
    //unsigned int c;
22
    //char buffer[7];
23
    //int  num=134;
24
25
    
26
    /*
27
     *  Initialize UART library, pass baudrate and AVR cpu clock
28
     *  with the macro 
29
     *  UART_BAUD_SELECT() (normal speed mode )
30
     *  or 
31
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
32
     */
33
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
34
    
35
    /*
36
     * now enable interrupt, since UART library is interrupt controlled
37
     */
38
    sei();
39
    
40
    /*
41
     *  Transmit string to UART
42
     *  The string is buffered by the uart library in a circular buffer
43
     *  and one character at a time is transmitted to the UART using interrupts.
44
     *  uart_puts() blocks if it can not write the whole string to the circular 
45
     *  buffer
46
     */
47
  _delay_ms(1000);
48
  
49
    uart_puts("Hallo\n");
50
  
51
  while (1)
52
  {
53
  }
54
    
55
}

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Zum 1. Problem: Was passiert denn, wenn du mehr las "test" sendest. geht 
dann auch immer nur das letzte Zeichen verloren? Und was passiert, wenn 
du die drei Zeichen mit etwas Pause dazwischen sendest (geht beim Hammer 
Terminal übder den ASEND Button)?

Hast du die CPU Freuqenz im Makefile bzw in den Projekteinstellungen der 
IDE eingerichtet? Im Quelltext gehört das nicht hin und könnte schon die 
Ursache deines 2. Problems sein.

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.