PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : usart mit Interrupt



amal
23.03.2011, 11:30
hallo leute, ich bin eine Anfängerin in Mikrocontroller, und möchte gern eine Beispiel zum Laufen bringen, aber es geht irgendwie nicht, soll man vielleicht an dem Unterprogramm avr/interrupt.h was einstellen oder mache ich das falsch.
Bitte um Hilfe.
danke
hier ist meine Code


#include <avr/io.h>
#include <stdlib.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#ifndef UART_H
#define UART_H

#define F_CPU 3686400UL

#define BAUD 9600UL

void uart_init(void)
{
UCSR0B |= (1<<TXEN0) |(1<<RXEN0)|(RXCIE0<<1); // UART TX einschalten
UCSR0C |= (1<<UMSEL01)|(1 << UCSZ01)|(1 << UCSZ00); // Asynchron 8N1

UBRR0H = UBRR_VAL >> 8;
UBRR0L = UBRR_VAL & 0xFF;
}



ISR(USART_RX_vect)

{
uint8_t receiv;
while (!(UCSR0A & (1<<RXC0)))
receiv = UDR0;
UDR0=receiv;
PORTB = receiv;

}


int main(void)
{
DDRB=0xFF;
char Line[40]; // String mit maximal 39 zeichen

uint8_t c;
uart_init();

sei();


while (1)
{

*/
}

return 0; // never reached
}
#endif // UART_H



danke

.:Sebastian:.
23.03.2011, 13:35
Moin

Was genau geht nicht nicht ?

aber es geht irgendwie nicht
Kann ja alles heißen. (Aber meine Kristallkugel, wurde letztes Jahr konfisziert.)

Was vllt. noch wissen sollte :
Ein Schaltplan zu Hardware wäre nicht schlecht.
Konkret wäre nützlich zu wissen :
1) Wie ist der AVR mit dem PC verbunden ? (Ich vermute mal die übliche max232-Geschichte)
2) #define F_CPU 3686400UL -> Sieht für mich aus als wolltest du einen externen Quarz verwenden. Stimmt die Frequenz ? Und läuft der AVR damit überhaupt an ?

Was mir spotan einfällt :


while (!(UCSR0A & (1<<UDRE0)))
receiv = UDR0;
UDR0=receiv;
PORTB = receiv;
Sieht irgendwie seltsam aus.
Was soll da passieren ?

Wenn ich raten müsste würde ich sagen du meinst das :


while (!(UCSR0A & (1<<UDRE0)));
receiv = UDR0;
PORTB = receiv;
(Man beachte das neue Semikolon)

Gib mal ein paar mehr Infos, dann kann man dir auch helfen.

Gruß
Sebastian

PS:
http://www.rn-wissen.de/index.php/UART_mit_avr-gcc

amal
23.03.2011, 14:10
hallo sebastian,
ja die AVR ist mit PC über RS232 angeschlossen, und ich verwende einen externen Quarz(3686400Hz), und die Kommunikation zwischen PC und AVR läuft, was ich machen wöllte ist nur ein Test, ich habe eine Datei mit 12481248 als txt gespeichert, und über Hyperterminal rufe ich die Datei auf, und das soll erst in meinem HypTer zurückgegeben(receiv=UDR0) und dann am PORTB anzeigen. das war es.
danke
ein Fehler:
while (!(UCSR0A & (1<<RXC0)))
receiv = UDR0;
UDR0=receiv;
PORTB = receiv;

PicNick
23.03.2011, 14:27
(RXCIE0<<1)

das ist verdreht !



while (!(UCSR0A & (1<<RXC0)))
receiv = UDR0;
UDR0=receiv;
PORTB = receiv;


ist in der tat nicht ganz verständlich.


ISR(USART_RX_vect)
{
PORTB = UDR0;
}

sollte reichen, wenn der interrrupt mal funktioniert

amal
23.03.2011, 14:51
das Problem der Inerrupt funktioniert nicht

PicNick
23.03.2011, 15:02
GCC ist mit der schreibweise von
ISR(USART_RX_vect)
extrem heikel

veruchs mal so wie in dem Beispiel
http://www.rn-wissen.de/index.php/UART_mit_avr-gcc#Interrupt-Routinen

und nicht vergessen:
(RXCIE0<<1)

sollte heissen
(1 << RXCIE0)

amal
29.03.2011, 09:41
ja das war nur Schreibfehler, es lag daran((RXCIE0<<1)). danke