USART1 RX Interrupt atmega 1284p

Gast #2740728
Lesenswert?
• ▲
▼
Hallo Leute,
ich bekomm meine zweite UART auf einem atmega 1284P einfach nicht mit 
Empfangsinterrupt zum laufen. Die "Uart enabled!" Meldung und die Punkte 
alle 100ms bekomme ich, aber immer wenn ich das RXCIE Flag setze hängt 
sich der uC beim ersten empfangenen Zeichen auf.
Ich hab im Manual gelesen, dass der Interrupt so lange feuert bis das 
RXC1 Flag gelöscht wird, aber das sollte ja in der ISR mit nextChar = 
UDR1 automatisch passieren, oder hab ich das missverstanden?
Hab auch versucht ISRs für sämtliche Vektoren zu definieren, falls da 
was im avr header faul ist, nutzt aber auch nix. Hat jemand einen Tipp? 
Überseh ich was?
Danke, Lukas

avr-gcc-4.3.5
avr-libc_1.6.8-2

1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
#ifndef F_CPU
6
#define F_CPU       20000000UL
7
#endif
8

9
#define BAUD    9600
10
#define bauddivider  (unsigned char)(1.0 * F_CPU / BAUD / 16 - 0.5)
11

12
unsigned char nextChar = '.';
13

14
void u1putchar( char c )
15
{
16
  while( !(UCSR1A & (1<<UDRE1)));
17
  UDR1 = c;
18
}
19

20

21
void u1puts( char *s )
22
{
23
  while( *s )
24
    u1putchar( *s++ );
25
}
26

27
ISR(_VECTOR(28))
28
{
29
  nextChar = UDR1;
30
}
31

32
int main( void )
33
{
34
    UBRR1 = bauddivider;
35
    UCSR1B |= _BV( TXEN1 ) | _BV( RXEN1 ) | _BV( RXCIE1 ); // enable TX, RX and Receive Interrupt
36
    sei();
37
     u1puts("Uart enabled!\n");
38
     for(;;) {
39
         if (nextChar != '.'){
40
            u1putchar(nextChar);
41
            nextChar='.';
42
         } else {
43
            u1putchar(nextChar);
44
         }
45
         _delay_ms(100);
46
     }
47

48
    return 0;
49
}
Gast #2740772
Lesenswert?
• ▲
▼
darauf bin ich auch gerade gekommen, aber das ändert's leider nicht, und 
erklärt auch nicht, wieso nach dem ersten empfangenen zeichen keine 
punkte mehr gesendet werden...
hab auch versucht mit einem Beinchen zu wackeln in der ISR, aber da 
scheint er gar nicht reinzuspringen...
Gast #2740783
Lesenswert?
• ▲
▼
danke für den tipp, ich werd mal reinsehen, hab zwar keine ASM 
kenntnisse, aber vielleicht erkenn ich's ja. worann könnte das liegen, 
dass er nicht in die ISR springt sondern sich lieber verabschiedet?
Gast #2740789
Lesenswert?
• ▲
▼
Check auch die Projekteinstellungen - nicht dass du dort aus versehen 
statt Atmega1284P den Atmega1281 oder den Atmega128 eingetragen hast. 
Alle drei haben den UART1-RX Vektor an einer anderen Tabellenposition.
Gast #2740796
Lesenswert?
• ▲
▼
Ich verwende deshalb _VECTOR(28) statt der defines, die nummer kommt aus 
dem Datenblatt. Das iom1284p.h file hab ich auch angesehen, aber die 
Interruptvektoren scheinen richtig definiert zu sein...

Als compiler option hab ich -mmcu=atmega1284p, das sollte doch dann 
passen oder?
hab avrdisas installiert (linux) und versuch grade zu disassemblen...
danke für die schnelle Hilfe...
Gast #2740807
Lesenswert?
• ▲
▼
Oh mann bin ich blöd, hattest doch recht, ich habe zwar in den general 
options -mmcu=atmega1284p, aber im "Release" target einen anderen...
verdammt. Jetzt gehts.
Danke, da hätte ich noch lang gesucht!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.