Forum: Mikrocontroller und Digitale Elektronik UART ATMega64L


von Freshman (Gast)


Lesenswert?

Liebe Kollegen!!

Ich schaffe es nicht die UART auf meinem CEREBOT II Board mit einem 
ATMega64L zum laufen zu bringen. Zur Kontrolle ob Daten gesendet werde 
bzw. zum empfangen benutze ich Hypertermina.

Vielleicht ist jemand so lieb und sieht sich mein Programm an und gibt 
mir einen Tip bzw. sagt mir wo der Fehler liegt.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
//#include <avr/signal.h>
4
#include <inttypes.h>
5
#include <avr/delay.h>
6
//#include <avr/iom64.h>
7
8
ISR (USART1_RX_vect);
9
10
#define F_OSC 8000000               /* oscillator-frequency in Hz */
11
#define UART_BAUD_RATE 9600
12
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)
13
14
15
void visableDelay(uint8_t cnt)
16
{
17
  uint8_t c;
18
19
  // avr/delay.h  _dealy_loop_2() which takes a
20
  // uint16_t as its argument
21
  // provides a delay determined by the argument, 
22
  // this delay varies with processor speed
23
  // the value is fixed at 0x8000 for an the 8 mhz cerebot
24
  for(c = 0; c < cnt; c++)
25
  {
26
    
27
    _delay_loop_2(0x8000);      
28
  }
29
}
30
31
void usart_putc(unsigned char c) {
32
   // wait until UDR ready
33
  while(!(UCSR1A & (1 << UDRE1)));
34
  UDR1 = c;    // send character
35
  return;
36
}
37
38
39
40
void init(void) {
41
  // set baud rate
42
  
43
  UBRR1H = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)>>8);
44
  UBRR1L = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);
45
  UCSR1A = (1 << RXC1);
46
  // Enable receiver and transmitter; enable RX interrupt
47
  UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
48
49
  //asynchronous 8N1
50
  UCSR1C = (1 << UCSZ10) | (1 << UCSZ11) | (1 << UMSEL1); //| (1 << UCSZ00) | (1 << UCSZ11);
51
  return;
52
}
53
54
// INTERRUPT can be interrupted
55
// SIGNAL can't be interrupted
56
ISR (USART1_RX_vect) { // USART RX interrupt
57
  unsigned char c;
58
  PORTE &= ~(1 << PE6);
59
  c = UDR1;
60
  usart_putc(c);
61
  return;
62
}
63
64
int main(void) {
65
  DDRE = 0xf0;
66
  //PORTE |= (1 << PE6);
67
  init(); // init USART
68
    //PORTE |= (1 << PE6);
69
  sei();  // enable interrupts
70
  
71
  // send initial character
72
  while(!(UCSR1A & (1 << UDRE1)));
73
  UDR1 = 0x43; // "C"
74
  PORTE |= (1 << PE4);
75
  while(!(UCSR1A & (1 << UDRE1)));
76
  UDR1 = 0x0d;
77
78
  // enable  PD5 as output
79
  
80
  while (1) {
81
    // PIN5 PORTD clear -> LED off
82
    PORTE &= ~(1 << PE5);
83
    visableDelay(15);
84
    // PIN5 PORTD set -> LED on
85
    
86
    PORTE |= (1 << PE5);
87
    visableDelay(15);  
88
  }
89
  return 0;
90
}

DANKE für Eure Hilfe!!!

Freshman

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Was ist das Problem?
Kommen keine Zeichen? Falsche Zeichen?

BTW:
das hier
  UDR1 = 0x43; // "C"
könntest du auch so schreiben
  UDR1 = 'C'; // "C"

von Freshman (Gast)


Lesenswert?

Nein, weder am Hyperterminal (9600 Boud, 8 Datenbit, 1 Stopbit, keine 
Parität) noch auf dem Board (Led 6 geht nicht an).

Ich hab schon alles 3 mal kontrolliert aber es tut sich nichts. Ich komm 
einfach nicht auf den Fehler.

Freshman

von Justus S. (jussa)


Lesenswert?

Freshman schrieb:

> #define UART_BAUD_RATE 9600

mach daraus mal eine unsigned long..

von Freshman (Gast)


Lesenswert?

ich hab das UBRRIH ganz weggelassen und in´s UBRRIL 0x33 (für 51) 
geschrieben. Tut sich auch nichts.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>>  //PORTE |= (1 << PE6);
> (Led 6 geht nicht an).
Eigentlich klar, oder?

>>     PORTE |= (1 << PE5);
Blinkt wenigstens die LED 5?

von Freshman (Gast)


Lesenswert?

die Led 6 verwende ich in der ISR.

Ja, die Led 5 Blinkt und die 4er leuchtet.

von Karl H. (kbuchegg)


Lesenswert?

Hast du die Hardware (MAX232, Kabel) schon kontrolliert?

Prozessor aus dem Sockel nehmen. Den Tx Pin mit dem Rx Pin DIREKT IM 
SOCKEL mit einem Stückchen Draht brücken und nachsehen ob sich 
Hyperterminal selbst Zeichen schicken kann. Wenn nicht ist höchst 
wahrscheinlich das Kabel nicht richtig gekreuzt. Du kannst zb mit einer 
Led (+Vorwiderstand) auf die Suche gehen, wo die PC-Signale 
verschwwinden.

von Freshman (Gast)


Lesenswert?

Nein, ich habe ein Zwischenstück reingegeben, mit dem ich die Leitungen 
kreuzen kann. Tut sich immer noch nichts. Auch nicht wenn ich per Matlab 
an das Board sende oder empfangen will.

von gast (Gast)


Lesenswert?

hyperterm hab ich auch mel probiert und hatte anfangs probleme

it hterm http://www.der-hammer.info/terminal/  war es besser für mich 
als anfänger

von Freshman (Gast)


Lesenswert?

Ich hab schon mit dem Hyperterminal gearbeitet (hab einen FPGA 
angehängt), ich finde ihn nicht so schlecht.

Das Programm schau ich mir aber auf jeden Fall an, DANKE.

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.