hallo zusammen, ich arbeite auf einen cc2431 mit 8051 cpu. habe jetzt über i/o ports eine peripherie angehängt. nun würde ich gerne auf den port 1 pin 7 einen interrupt initialisieren der bei ankommenden daten ausgelöst wird. kann mir da vielleicht jemand ein kochrezept dafür geben bzw. ein kleines beispiel. vielen dank, gruß jimbo
Wie schnell ? Nicht interrupfähige Pins kann man im Timerinterrupt pollen. Peter
"wie schnell?" => in welchen zyklus der interrupt ausgelöst werden soll? die pins sind für interrupts ausgelegt.
habs jetzt so gemacht funktioniert aber nicht. initISR() EAL = 0x01 //Enable all Interrupts P1IEN = 0x07 //Enable port 1 pin 7 interrupt INT_ENABLE(INUM_P1INT, INT_ON) //port 1 interrupt enable und setzen der vektor //adresse #pragma vector=P1INT_VECTOR __interrupt void P1INT_IRQ(void){ BYTE data; if(P1IFG == 0x07) { //schaue ob pin 7 gesetzt ... } P1IF = FALSE; //setze auf 0x00 }
Ich vermute mal, der Kommentar ist falsch, beim 8051 kann man nämlich keine Interruptvektoren setzen, die sind fest. Ansonsten, es ist wohl kein Standard-8051 und auch kein Keil Compiler. Ich kann also nicht sagen, wie bei Deinem Compiler ein Interrupt aussehen muß. Ein Datenblatt des cc2431 mit der Interrupt- und Registerbeschreibung habe ich auch nicht gefunden. Peter
hallo peter, hier der link zum datenblatt (ist vom cc2430, das vom cc2431 verweist darauf), http://www.chipcon.com/files/CC2430_Data_Sheet_rev1p03.pdf
also verstehe das nicht. nochmal initialisierung. bin nach dem schema von seite 51 vorgegangen. IEN0.EA = 0x01 //Enable all interrupts IEN2.P1IE = 0x10 //Enable port 1 interrupts PICTL = 0x02 //falling edge on input gives interrupt //wenn peripherie interrupt auslöst geht es von 1 auf 0 P1IEN = 0x08 //enable 1_7
ok habs hinbekommen. hab vor lauter ... das register P1IEN falsch gesetzt. also hier die lösung um einen interrupt auf den io port 1 pin 7 zu setzen. #pragma vector=P1INT_VECTOR __near_func __interrupt void P1INT_IRQ(void){ BYTE data; data = P1_7; if(P1IFG == 0x07) { data = IndirectReadByte(0x04); I_STATUS[0] = data; } IndirectWriteByte(INT_REG, 0x01); P1IF = FALSE; } void initISRP1_7(void) { INT_GLOBAL_ENABLE(TRUE); INT_ENABLE(INUM_P1INT, INT_ON); PICTL = 0x02; P1IEN = 0x80; } nochmals danke für die hilfe gruß
ok nochmal ne kleine verbesserung. bei dem vorgänger beispiel habe ich vergessen das status register zurück zu setzen. #pragma vector=P1INT_VECTOR __near_func __interrupt void P1INT_IRQ(void){ INT_GLOBAL_ENABLE(INT_OFF); P1IFG &= ~0x80; ... P1IF = 0x00; INT_GLOBAL_ENABLE(INT_ON); } void initISRP1_7(void) { P1IFG = 0x00; INT_GLOBAL_ENABLE(TRUE); INT_ENABLE(INUM_P1INT, INT_ON); PICTL |= 0x02; P1IEN |= 0x80; }
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.