mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port Interrupt bei MSP430


Autor: MSP-Foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich versuche z.Zt. die Länge eines Impulses der an P2.0 (MSP430F1121)
anliegt zu messen. Ein Timer soll bei steigender Flanke gestartet
werden und bei fallender Flanke gestoppt werden.

Initialisiert habe ich den Port so:
  P2IE |= 0x01;      // P2.0 int enabled
  P2IES |= 0x00;     // P2.0 low/high edge
  P2IFG &= ~0x01;    // P2.0 IFG clear

Meine ISR: (da steckt irgendwo der Fehler denke ich...)
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  // int bei low -> high
  if (P2IES & 0x00)
  {
    start_timer();
    // int bei high -> low
    P2IES &= ~0x01;
  }
  else
  {
    stop_timer();
     // int wieder bei low -> high
    P2IES |= 0x00;
  }
  P2IFG &= ~0x01;
}

Findet ihr den Denkfehler? Bin für jede Hilfe dankbar

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was geht da nicht? Wird die ISR denn angesprungen? Mal nen
Breakpoint setzen? Auf den ersten Blick seh ich da jetzt keinen
großartigen Denkfehler. Hab ich bei meinem Komfortblinker ähnlich
gemacht. Also den Flankenwechsel für den Int.

Aber wieso nimmst du nicht die Capture Compare Einheiten in Hardware
dafür? Die sind doch extra für sowas...

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe zwei Probleme:

(P2IES & 0x00) ist immer FALSE -> dein if-Zweig wird nie angesprungen.

P2IES |= 0x00; bewirkt garnichts.

Vermutlich soll da irgendwo 0x01 stehen...

Ahoi, Martin

Autor: MSP-Foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
doch die ISR wird aufgerufen...aber er schreibt immer nur "count=0"
aufs LCD.

Hier der Rest von meinem Source:
unsigned int count = 0;

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
 count++;
 CCR0 += 5000;
}


void start_timer()
{
 // Timer für Zeitmessung starten 

    count = 0;
    TACTL = TASSEL_2 +  MC_1;  // ModeControl -> 1 = Up
                            // SourceSelect -> 2 = SMCLK
}

void stop_timer()
{
 // Timer für Zeitmessung stoppen 
    TACTL = TASSEL_2 +  MC_0;  // ModeControl -> 0 = Stop
                            // SourceSelect -> 2 = SMCLK
    
    position(2,1);
    printtext("count=");
    printzahl(count);                            
}

Autor: MSP-Foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt komm ich gar nicht mehr weiter.... hirn-block

kann mir bitte einer von euch eine ISR schreiben, die bei steigender
flanke "start_timer" aufruft und bei fallender flanke
"stop_timer"...
wäre sehr nett! Danke

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Tabelle solltest du beachten wenn du das IES Flag setzt, wärend
die Interrupts aktiviert sind:

PxIESx  PxINx   PxIFGx
0 → 1   0       May be set
0 → 1   1       Unchanged
1 → 0   0       Unchanged
1 → 0   1       May be set

Einfacher wäre es das signal an 2 pinns anzulegen und dann einen auf
Positive Flanke, den anderen auf negative Flanke einzustellen.
Dann musst du in der ISR nur noch abprüfen welcher port den Interrupt
ausgelösst hat und dan timer dann entsprchend starten oder stoppen.

also so:
main()
{
 //Port 2.0 und P2.1 -> Signal
 P2SEL = 0x00;
 P2DIR = 0xFC;
 P2IE = 0x03;
 P2IES = 0x02;

//alle inerrupts einschalten
}

#
#pragma vector=PORT2_VECTOR
#
__interrupt void Port_2(void)
#
{
  if (! P2IFG & 0x01) //starte Timer
  if (! P2IFG & 0x01) //stoppe Timer
}

gruss Thomas

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder halt die Flanke umschalten mit

P1IES |= 0x01;   //H->L Flanke

und P1IES &= ~0x01;   //L->H Flanke

die Überprüfung mit:

if (P1IES & 0x01)  //war H->L Flanke
if (!(P1IES & 0x01))  //war L->H Flanke

Autor: MSP-Foo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz ehrlich, so ganz durchgeblickt hab ich da noch net...
würde das mit der "umschalterei" so gehen?

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  if (P2IES & 0x01)  //war H->L Flanke
  {
   stop_timer();
   P2IES &= ~0x01;   //L->H Flanke
  }

  if (!(P2IES & 0x01))  //war L->H Flanke
  {
   start_timer();
   P2IES |= 0x01;   //H->L Flanke
  }
}

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, aber so vielleicht:

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
  if (P2IES & 0x01)  //war H->L Flanke
  {
   stop_timer();
   P2IES &= ~0x01;   //L->H Flanke
   retrun;
  }

  if (!(P2IES & 0x01))  //war L->H Flanke
  {
   start_timer();
   P2IES |= 0x01;   //H->L Flanke
  return;
  }
}

Ganz wichtig das erste ruturn sonst ist ja die Bedingung für die 2. If
Abfrage immer erfüllt.

Autor: Frank Voss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe ein ähnliches Problem. Ich möchte auch bei einem Taster erst die
Flanke von hight->low detektieren (Taster drücken) und dann low->high
(Taster loslassen).

Könnte man das ganze nicht mit

 if (P2IES & 0x01)  //war H->L Flanke
 {

 }
 else if (!(P2IES & 0x01))  //war L->H Flanke
 {
....

anstatt mit return.
Oder wird das else if dann trotzdem ausgeführt?


Gruß
Frank

Autor: Christian S. (aliendrummer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Aber wieso nimmst du nicht die Capture Compare Einheiten in Hardware
dafür? Die sind doch extra für sowas...


Wie würde das denn mit Capture & Compare gehen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.