www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interruptgesteuerter Datenempfang über Virtual Comport (AT91SAM7S256)


Autor: Thomas L. (santos10)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe das Beispiel Programm "AT91SAM7S-USART_USB_SAM7S" von Martin 
Thomas in den AT91SAM7S256 mit einem selbstgebautem Wiggler und Openocd 
flashen können. Das Programm läuft stabil und ich kann über dem Programm
"HTerm" Strings zwischen der RS232 und dem virtuellen Comport hin- und
her schicken.

Jetzt habe ich versucht, den Datenempfang am virtuellen Comport
Interrupt gesteuert zu machen. Es soll ein Interrupt ausgelöst werden,
wenn ich über HTerm (virtueller Comport) ein Character über der
Tatastur eingebe. In der Interrupt Service Routine soll die READ
Funktion aus "cdc_enumerate.c" aufgerufen werden. Die READ Funktion
habe ich aus der while(1) in main.c rausgenommen. Den USB Interrupt
habe ich folgendermaßen im AIC konfiguriert:

(in cdc_enumerate.c)

void AT91F_USB_Interrupt_Enable(void)

{
  AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_UDP , 0, 0, usb_isr);

  AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);

  AT91F_UDP_EnableIt(AT91C_BASE_UDP, (1<<1));
//ENDPOINT 1 Interrupt

}


Die Definition von usb_isr (ebenfalls in cdc_enumerate.c)

void usb_isr(void)
{
       unsigned int length;
       char Daten[MSG_SIZE];
       struct _AT91S_CDC pCDC_Interrupt;

       length = pCDC_Interrupt.Read(&pCDC_Interrupt, Daten, MSG_SIZE);
       Daten[length]=0;
}

In der main.c habe ich aus der while(1) Schleife

length = pCDC.Read(&pCDC, Daten, MSG_SIZE);
Daten[length]=0;

herausgenommen. In main.c habe ich

AT91F_USB_Interrupt_Enable();

while(1)

{

........

}

eingefügt.

In der Funktion AT91F_UDP_EnableIt setze ich das ENDPOINT 1 Interrupt
Flag im UDP_IER. Wenn ich das ganze auf den µC flash, wird der USB
Anschluß nicht mehr als virtueller Comport erkannt. Mit dem ENDPOINT 1
als Interrupt Quelle bin ich mir nicht so sicher, ob dies stimmt.  Wie
kann ich ein Receive Data Interrupt beim virtuellen Comport
realisieren? Also wie ein "RXRDY: RXRDY Interrupt" bei der echten
"RS232".

Hat jemand vielleicht einen Tipp?
Danke im voraus!

Thomas

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.