mikrocontroller.net

Forum: FPGA, VHDL & Co. Nios II Embedded E. K. RS232 Interrupt


Autor: Franki C. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo Leute!

Arbeite momentan mit dem Nios II Embedded Evaluation Kit von Altera.
Ich bin dabei die RS232 Schnittstelle zu benutzen.
Daten senden und empfangen funktioniert bestens, jedoch wenn ich Daten 
per Interrupt empfangen möchten kommen noch Probleme auf.

Hier mal einige Abschnitte meines Programms:


Das steht in der "system.h"
/*
* uart_rs232 configuration
*
*/

#define UART_RS232_NAME "/dev/uart_rs232"
#define UART_RS232_TYPE "altera_avalon_uart"
#define UART_RS232_BASE 0x0a201280
#define UART_RS232_SPAN 32
#define UART_RS232_IRQ 18                        //wird gebraucht
#define UART_RS232_IRQ_INTERRUPT_CONTROLLER_ID 0
#define UART_RS232_BAUD 9600
#define UART_RS232_DATA_BITS 8
#define UART_RS232_FIXED_BAUD 0
#define UART_RS232_PARITY 'N'
#define UART_RS232_STOP_BITS 1
#define UART_RS232_SYNC_REG_DEPTH 2
#define UART_RS232_USE_CTS_RTS 0
#define UART_RS232_USE_EOP_REGISTER 0
#define UART_RS232_SIM_TRUE_BAUD 0
#define UART_RS232_SIM_CHAR_STREAM ""
#define UART_RS232_RELATIVEPATH 0
#define UART_RS232_FREQ 100000000
#define ALT_MODULE_CLASS_uart_rs232 altera_avalon_uart

//Das steht in einer Bibliothek
extern int alt_irq_register (alt_u32 id,
                             void*   context,
                             alt_isr_func handler);





//Das ist mein Context

typedef struct
{
int number;
}my_context;



//Das ist meine ISR

void rs232_isr (void* context, alt_u32 interrupt_number)
{

printf("Daten stehen an");
}




//So sieht ungefähr die main aus

void main(){

char msg[4]="test";
int result;

result=alt_irq_register (UART_RS232_IRQ,(void*)my_contex,rs232_isr);

alt_irq_enable(UART_RS232_IRQ);


do{


  fp = fopen("/dev/uart_rs232", "w+");
  if(fp)
  {
   //printf("Connected\n");
   fwrite(msg, strlen(msg), 1, fp);

   fclose(fp);
  }
  else
  {
  printf("Error/dev/ttyS0\n");
  }





}while(1);


}



Die ISR wird nach dem Start zich mal aufgerufen. Meiner Meinung nach 
löst das Senden auch einen Interrupt aus und die ISR wird dadurch 
aufgerufen. Gibt es eine Möglichkeit mein Problem zu lösen?

Autor: Franki C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner der mir bei meinem Problem helfen kann?

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Niemals eineprintf routine in eine isr und
2. Fehlt in deiner ISR nicht das Zurücksetzen eines IRQ-PENDING bits ?
Ben

Autor: Franki C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso das mit dem printf stimmt ja, der printf löst ja selbst einen 
interrupt aus. ich könnte noch ein alt_irq_enable(UART_RS232_IRQ); in 
meine ISR packen, aber irgendwie reagiert die ISR nicht auf den RXD.
Außerdem soll doch ständig auf den RXD geachtet werden.

Naja komisch war mir das trotzdem dass der printf Befehl so oft auftrat, 
könnte es nicht doch sein das das senden auch interrupts auslöst?

Danke für die Antwort!

Autor: Harald Flügel (hfl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Franki C. schrieb:
> Naja komisch war mir das trotzdem dass der printf Befehl so oft auftrat,
> könnte es nicht doch sein das das senden auch interrupts auslöst?
Tut es ziemlich sicher. Daher frag ich mich gerade, warum Du für eine 
Standardkomponente wie den UART eine eigene ISR benutzen willst. Das 
macht der HAL doch schon von selbst. Einfach ein fopen auf den UART 
machen und dann mit File-Funktionen drauf zugreifen. Dann ist alles 
gepuffert und ISR-getrieben. Gefällt dir das nicht, wie Altera das 
macht?

Grüße,
Harald

Autor: Franki C. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das klingt ja eigentlich sehr schön. Ich hatte da gar nicht daran 
gedacht, da meine Task auf den TXD schreibt und den LCD dementsprechend 
setzt, wenn ich nun den RXD lesen wollte hatte das meine Funktion 
ausgebremst. Man hatte mir nämlichen irgendwann mal gesagt zusammen 
gehörige I/O sollten immer in einer Task sein. Aber jetzt wo du es sagst 
schlägt es mir voll in den Kopf, RS232 ist ja Vollduplex und somit auch 
"unabhängig" voneinander, das heisst ich kann eine eigene Task erstellen 
und da einfach ein fopen(...,r+) machen und mit getc(mesg); den RXD 
lesen. Wusste gar nicht das der RS232 von vornherein auf interrupts 
reagiert.

Danke Harald, du rettest mir den Abend!!

Manchmal braucht man nur einen kleinen stups der einen wieder in die 
richtige Richtung bringt.Man weiß gar nicht was das ausmacht!

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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.