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?
1. Niemals eineprintf routine in eine isr und 2. Fehlt in deiner ISR nicht das Zurücksetzen eines IRQ-PENDING bits ? Ben
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.