Datum: 16.05.2008 12:57
Mache hier noch einmal einen letzten Versuch jemanden zu finden, der auch ethernut auf dem AT91SAM7X-EK einsetzt. Hierbei habe ich nicht nur Probleme, eigene Interrupts per AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA]=(unsigned int)ex_int_handler; zum Laufen zu bekommen (Interrupt springt nicht zu main() zurück), sondern beim Timerbeispiel der ethernut-Homepage wird erst gar kein Interrupt ausgelöst. Anbei das Projekt gezippt und hier main.c :
#include "AT91SAM7X256.h" #ifndef __ASSEMBLY__ extern void dbgu_print_ascii(const char *buffer); extern void dbgu_print_hex8(unsigned long); #endif #define LED4 AT91C_PIO_PB18 #define LED3 AT91C_PIO_PB19 #define LED1 AT91C_PIO_PB21 #define LED2 AT91C_PIO_PB20 #define TRUE 1 #define FALSE 0 typedef unsigned char BOOL; typedef unsigned char BYTE; #include <string.h> #include <stdio.h> #include <fcntl.h> #include <io.h> #include <dev/board.h> #include <arch/arm.h> #include <dev/irqreg.h> #include <sys/timer.h> #include <sys/version.h> int counter; //+******************************************************************** void ApiTimerIntr(void *arg) { AT91C_BASE_PIOB->PIO_CODR=LED3; counter++; } //+******************************************************************** int InitApiTimer(void) { int dummy; outr(TC1_CCR, TC_CLKDIS); outr(TC1_IDR, 0xFFFFFFFF); dummy = inr(TC1_SR); outr(TC1_CMR, TC_CLKS_MCK32 | TC_CPCTRG | TC_WAVE | TC_EEVT_XC0); outr(TC1_RC, 0x8FF); outr(TC1_CCR, TC_CLKEN); outr(TC1_IER, TC_CPCS); NutRegisterIrqHandler(&sig_TC1, ApiTimerIntr, 0); NutIrqSetPriority(&sig_TC1, 0); NutIrqEnable(&sig_TC1); outr(TC1_CCR, TC_SWTRG); return 0; } //+******************************************************************** int w_init(void){ AT91C_BASE_PIOA->PIO_PER=AT91C_PIO_PA5; AT91C_BASE_PIOA->PIO_PER=AT91C_PIO_PA6; AT91C_BASE_PIOA->PIO_PER=AT91C_PIO_PA7; AT91C_BASE_PIOB->PIO_PER=LED4; AT91C_BASE_PIOB->PIO_OER=LED4; AT91C_BASE_PIOB->PIO_SODR=LED4; AT91C_BASE_PIOB->PIO_PER=LED3; AT91C_BASE_PIOB->PIO_OER=LED3; AT91C_BASE_PIOB->PIO_SODR=LED3; AT91C_BASE_PIOB->PIO_PER=LED2; AT91C_BASE_PIOB->PIO_OER=LED2; AT91C_BASE_PIOB->PIO_SODR=LED2; AT91C_BASE_PIOB->PIO_PER=LED1; AT91C_BASE_PIOB->PIO_SODR=LED1; AT91C_BASE_PIOB->PIO_OER=LED1; return 0; } //+******************************************************************** int main(void) { u_long baud = 115200; int last; NutRegisterDevice(&DEV_DEBUG, 0, 0); freopen(DEV_DEBUG_NAME, "w", stdout); _ioctl(_fileno(stdout), UART_SETSPEED, &baud); printf("\n\nNut/OS %s CPU running at %lu Hz\n", NutVersionString(), NutGetCpuClock()); printf("System Timer running at %lu ticks/s\n", NutGetTickClock()); printf("1 second needs %lu system ticks\n", NutTimerMillisToTicks(1000)); w_init(); InitApiTimer(); AT91C_BASE_PIOB->PIO_CODR=LED1; for(;;) { NutIrqDisable(&sig_TC1); last=counter; counter = 0; NutIrqEnable(&sig_TC1); printf("%d counter ticks\n", last); AT91C_BASE_PIOB->PIO_SODR=LED1; // blinkende led zum test (OK) NutSleep(1000); // Sleep 1 second. AT91C_BASE_PIOB->PIO_CODR=LED1; // blinkende led zum test (OK) NutSleep(1000); // Sleep 1 second. } } |
Datum: 16.05.2008 13:18
Hier ist ja gar keine Funktion als Interruptfunktion deklariert. Beim Keil geht das mit __irq - ansonsten kommst du natürlich nicht zu main zurück. Für den Gnu hab ich sowas auch schon gesehen. Schau mal hier im Forum in den Codesammlungen nach. ...oder gibt es noch andere Funktionen....
Datum: 16.05.2008 13:27
> Hier ist ja gar keine Funktion als Interruptfunktion deklariert.
Doch, mit NutRegisterIrqHandler(&sig_TC1, ApiTimerIntr, 0);
Ist halt ethernut...
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel


