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


von Franki C. (Gast)


Angehängte Dateien:

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?

von Franki C. (Gast)


Lesenswert?

Keiner der mir bei meinem Problem helfen kann?

von ben (Gast)


Lesenswert?

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

von Franki C. (Gast)


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!

von Harald F. (hfl)


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

von Franki C. (Gast)


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!

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.