WinAVR / UART Neuling braucht Unterstützung

Gast #76761
Hi,



ich habe erst vor kurzem angefangen mich für die Welt der AVRs zu
interessieren. Schnell habe ich mir das hier erhältliche Boards inkl.
ISP bestellt, sowie einen Atmel 90S4433. Ich entwickle in C mit WinAVR
und progge meinen Chip mit PonyProg2000 unter Win NT.

Ich habe 2 Probleme, bei denen ihr mir sicher helfen könnt, ist
bestimmt nur 'ne Kleinigkeit.

Wenn ich in meiner Main-Methode (nicht innerhalb einer Schleife!!!)
einen Character ans UART sende, dann empfängt mein Hyperterminal dieses
Zeichen andauernd, hört gar nicht mehr auf. Das gleiche passiert, wenn
ich das Zeichen aus einer Methode heraus, die in der Main aufgerufen
wird, schicken will. Schicke ich das Zeichen in einem Interrupt, dann
funktioniert's wunderbar.

Das 2. Problem ist, dass immer, wenn ein Zeichen aus diesem Interrupt
gesendet wird, direkt die LED ausgeht. Ich schicke mal ein paar
Codeauszüge mit...

So schicke ich Zeichen ans UART:

void uart_putchar(char c)
{
  if (c == '\n')
    uart_putchar('\r');
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
}

Das ist mein Interrupt:

SIGNAL(SIG_UART_RECV) {

  if(inp(UCSRA) & (1 << RXC)) {
    switch (inp (UDR)) {
      case '0':
        turnOffLEDC5();
        break;
      case '1':
        turnOnLEDC5();
        break;
      default:
        break;
    }
           uart_putchar(inp(UDR));
  }
}

Meine Main:

int main(void) {

  PORTC = 0xff;
  DDRC  = 0xff;
  outp((1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN), UCSRB);
  outp(CONTROLLER_BAUD_RATE, UBRR);

  uart_putchar('x');

  sei();

  for(;;) {
    turnOnLEDC5();
    delay(1000000);
    turnOffLEDC5();
    delay(1000000);
  }
  return 0;
}

Bin für jede Hilfe dankbar,



Dennis
Gast
Wie Alexander schon geschriebnen hat: der TXC-Intterrupt wird aktiviert.
Aber ich sehen keinen Interrupt-Handler fuer diesen. Was wohl passiert:

- UART wird initialisiert
- Zeichen wir gesendet
- TXC Int Flag wird gesetzt (implizit)
- Interrupts werden global aktiviert
- da TXC Int-Flag gesetzt wird ein Sprung zur Adresse des entsp.
Handlers ausgeloest.
- Handler existiert nicht, Adresse laeuft ins Leere -> Reset
- UART wird initialisiert .... usw. usw.
also wohl: UCSRB=(1<<RXCIE) | (0<<TXCIE) | (1<<RXEN) | (1<<TXEN)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.