Forum: Mikrocontroller und Digitale Elektronik Externer Interrupt über i/o port 1 pin 7


von Max D. (jimbo)


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

von Peter D. (peda)


Lesenswert?

Wie schnell ?

Nicht interrupfähige Pins kann man im Timerinterrupt pollen.


Peter

von Max D. (jimbo)


Lesenswert?

"wie schnell?"

=> in welchen zyklus der interrupt ausgelöst werden soll?

die pins sind für interrupts ausgelegt.

von Max D. (jimbo)


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
}

von Peter D. (peda)


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

von Max D. (jimbo)


Lesenswert?

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

von Max D. (jimbo)


Lesenswert?

ach der compiler ist ein iar compiler

von Max D. (jimbo)


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

von Max D. (jimbo)


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ß

von Max D. (jimbo)


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

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
Noch kein Account? Hier anmelden.