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.