mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 644p-USART und Interrupt


Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit,
vermutlich ein banales Problem, bei dem ich irgendwas übersehe.

Ich sende über einen FT232R Daten an den USART0 eines Mega644p. Immer 
ein Byte dann eine Sekunde Pause. Beim Pollen werden die Daten gelesen 
ohne Probleme.

Jetzt will ich auf Interrupt umstellen und stelle fest, der 
USART0_RX_vect wird nicht ausgelöst, nachdem das Byte übertragen wurde.

Hier der Code im Mega:
#include "main.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include "Delay.h"

#ifndef F_CPU
  #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 16000000"
  #define F_CPU 16000000UL    // Systemtakt in Hz - Definition als unsigned long beachten >> Ohne ergeben Fehler in der Berechnung
#endif

#define BAUD 38400UL          // Baudrate
// #define BAUD 250000UL          // Baudrate

// 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.

#if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))
  #error Systematischer Fehler der Baudrate $BAUD_ERROR grsser 1% und damit zu hoch!
#endif

int main(){
  init_uart0();
  init_uart1();
  init();

  DDRC = 0xFF;
  PORTC = 0x55;

  for(;;){
  }
}

int init(){
  sei();
  cli();

  return 0;
}

int init_uart0(){
  UCSR0B |= (1 << RXEN0);
  UCSR0B |= (1 << RXCIE0);
  UCSR0B |= (1 << TXEN0);                // UART TX einschalten

  UCSR0C |= (1 << USBS0) | (3 << UCSZ00);    // Asynchron 8N1

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

  return 0;
}

int init_uart1(){
  UCSR1B |= (1 << RXEN1);
  UCSR1B |= (1 << RXCIE1);
  UCSR1B |= (1 << TXEN1);                // UART TX einschalten

  UCSR1C |= (1 << USBS1) | (3 << UCSZ10);    // Asynchron 8N1

  UBRR1H = UBRR_VAL >> 8;
  UBRR1L = UBRR_VAL & 0xFF;

  return 0;
}

ISR(USART0_RX_vect){
  uint8_t b = UDR0;
//   while (!(UCSR0A & (1 << RXC0)));
  PORTC = 0x00;
  Delay_ms(1000);
}

Baudrate ist 38400 auf beiden Seiten, Schnittstelle auf 8N1.
Fuses stehen auf

HFuse: D9
LFuse: FF

Quarz hängt einer mit 16MHz dran. Kompiliert mit avr-gcc unter 
Debian/Lenny und geflashed mit avrdude, falls das relevant sein könnte.

Wie gesagt, ich gehe davon aus, es ist was ganz banales und ich bin nur 
blind, aber ich sitze da jetzt seit 2 tagen und komm auf keinen grünen 
Zweig, da mir Google und Co. auch nicht weiterhelfen können.
Kann mich mal jemand mit der Nase auf den Fehler stossen?

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M.B. schrieb:
> cli();

Interrupts ausschalten ist keine gute Idee...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>der USART0_RX_vect wird nicht ausgelöst, nachdem das Byte übertragen wurde.

Wie soll er auch:

>int init(){
>  sei();
>  cli();
>return 0;

MfG Spess

Autor: M.B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh Mann ......
kann mir mal einer ne Bratpfanne überziehen? Ich  brauch dringend Urlaub 
.....

Danke für die Hilfe, ich komme mir verdammt blöd vor :(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.