PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 vs. Atmega32, UART Interrupt funzt bei 32 nicht



batti112
05.08.2004, 01:00
Hi!
Ich habe ein für mich unerklärbares Problem.
Habe auf einem Atmega8 das UART (USART) genutzt, und wollte nun zum Atmega32 umsteigen
(empfang mittels Interrupt).
Nun ja, ich dachte ich würde einfach die Headerfiles austauschen und es funzt, aber so einfach scheint das nicht zu sein.
Habe die Headerfile " iom8.h " durch "iom32.h" ausgetauscht, ansonsten ist das Programm das gleiche geblieben (An den Headerfiles kann es nicht liegen).
Auch die Register die ich anspreche sind beim 8. und beim 32 die selben.
Als Compiler nutze ich den avr-gcc.

Ich bin echt ratlos, kann mir da irgendjemand helfen?

MfG
Batti

************************************************** *******************************
#include <iom32.h>
#include <interrupt.h>
#include <sig-avr.h>


SIGNAL(SIG_UART_RECV)
{
uart_send( inp(UDR) );
}

void init_uart()
{
outp( (CPU_Frequency / (UART_Baud_Rate*16L)) - 1 , UBRRL );
outp( 0, UBRRH );
outp( (1 << URSEL) | (3 << UCSZ0), UCSRC);
outp( (1<<RXCIE) | (1<< TXEN) | (1<<RXEN), UCSRB);
}

void uart_send(char character)
{
loop_until_bit_is_set( UCSRA, UDRE );
outp( character, UDR );
}

int main()
{
init_uart();
uart_send('H');
uart_send('a');
uart_send('l');
uart_send('l');
uart_send('o');
uart_send(10);
uart_send(13);
sei();
while(1);



return 0;
}

**********************************************

batti112
05.08.2004, 01:07
Huch ein sehr wichtiges Detail hab ich wohl vergessen. :-/
Also das senden funktioniert auch beim 32 perfekt.
Nur das Empfangen per Interrupt funktioniert nicht, habe schon probiert ob das "Global Interrupt Enable Flag" oder wie das heißt durch "sei()" richtig gesetzt wurde, dies scheint allerdings der Fall zu sein.

batti112
18.09.2004, 16:06
Problem ist gelöst.... ;-)

Kjion
18.09.2004, 22:11
Noch eine kleine Anmerkung : Du solltest das hier

#include <iom32.h>
#include <interrupt.h>
#include <sig-avr.h>

durch das hier ersetzten:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

Dann müsstest du nichtmal das Headerfile ändern. Und außerdem funktioniert dein Code nach dem übernächsten Compilerupdate immer noch ;-) Das was du geschrieben hast ist als "deprecated" markiert ( also veraltet ), sollte deshalb nicht verwendet werden...

MfG Kjion

batti112
20.09.2004, 21:14
Danke für den Tipp Kjion!
Komme damit aber nicht ganz klar.
Ich muss doch dem Compiler "mitteilen" um welchen µC es sich handelt...

MfG
Batti

eFFex
20.09.2004, 21:57
das sagst du ihm doch im makefile, wenn ich mich nicht irre...

Kjion
21.09.2004, 13:03
Genau. Einfach im Makefile einstellen, dann wird mit dem #include <avr/io.h> automatisch die richtige Definitionsdatei geladen...

MfG Kjion