Forum: Mikrocontroller und Digitale Elektronik MSP430 Flanke erkennen


von Christian (Gast)


Lesenswert?

Hallo!

Ich probiere hier grade mit einem DCF 77 Modul rum und möchte erkennen
ob das eingehende Signal eine 1 oder 0 ist.

Setup: MSP430F1121A @ 1 MHZ

P2.0 DCF 77

P1.0 RS
P1.1 R/W
P1.2 E
P1.3 leer
P1.4 D4
P1.5 D5
P1.6 D6
P1.7 D7

Ich hab mir vorgestellt zu prüfen, ob pin 2.0 auf high wechselt und
beidiesem wechsel einen Timer einzuschalten, der eine Zählvariable
hochzählt... wie kann man denn die Timer ein und ausschalten?
bin für jedes bisschen Code-Beispiel dankbar

Gruß

CHRiS

von KoF (Gast)


Lesenswert?

http://focus.ti.com/mcu/docs/mcuprodcodeexamples.tsp?sectionId=96&tabId=1468
Hier bekommst du alles, was du brauchst!!! Super Beispiele und auch für
Anfänger verständlcih und "Kopierbar"

mfg
KoF

von Christian (Gast)


Lesenswert?

ja die Teile hab ich schon.... verstehe aber immernoch nicht, wie ich
den Timer über den externen Interrupt von Pin 2.0 triggere...

von arc (Gast)


Lesenswert?

Zwei Ideen:
Der Flankenwechsel kann einen Port-Edge-Interrupt erzeugen, in dem dann
der Timer gestartet wird und beim nächsten Wechsel wieder gestoppt
wird.

Bei einer etwas anderen Pinbelegung hätte man das über die
Capture-Funktion des Timers erledigen können. (User Guide Chapter 11
Capture Mode)

MSP430x1xx User Guide
http://focus.ti.com/lit/ug/slau049f/slau049f.pdf

von Christian (Gast)


Lesenswert?

ja genau so hab ich es vor...
hab ich vllt grad zu schwmmig formuliert...
mir fehlt jetzt nur noch der C-Code wie ich den Timer an bzw.
ausschalten kann...
Den Interrupt-Kram für den Port habe ich schon in einem Beispiel Source
von TI gefunden...
1
  P2IE |= 0x01;                         // P2.0 interrupt enabled
2
  P2IES |= 0x01;                        // P2.0 Hi/lo edge
3
  P2IFG &= ~0x01;                       // P2.0 IFG cleared
4
5
6
#pragma vector=PORT2_VECTOR
7
__interrupt void Port_2(void)
8
{
9
  // -> Timer noch ein und ausschalten <-
10
  P2IFG &= ~0x01;                       // P2.0 IFG clearedf
11
}

von arc (Gast)


Lesenswert?

Jetzt fehlt nur noch
// continuous up (bis 0xffff) passenden Vorteiler einsetzen
TACTL = TASSELx | IDx | MC2 | TACLR;
// beim nächsten Portinterrupt TAR auslesen

von Christian (Gast)


Lesenswert?

also so ganz kapiere ich jetzt nicht was ich hier machen soll und würde
euch bitte mir noch ein paar tipps zu geben...

muss diese zeile: TACTL = TASSELx | IDx | MC2 | TACLR;
jetzt mit in in die ISR um den Timer zu resetten und neu zu starten?

__interrupt void Port_2(void)
{
 int wert = TAR;
 TACTL = TASSEL_2 | ID_2 | MC_2 | TACLR;
 P2IFG &= ~0x01; // P2.0 IFG cleared
}

von arc (Gast)


Lesenswert?

Portinitialisierung wie zuvor +
int cnt;
__interrupt void Port_2(void) {
  // erster int bei high to low
  if (P2IES & 0x01) {
    TACTL = TASSEL_2 | ID_2 | MC_2 | TACLR;
    // nächster int bei low -> high
    P2IES &= ~0x01;
  } else {
    TACTL = 0;
    cnt = TAR;
    // nächster int wieder bei high -> low
    P2IES |= 0x01;
  }
  P2IFG &= ~0x01;
}

von Christian (Gast)


Lesenswert?

Danke für deine Hilfe!

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.