Externer Interrupt über i/o port 1 pin 7

OP #440960
Lesenswert?

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
OP #440981
Lesenswert?

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
}
#441001
Lesenswert?

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
OP #441031
Lesenswert?

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
OP #441079
Lesenswert?

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ß
OP #441260
Lesenswert?

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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren