Forum: Mikrocontroller und Digitale Elektronik AVR32 RS232 Probleme


von Thorsten G. (stubi2)


Lesenswert?

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.

von Thorsten G. (stubi2)


Lesenswert?

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.

von Gemed I. (bobkins)


Lesenswert?

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
}

von Gast (Gast)


Lesenswert?

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....

von 1234 (Gast)


Lesenswert?

Ein AVR32 ? Ein etwas hoher Einstieg fuer die kleine Ahnung...

von Gast (Gast)


Lesenswert?

1234 (Gast) wrote:
> Ein AVR32 ? ....

na toll, da können wir dann raten:
ein AT32AP700x
oder
ein AT32UC3A
oder
ein AT32UC3B
?

von Thorsten G. (stubi2)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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.

von Thorsten G. (stubi2)


Lesenswert?

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