Forum: Mikrocontroller und Digitale Elektronik UART1 am ATmega128


von Jens K. (mister232)


Lesenswert?

Ich habe heute leider noch ein Anliegen:
Folgendes Programm soll über den UART1 eines ATmega128 die Nachricht 
"Test" ausgeben. Das Programm soll nur zum Test der UART-Schnittstelle 
dienen. Leider kann ich sowohl am PC, als auch mit einem Oszi direkt am 
Mikrocontroller nichts erkennen.
1
/*
2
 * TestUARTATmega128.c
3
 *
4
 * Created: 18.01.2016 13:52:28
5
 * Author : Jens
6
 */ 
7
8
#include <avr/io.h>
9
10
#define F_CPU 800000L
11
#define BAUD 9600L
12
#define MYUBRR F_CPU/16/BAUD-1
13
14
void debug_message(char *pt);
15
void init_uart2(uint32_t baudRate);
16
17
int main(void)
18
{
19
    uint8_t output;
20
    
21
    // Init UART
22
  init_uart2(MYUBRR);
23
  
24
    while (1) 
25
    {
26
    debug_message("Test\n\r");
27
    }
28
}
29
30
// Transmit a message through the debug interface (UART2)
31
void debug_message(char *pt)
32
{
33
  while(*pt != '\0')
34
  {
35
    while(!(UCSR1A & (1<<UDRE1))); // Wait while transmitter is busy
36
    UDR1 = *pt; // Write data to output register
37
    pt++;
38
  }
39
}
40
41
void init_uart2(uint32_t baudRate)
42
{
43
  uint8_t output;
44
45
  UBRR1L = (unsigned char) baudRate;   // Baudrate Low Byte
46
  UBRR1H = (unsigned char) (baudRate >> 8); // High Byte
47
  
48
  UCSR1B |= (1<<TXEN1) | (1<<RXEN1) | (1<<RXCIE1); // Enable receiver, transmitter and receive interrupt
49
  UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10); // Data format 8N1
50
51
  output = UDR1;                         // Reset receive register
52
}

von S. Landolt (Gast)


Lesenswert?

Fuse "ATmega103 compatibility mode" abgeschaltet?

von Dieter F. (Gast)


Lesenswert?

Du betreibst den mit 800kHz ?

#define F_CPU 800000L

von Jens K. (mister232)


Lesenswert?

Das waren die beiden Fehler danke!

von MitLeser (Gast)


Lesenswert?

trotzdem würde ich noch die CPU-Pins TxD und RxD auf
Ausgang bzw. Eingang initialisieren

von spess53 (Gast)


Lesenswert?

Hi

>trotzdem würde ich noch die CPU-Pins TxD und RxD auf
>Ausgang bzw. Eingang initialisieren

Warum? Mit Setzen von TXEN1 und/oder RXEN1 übernimmt die USART die 
Kontrolle über die PINs.

MfG Spess

von Dietrich L. (dietrichl)


Lesenswert?

Jens K. schrieb:
1
UCSR1B |= (1<<TXEN1) | (1<<RXEN1) | (1<<RXCIE1); // Enable receiver, transmitter and receive interrupt

Der Interrupt sollte nicht enabled werden, wenn er nicht benutzt wird 
und keine ISR vorhanden ist.
Es stört hier zwar nicht, da der gesamte Interrupt nicht enabled wurde. 
Aber wehe man fügt z.B. später noch einen Timerinterrupt hinzu und 
wundert sich dann über das komische Verhalten...

Gruß Dietrich

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.