www.mikrocontroller.net

Forum: Compiler & IDEs WinAVR / UART Neuling braucht Unterstützung


Autor: Dennis Grundmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum TXCIE = 1 ?
Nimm das raus und es sollte gehen oder schreibe dafür eine extra
SIGNAL-Routine. Ich hatte mal dasselbe Problem.

Alex

Autor: Dennis Grundmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie, eine extra Singal-Routine? Trotzdem muss ich doch beim
Initialisieren den Interrupt aktivieren?


Dennis

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Dennis Grundmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie oben geschrieben handelte es sich nur um Codefragmente, aber ihr
habt wohl trotzdem Recht. :) Vielen Dank!!!

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.