Forum: Compiler & IDEs USART am atmega328p will nicht


von Killerawft (Gast)


Lesenswert?

Hallo.

Ich bin gerade dabei eine Schaltung mit einem Atmega328p in betrieb zu 
nehmen und wollte als erstes die Serielle Kommunikation mit dem PC 
herstellen, zum Debuggen. Die Schaltung mit dem MAX232 habe ich schon 
mit einem Attiny2313 getestet und die Funktioniert soweit. Mit meinem 
Atmega328p zeigt sich jedoch keine Regung.
Da ich den gesamten Aufbau schon mehrfach durchgemessen habe, und mit 
dem Attiny das ja auch schon funktionierte, vermute ich, dass ich bei 
der Programmierung einen Fehler habe.
Der Attiny lief mit 8Mhz und der Atmega soll mit 20Mhz laufen.
Ich programmiere jetzt das erste mal in C einen µC, vorher habe ich die 
in Basic programmiert. Daher habe ich das meiste auch aus dem Datenblatt 
des Atmegs und dem Internet. Ich habe auch schon verschiedenste 
Einstellungen für die Register ausprobiert, die ich im Internet gefunden 
habe, da die aus dem Datenblatt und die, die ich mir selbst überlegt 
hatte nicht funktionierten.

Mein Programm sieht so aus:
1
#define F_CPU 20000000UL
2
#define BAUD 9600
3
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <util/setbaud.h>
7
8
void UART_Init(void);
9
void UART_Transmit( unsigned char data );
10
void UART_Puts (char *s);
11
12
int main(void)
13
{
14
  UART_Init();
15
  
16
    while(1)
17
    {
18
       /* UART_Puts("Hallo");
19
    _delay_ms(1000);
20
    UART_Puts(" Du Da");
21
    _delay_ms(1000); */
22
     
23
     UART_Transmit('x');
24
     _delay_ms(2000);
25
    }
26
}
27
28
void UART_Init()
29
{
30
  /* Set baud rate auf 9600 */
31
  UBRR0H = UBRRH_VALUE;
32
  UBRR0L = UBRRL_VALUE;
33
34
  /*Enable receiver and transmitter*/ 
35
  UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
36
  
37
   /*Set frame format: 8data, 1stop bit, Asynchron*/
38
  UCSR0C |= (1<<UCSZ00) | (1<<UCSZ01);
39
40
  
41
}
42
43
void UART_Transmit( unsigned char data )
44
{
45
  /* Wait for empty transmit buffer */
46
  while ( !( UCSR0A & (1<<UDRE0)) )
47
  ;
48
  
49
  /* Put data into buffer, sends the data */
50
  UDR0 = data;
51
}

Ich übertrage das mit AVR Dude so:
1
-c stk500v2 -b 125000  -P COM5 -p m328p -U flash:w:$(ProjectDir)Debug\$(ItemFileName).hex:i

Und das sind meine eingestellten und eben ausgelesenen Fuses:
1
lfuse reads as F7
2
hfuse reads as D9
3
efuse reads as 7




Mit freundlichen Grüßen
Killerawft

von J.-u. G. (juwe)


Lesenswert?

In Deinem Code kann ich nichts problematisches finden. Ich würde 
zunächst mal testen, ob das:

> der Atmega soll mit 20Mhz laufen.

auch tatsächlich so ist (z.B. eine LED im Sekundentakt toggeln). Was für 
einen Oszillator hast Du denn als Taktquelle angeschlossen?

von Killerawft (Gast)


Lesenswert?

Ich habe als Taktquelle natürlich einen 20Mhz quarz angeschlossen und 
ich habe ein kleines Programm geschrieben, bei demdie LED im 
sekundentakt blinken sollte, jedoch leuchtet die nur schwach bei einer 
Pin ausgangsspannung von 2,5 Volt.

Das übertragene Programm sieht so aus
1
#define F_CPU 20000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
  DDRD = 0x01;
9
  
10
    while(1)
11
    {
12
        PORTD = 0x01;
13
    _delay_ms(1000);
14
    PORTD = 0x00;
15
    _delay_ms(1000);
16
    }
17
}

von Killerawft (Gast)


Lesenswert?

Falls jemand das selbe Problem hat, sag ich nochmal wie ich meins gerade 
gelöst habe. Ich hab ganz simpel einen neuen µC eingelötet. Der 
vorherige ist beim einlöten wohl etwas zu heiß geworden.

von Martin (Gast)


Lesenswert?

probiere mal das:
1
uint16_t baudvalue=((((F_CPU/16)/BAUD)+0.5)-1);
2
3
UBRR0H=(baudvalue>>8);
4
UBRR0L=baudvalue;

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.