Forum: Compiler & IDEs ATMEGA64 USARTn INTERRUPT


von Hombre L. (hombrelobo)


Lesenswert?

hallo,
mache gerade meine ersten versuche mit einem atmega64.
lesen + schreiben auf der seriellen funktioniert.
jetzt moechte ich das lesen auf interrupt-gesteuert umstellen,
allerdings wird die ISR-routine nicht durchlaufen.

kann mir jemand sagen was ich vergessen habe ?

vorab merci

#include <avr/io.h>
#include <avr/interrupt.h>
#define USART1_RXC  _VECTOR(31)

void USART1_init(unsigned int baud){
       UBRR1H=(unsigned char)(baud>>8);
       UBRR1L=(unsigned char) baud;
       UCSR1B = (1<<RXEN1 )  | (1<<TXEN1) ;
       UCSR1B |= (1<<RXCIE1);  // interrupt aktivieren
       UCSR1C = (3<<UCSZ10);
}

void USART1_transmit(unsigned char data){
       while( !(UCSR0A & (1<<UDRE1)) )
            ;
       UDR1=data;
}

ISR(USART1_RXC){
       unsigned char c;
       DDRB|=(1<<PB6);    // test, ob routine leauft
       c=UDR1;
       USART1_transmit(c);
}

int main(void){
       sei();
       USART1_init(25);
       while(1)
           ;
       return 0;
}

von Johannes M. (johnny-m)


Lesenswert?

Warum definierst Du den Interrupt-Vektor selber? Dafür gibt es doch die 
in der Headerdatei definierten. Versuch es mal mit
1
ISR(USART1_RXC_vect)
2
{}
Außerdem ist es nicht grad die feine Art, aus einem Interrupt Handler 
heraus eine Funktion mit einer Warteschleife aufzurufen.

Ansonsten: Weißt Du sicher, dass die ISR nicht ausgeführt wird, und wenn 
ja, woher? Und mit welcher Taktfrequenz läuft der µC?

von Hombre L. (hombrelobo)


Lesenswert?

Johannes M. wrote:
> Warum definierst Du den Interrupt-Vektor selber? Dafür gibt es doch die
> in der Headerdatei definierten. Versuch es mal mit
>
1
> ISR(USART1_RXC_vect)
2
> {}
3
>

Den hatte ich zuerst, wird aber mit einer compilerwarnung
(misspelled signal handler) quittiert.

> Außerdem ist es nicht grad die feine Art, aus einem Interrupt Handler
> heraus eine Funktion mit einer Warteschleife aufzurufen.

Ja, weiss ich - bleibt auch nicht so - ist nur ein echo zum testen

> Ansonsten: Weißt Du sicher, dass die ISR nicht ausgeführt wird, und wenn
> ja, woher? Und mit welcher Taktfrequenz läuft der µC?

Ich schalte als erstes in der ISR eine LED, die aber nicht angeht.
Die Taktfrequenz ist 1 Mhz

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hombre Lobo wrote:

> Den hatte ich zuerst, wird aber mit einer compilerwarnung
> (misspelled signal handler) quittiert.

Der Vektor heißt auch USART1_RX_vect.

von Hombre L. (hombrelobo)


Lesenswert?

ui, klasse - vielen dank - jetzt läuft es :)

hatte die vektorbezeichnung irgendwo aus der doku und mich schon
sehr gewundert ueber die compilerwarnung

von Johannes M. (johnny-m)


Lesenswert?

Jörg Wunsch wrote:
> Der Vektor heißt auch USART1_RX_vect.
Hupps, da hab ich mich doch glatt vertippt...;-)

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.