PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega48 Uart Wahnsinn



Ls4
14.11.2009, 11:51
Hallo,

der Uart des Atmega48 macht mich Wahnsinnig.
ich bringen die Kiste einfach nicht dazu mir simple Characters an den PC zu senden.
Mittlerweile habe ich sehr viele Beispiele getestet und mich durch das Datenblatt gehangelt. (Entsprechend auch selber mal Code dafür geschrieben).
Fazit. Keiner der Codes funktioniert auch nur irgendwie.
Es kommt absolut nichts an am Pc.
Ich habe dann am Schluß den Code von dieser Seite probiert:
http://derjulian.net/mikrocontroller#usart
Enttsprechend eben die Registernamen für den Atmega48/88 geändert
Betrifft:
UBRRH in UBRR0H
UBRRL in UBRR0L
UCSRA in UCSR0A
UCSRB in UCSR0B
TXEN in TXEN0
RXEN in RXEN0
UDRE in UDRE0
und UDR in UDR0

in der UART.h hab ich folgendes verwendet
#define F_CPU 16000000UL
#define UART_BAUD_RATE 2400

senden wollte ich dann mit folgendem Code:
int main(void)
{
/* Programmcode */
uart_init(1, 1);
while(1){
_delay_ms(1000);
uart_puts("Hello World!\n");
}
return(0);
}

Fuses sind wie folgt:
SPIEN programmed
CKSEL3 programmed
das ergibt dann:
efuse 01
lfuse DF
hfuse F7

und effektiv dann
Programmierung über ISP
externer Full Power Oszillator mit 0.4MHZ-20MHZ mit slow rising Power

Als Quarz hängt ein 16MHZ dran.

Ich wäre sehr dankbar wenn jemand mir helfen könnte den Fehler zu finden.
Ich bin mir auch nicht sicher ob die Schnittstellenhardware (max232) funktioniert.

Ich würde mich auch für den Test über ein funktionierendes hex Program für den Atmega48 oder 88 (sind ja fast gleich) freuen, dann kann ich die Hardware als Ursache vielleicht eliminieren

Vielen Dank,

Gruß Tim

sternst
14.11.2009, 12:51
Ich würde mich auch für den Test über ein funktionierendes hex Program für den Atmega48 oder 88 (sind ja fast gleich) freuen, dann kann ich die Hardware als Ursache vielleicht eliminierenDu kannst die Hardware viel besser überprüfen, indem du direkt am Chip TX und RX verbindest (*). Im Terminalprogramm musst du dann ein Echo bekommen. Stell nur sicher, dass das kein lokales Echo ist. ;-)

(*) Wenn DIP, Chip dafür einfach aus der Fassung nehmen. Ansonsten den Chip für den Test im Reset halten.


SPIEN programmed
CKSEL3 programmed
das ergibt dann:
efuse 01
lfuse DF
hfuse F7 Die HEX-Werte stimmen nicht mit deiner Beschreibung überein, also checke das nochmal.
EDIT: Du hast lfuse und hfuse vertauscht.

Besserwessi
14.11.2009, 14:12
Wenns denn sein muß könnte ich schon einen Beispielcode beisteuern. Ein funktionieren der C Code sollte besser sein als ein .hex file. Ich hätte z.B. ein einfaches UART Echo.
Sollte gehen, habe nur mein restliches Programm entfernt um den Code kurz zu halten. Gff die Datenrichtungen ein bischen anpassen, je nach Hardware.




#include <inttypes.h>
#include <avr/io.h>

#define BAUD 1200UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)

// USART initialisieren
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRR0H = (uint8_t) (UBRR_BAUD>>8);
UBRR0L = (uint8_t) (UBRR_BAUD & 0x0ff);
// Aktivieren von receiver und transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
// Einstellen des Datenformats: 8 Datenbits, 2 Stoppbit
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);
}

void init_2(void)
{
DDRB = 63 ; // LED Driver outputs
DDRD = 254 ; // outputs except RXD
DDRC = 3+32 ; // PC0,PC1,PC5 outputs (LED Kathodes)
sei();
}

int main(void)
{
uint8_t buffer;

init_2(); // in/out initialisieren, interupts freigeben
uart_init(); // USART initialisieren

while ( !( UCSR0A & (1<<UDRE0)) ) ; // Warten bis der Sendepuffer frei ist
UDR0 = 'A';
while ( !( UCSR0A & (1<<UDRE0)) ) ; // Warten bis der Sendepuffer frei ist
UDR0 = 'B';

while (1)
{
// Warten bis Daten empfangen wurden
while ( !(UCSR0A & (1<<RXC0)) ) ;

// Empfangsregister auslesen
buffer = UDR0;

// Warten bis der Sendepuffer frei ist
while ( !( UCSR0A & (1<<UDRE0)) ) ;

// Daten in den Puffer schreiben und damit senden
UDR0 = buffer;
}
}

Ls4
14.11.2009, 14:53
Hallo,

vielen Dank für die Flotte Hilfe. Der Fehler war lächerlich!
Man sollte halt die Jumper richtig stecken, so dass die Pins auch mit dem Max232 verbunden sind. Dann gehts auch....

Gruß Tim