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


von Dennis Grundmann (Gast)


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

von Alexander (Gast)


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

von Dennis Grundmann (Gast)


Lesenswert?

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


Dennis

von mthomas (Gast)


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)

von Dennis Grundmann (Gast)


Lesenswert?

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

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.