Hallo zusammen,
ich versuche den externen IRQ 2 zur Auswertung eines angeklemmten
Radiometrix Funkmoduls zu benutzen, aber dieses Ding will und will
einfach nicht funktionieren. Ich hab leider keine Ahnung was das sein
kann. Hier ein wenig Code:
void radio_init (void)
{
// set external interrupt2 input
PINSEL0 |= 2 << 30;
// setup the VIC ...
VICProtection = 0x0;
VICIntSelect &= (~(1 << 16));
VICIntEnable |= (1 << 16);
VICVectAddr1 = (unsigned long) radio_isr;
VICVectCntl1 = (0x20 | 0x10);
}
void _attribute_ ((interrupt("IRQ"))) radio_isr (void)
{
// do something with the radiomodule ...
VICVectAddr &= (~(1 << 16));
EXTINT &= (~(1 << 2));
}
Als FIQ laeuft ein Timer Interrupt, der auch wunderbar tut. Interrupts
sind eingeschaltet im Startup Assembler Code und das Funkmodul spuckt
auch ein Signal aus. Der Interrupt davon geht an den BUT Eingang des
Olimex LPC-P2106, der eigentlich durch das PINSEL auf EINT2 gesetzt
werden sollte.
Kann jemand helfen?
Besten Dank & Gruss
Florian
Hallo Florian,
es gibt auf der Seite von Philips ein "Errata Sheet" zu jedem
Controller.
Das ist die angesprochene Bugliste. Das Errata Sheet findest du auf der
Seite des jeweiligen Controllers, in deinem Falle auf der Seite vom
2106.
Grüße
Hallo Patrick,
Danke fuer Deinen Tip. Leider konnte ich in Sheet 1.7 mit Stand vom 5.
August 2005 nichts entdecken was auf ein Problem mit dem EINT2
hindeuten wuerde. Seh ich den Wald vor lauter Baeumen nicht mehr?! :(
Gruss
Florian
Hallo Florian,
habe mir gerade nochmal das Errata Sheet zum 2106 angeschaut.
Da steht wirklich nichts drin.
Beim LPC2124 sieht das anders aus, sorry.
Nochmal 3 sachen:
1. Du setzt ja gar nicht EXTMODE oder EXTPOLAR ?
Soll deine ISR wirklich auf low level angesprungen werden ?
2. Du musst in EXTINT das INT-Bit löschen indem du eine 1
reinschreibst.
Bei EXTINT2 sieht das so aus:
SCB_EXTINT = 4;
3.
Einen Interrupt bestätigt man meistens so:
VICVectAddr = 0;
Grüße und viel Glück,
Patrick
Hallo Patrick,
Danke nochmal.
Jup, die ISR soll bei low-level angesprungen werden, das Radiometrix
Funkmodul zieht den Pin so wenn es Daten hat.
Extint Bit wird geloescht und der IRQ wird auch bestaetigt:
VICVectAddr &= (~(1 << 16));
EXTINT &= (~(1 << 2));
Gruss
Florian
Hallo Florian,
EXTINT Bit wird nur gelöscht wenn du eine 1 reinschreibst, nicht wenn
du eine 0 setzt.
Siehe Manual Beschreibung.
VICVectAddr könnte funktionieren.
Probier trotzdem die Variante mit VICVectAddr = 0;
Außerdem würde ich eher einen Falling Edge Interrupt machen wenn der
INT ein Low-Pegel ist.
Grüße
Hallo Florian,
du kannst dich ja etwas an meinem Code orientieren:
SCB_MEMMAP = 1; //interrupt vectors reside in flash
SCB_EXTINT=0x04; // Clear Interrupt Bits
/* EINT2 Bug workaround */
SCB_VPBDIV=0x0;
SCB_EXTMODE = 4; // Edge-sensitive
SCB_VPBDIV = VPBDIV_VAL;
SCB_VPBDIV=0x0;
SCB_EXTPOLAR = 4; // Rising Edge <- hier einfach auf 0 umstellen
SCB_VPBDIV = VPBDIV_VAL;
SCB_VPBDIV=0x0;
SCB_VPBDIV = VPBDIV_VAL;
VICIntEnClear = 0xFFFFFFFF; // clear all interrupts
VICIntSelect = 0x00000000; // clear all FIQ selections
VICVectAddr1=(unsigned long)extint2;
VICVectCntl1 =(1<<5) | VIC_EINT2; // VIC EINT2 steht für 16
VICIntEnable = (1<<VIC_EINT2); //Bit = Channel des INTs
Der Anfang der ISR:
void _attribute_ ((interrupt("IRQ"))) extint2(void){
SCB_EXTINT = 4; //Clear Interrupt Bit
VICVectAddr = 0;
}
Natürlich habe ich noch viel mehr Krimskrams in meinem Programm, das
sind aber die wichtigen Ausschnitte.
Grüße,
Patrick
Hallo Patrick,
Danke fuer Dein Codebeispiel. Leider sagt mir sowohl mein Manual als
auch mein Compiler, dass es weder ein EXTMODE noch ein EXTPOLAR
Register gibt. Die Umstellung von VPBDIV hat aber einen Effekt erzielt.
Irgendwie werden momentan wohl noch ein paar Pakete verschluckt, aber
das Funkmodul synchronisiert sich zumindest.
Langsam ein Lichtblick, ENDLICH! Ich werd mal noch ein wenig dran
rumfrickeln ...
Schoenes Wochenende!
Florian
Hallo Florian,
check mal bitte dein Header File ( z.B. lpc2106.h oder sowas ) ob da
irgendwo EXTMODE oder EXTPOLAR drin steht.
Die Schreibweisen unterscheiden sich sehr oft.
Grüße
Hallo Floran,
mein Wissen basiert größtenteils auf den verfügbaren Funktionen vom
LPC2124. Ich habe mir eben nochmal das LPC2106 Datasheet angeschaut und
gesehen dass es diese Register wirklich nicht gibt.
Sehr bitter.
Momentan kann ich dir nicht weiterhelfen bei deinem Problem.
Falls dir hier auch keiner weiterhelfen kann wende dich doch an die
LPC2000 Group von yahoo.
Grüße
Heyho,
das Funkmodul laeuft ja mittlerweile, jetzt kommt der I2C dran. Da
aerger ich mich grad auch ziemlich mit rum, das liegt aber eher daran,
dass ich in diesem verf*ckten Manual von dem Picaxe LCD Display hier
die Hardware Adresse nich finde und die Seppel nur irgendwelche
Codebeispiele mit ihrer eigenen Software abgedruckt haben.
Wird schon irgendwie werden. Danke fuer Deine Hilfe :)
Schoenen Gruss
Florian
Eine eigene Frage?
Dieser Thread ist über 21 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.