Brauche dringend Hilfe - UART Anfängerproblem

Gast #3372406
Lesenswert?

Hallo zusammen,

ich nutze ein Alvidi - Evalboard mit einem AT90CAN128.

Leider bereitet mir der UART einige Probleme.
Zum Test habe ich mal die Software vom OLIMEX - Board aufgespielt.
1
/*
2
 * UART.c
3
 
4
/*  Sample program for Olimex AVR-CAN with AT90CAN128 processor
5
 *  Echoes back the received characters on the USART0.
6
 *  Compile with AVRStudio+WinAVR (gcc version 3.4.6)
7
 */
8

9
#define  __AVR_AT90CAN128__  1
10
#define OSCSPEED  16000000    /* in Hz */
11

12
#include "avr/io.h"
13

14
void PORT_Init()
15
{
16
  PORTA = 0b00000000;
17
  DDRA = 0b00000000;
18

19
  PORTB = 0b00000000;
20
  DDRB = 0b00000000;
21

22
  PORTC = 0b00000000;
23
  DDRC = 0b00000000;
24

25
  PORTD = 0b00000000;
26
  DDRD = 0b00000000;
27

28
  PORTE = 0b00010000;    //Turn Led off (Bit4 = 1)
29
  DDRE = 0b00010010;    //Led set as output (Bit4 = 1), TX set as output (Bit1 = 1)
30

31
  PORTF = 0b00000000;
32
  DDRF = 0b00000000;
33
}
34

35
void WDT_Off(void)
36
{
37
  asm("push r30");  // using GCC without optimizations results in
38
  asm("ldi r30, 0x18");  // a code not meeting the requirements
39
  asm("sts 0x60, r30");  // of the datasheet.
40
  asm("ldi r30, 0x7");
41
  asm("sts 0x60, r30");
42
  asm("pop r30");
43
  WDTCR = (1<<WDCE) | (1<<WDE);
44
  WDTCR = 0x07;          //increase Watchdog time-out period (Bit0,1,2 = 1)
45
}
46

47
void UART_Init(uint32_t Baud)
48
{
49
  unsigned int BaudRate = OSCSPEED / (16 * Baud) - 1;  //calculate BaudRate
50
  //set BaudRate into registers
51
  UBRR0H = (unsigned char) (BaudRate>>8);
52
  UBRR0L = (unsigned char) BaudRate;
53

54
  UCSR0B = 0b00011000;    //enable TX(Bit4 = 1), RX(Bit3 = 1)
55

56
  UCSR0C = 0b00000110;    //set frame format (8 bits, 1 stop bit)
57
}
58

59
unsigned char UART_Receive()
60
{
61
  if (UCSR0A & 0b10000000)
62
    return UDR0;
63
  else
64
    return 0;
65
}
66

67
void UART_Transmit(unsigned char Data)
68
{
69
  while (!(UCSR0A & 0b00100000));
70
  UDR0 = Data;
71
}
72

73
int main()
74
{
75
  unsigned char Ch;
76
  WDT_Off();
77
  PORT_Init();
78
  UART_Init(9600);
79
  while (1)
80
  {
81
    asm("WDR");        //avoiding reset of the program
82
    Ch = UART_Receive();  //receiving char
83
    
84
    if (Ch)
85
    {
86
      UART_Transmit(Ch);  //returning char
87
    }
88
  }
89

90
}

Verdrahtet hab ich soweit alles richtig, da mir das Programm wie 
angegeben ein Echo vom gesendeten Befehl zurückliefert.
Jedoch stimmen die Rücksendezeichen nicht mit den gesendeten überein.

Siehe Bild im Anhang

Ich wäre sehr dankbar wenn mir jemand helfen könnte!

Vielen Dank!

Gruss
Angehängte Dateien:
Gast #3372416
Lesenswert?

>Jedoch stimmen die Rücksendezeichen nicht mit den gesendeten überein.

Deine CPU läuft nicht mit OSCSPEED würde ich da mal vermuten.
Dann stimmt die Baudrate nicht.

Lass mal ne LED blinken. Oder sende dauernd 0x55 und miss
mal mit dem Osci ob die Bitzeiten stimmen.
Gast #3372438
Lesenswert?

Danke Holger,

ich hab gerade gesehen, dass in meinen Fuses EXTOSC 8 MHz steht, ich 
verwende jedoch einen externen 16 MHz Quarz.

Jetzt stellt sich mir die Frage, warum in den Fuses von Atmel kein 16 
MHz Quarz zur Auswahl auftaucht???

Hat jemand eine Ahnung?

Danke!

Gruss
#3372457
Lesenswert?

Hallo TO,

ich verwende häufig 6.144kHz, 10.24kHz oder auch mal einen 3.579,545kHz 
Quarz und die laufen alle.

Man hört so in der Zene, dass das Datenblatt eine AVR µC die benötigten 
Informationen enthält.

Aber das nur unter vorgehaltener Hand. )-:

Tipp - nach dem lesen des DB:

Ich nutze dann gerne den *Engbedded Atmel AVR® Fuse Calculator*
- http://www.engbedded.com/fusecalc

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren