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