Forum: Mikrocontroller und Digitale Elektronik MSP430F2913 P1IN Abfrage ++


von Dirk (Gast)


Lesenswert?

Hallo,
spiele mit dem MSP430F2013 USB-Stick.
IAR - IDE

Das ist main:
  P1DIR = 0x41;     //OUT Set P1.0;   P1.6      => Löt 2 ,8
  P1REN = 0x10;     // P1.4  pullup
  P1IE =  0x10;     // P1.4 interrupt enabled   => Löt 6
  P1IES = 0x10;     // P1.4  Hi/lo edge
  P1OUT = 0x00;
  P1IFG = 0x00;     //IFG alle

   SD16CTL = SD16REFON + SD16SSEL_1;         // 1.2V ref, SMCLK
   SD16INCTL0 = SD16INCH_1;                  // A1+/-

   SD16CCTL0 = SD16SNGL + SD16UNI + SD16IE ; //Single conv,
                                             //interrupt,unipolar
   SD16AE = SD16AE2;                       // P1.1 A1+, A1- = VSS  =>Löt 
3


  _BIS_SR(LPM0_bits + GIE);

#############################
suche dann eine Möglichkeit die andern P1INx direkt abzufragen
('H' oder 'L').

  while (0x20 & P1IN );

############## oder auch

      if (0x20 & P1IN) // Clock 'H'
      {

      }

beides scheint nicht zu laufen.
- Auch bekommte ich beim Simulator die Interrups zwar gesetzt,
  aber das PRg läuft da nicht hin
- Im Stepp-Modus werden die richtigen Zustände nicht ins PRG übernommen
muß noch ne Einstellung ändern?

Gibt es ein Tutorial, das zum Downloaden angeboten ist?
(einige Befehle finde ich nicht z.B >> oder << shift)
Wie kann ich den µP schneller laufen lassen?
( bekomme keinen Durchblick)

Vielen Dank im Vorraus
Dirk

von Dirk (Gast)


Lesenswert?

Hallo,
also die P1IN abfragen laufen jetzt, war ein 'dummer' Draht.

Ein Tutorial zum Runterladen, währe sehr Hilfreich für mich..

Auch das 'schneller' machen als 1MHz währe gut.
Hier verstehe ich die PDFs nicht.

Vielen Dank im Vorraus
Dirk

von Jörg S. (Gast)


Lesenswert?

Für den Anfang empfehle ich:
http://www.mathar.com/msp430.html

Ansonsten gibt es direkt von TI auf deren Homepage bergeweise 
Code-Beispiele zum runterladen.

Sehr hilfreich für die C Programmierung ist auch
http://www.inf.hs-anhalt.de/Service/C-Programmierung/C-Zusammenfassung.htm


von Dirk (Gast)


Lesenswert?

Danke  Jörg S.

schaue mir die Tips mal mit mehr ruhe an.
Bin etwas ungehalten über die PDFs von TI.


Dirk

von Tilo S. (thesurfer)


Lesenswert?

Moin,

also ich finde die pdf's von TI gar nicht mal so uebel, desweiteren ist 
es hilfreich auch das header msp430x20x3.h immer aufzuhaben, weil dort 
nochmal eine ganze Menge an Infos drin steht.

ich mach es wie folgt mit der Clock, ich benutze die kallibrierten 
Clocks :
1
WDTCTL = WDTHOLD + WDTPW;  // WDT anhalten mit HOLD und Passwort
2
DCOCTL = CALDCO_12MHZ;    // setzen der MCLK auf calibrierte 12 MHz
3
BCSCTL1 = CALBC1_12MHZ;    // setzen der SMCLK auf calibrierte 12 MHz
4
BCSCTL2 = DIVS_3;      // SMCLK / 8 setzen 12/8 = 1,5 MHz

oder
1
WDTCTL = WDTHOLD + WDTPW;  // WDT anhalten mit HOLD und Passwort
2
DCOCTL = CALDCO_1MHZ;    // setzen der MCLK auf calibrierte 1 MHz
3
BCSCTL1 = CALBC1_1MHZ;    // setzen der SMCLK auf calibrierte 1 MHz
4
BCSCTL2 = DIVS_0;      // SMCLK / 1 setzen 1/1 = 1 MHz

.... schau dir einfach mal das headerfile an, du kannst dann 1, 8, 12, 
16Mhz setzen, ich denke das sollte reichen. Da kann man schoen mit 
rumspielen, falls du sehen moechtest ob du es richtig gemacht hast, 
kannst du dir die clocks auch ausgeben.
1
P1SEL = 0x10;  // P1.4 auf ausgabe der SMCLK setzen

jetzt einfach ein Multimeter an P1.4 und es wird dir die Hertzzahl von 
SMCLK / DIVS_X anzeigen. Weiterhin viel erfolg.

MfG
TheSurfer

von Dirk (Gast)


Lesenswert?

Moin Moin,
zur Zeit habe ich folgende Lösung.

  WDTCTL = WDTPW + WDTHOLD;
  BCSCTL1 = CALBC1_16MHZ;
  DCOCTL =DCO2+DCO1+DCO0+ CALDCO_16MHZ;
Was das wirklich bedeutet weiss ich nicht,
 habe ein paar Beispiele zusammen geschüttelt
 und dann die MHz Zahlen hochgesetz bis keine Fehlermeldung mehr kamm.
 Hier habe ich die PDFs auch nicht nutzen können.

Alle Zeitgeschichten habe ich auf den µP(Propeller) verlagert.
(war anders erdacht)
Er hat einen Quarz. So ist zwar der MSP fast nur in Warteschleifen,
aber es gibt keine Übertragungsfehler.
Ich Clocke den ADC-Wert über ein sehr zwanghaften Ablauf zum
andern µP. 4Ltgs Trigger;Clock / Data;Check
Läuft frei und auch bei Einzelschritt)

Habe die USI(als Slave) einfach nicht zum Datensenden bewegen können.
Und habe mir echt einen abgebrochen mit den TI-PDFs.
Habe mehrere male ein paar Stunden rumgemacht.

Mit der headerdatei, ja, bin einfach dumm an die Sache rangegangen.
Wollte ja 'nur' einen schnellen 20zig Zeiler,
nun sind es 100 und es läuft seit heute.

kann ich das so lassen, oder hat es Spätschäden zur Folge

  BCSCTL1 = CALBC1_16MHZ;
  DCOCTL =DCO2+DCO1+DCO0+ CALDCO_16MHZ;


Vielen Dank für den Tip
Dirk

von marcel (Gast)


Lesenswert?

hi
wenn ihr die frequenz der dco hochsetzt laufen dann auch befehle wie

main()
{
....
while(1)
{
   P1OUT^=0x01;
}

mit den entsprechenden 8/16 oder entsprechenden MHz ab?

gruß marcel

von Dirk (Gast)


Lesenswert?

Hallo  marcel,

das hier läuft ohne Fehler( bisher). Auch im Einzelschritt.

Ist nicht schön oder einfach, aber kannte kein C und kein MSP bis vor 
kurzem.

Vieleicht hilft Dir das

Eine GUTE ZEIT
Dirk
-------------------------------------------------------------

#include  <msp430x20x3.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  BCSCTL1 = CALBC1_16MHZ;                    // Set DCO to 16MHz
  DCOCTL =DCO2+DCO1+DCO0+ CALDCO_16MHZ;


  P1DIR = 0x21;     // OUT Set P1.0; P1.5;    => Löt 2 ,7
  // P1.6(Clock vom Prop.)
  P1REN = 0x10;     // P1.4  pullup  Trigger
  P1IE = 0x10;     // P1.4 interrupt enabled   => Löt6
  P1IES = 0x10;     // P1.4  Hi/lo edge
  P1OUT = 0x00;     // alle Ausgänge auf 'L'
  P1IFG = 0x00;     // IFG alle


// ....
   SD16CTL = SD16REFON + SD16SSEL_1;         // 1.2V ref, SMCLK
   SD16INCTL0 = SD16INCH_1;                  // A1+/-
   SD16CCTL0 = SD16SNGL + SD16UNI + SD16IE ;
//         Single conv, interrupt,unipolar
   SD16AE = SD16AE2;                         // P1.1 A1+, A1- = VSS 
=>Löt 3


  _BIS_SR(LPM0_bits + GIE);     // warten auf Interrups

}


// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  P1IFG &= ~0x10;            // P1.4 IFG cleared
  P1OUT |= 0x20;             // Data 'H'   => warten auf ADC
  SD16CCTL0 |= SD16SC;       // Set bit to start conversion ADC
}


#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
   unsigned long b = 65536;
   unsigned long Wert;
   unsigned long Ende = 100000;  // zur Sicherheit, hängt sich so nicht 
auf
   unsigned long Clock = 16;    // Bitanzahl

  P1OUT &= ~0x20;      // Data 'L'  => Clock starten
  P1OUT &= ~0x01;  // Check 'L'

  Wert = SD16MEM0;

  Wert= 16000;    // Testwert für die Datenübertragung
                  // 0011111010000000  oder 3E80
  while (Clock >0)    // während einer Impulsserie
   {
      Ende= Ende-1;
      if (Ende==0)         // auto Ende wenn Clocks fehlen
      {
        //P1OUT &= ~0x40;    // Data 'L'
        Clock=0;
      }
      if (0x40 & P1IN)    // Clock 'H' liegt an,
      {
         Clock=Clock-1;
         Ende = 100000;
         b = b / 2;
         if (Wert >= b)        // vergleichen ob Bit gesetzt
          {
            Wert = Wert - b;
            P1OUT |= 0x20;     // BitData = 'H'
          }
         else
          {
            P1OUT &= ~0x20;    // BitData = 'L'
          }
         P1OUT |= 0x01;   // Check 'H'   Bitabfrage freigeben

        while (0x40 & P1IN )  // warten Clockende, mit auto verlassen
         {
          Ende= Ende-1;
          if (Ende==0)
          {
            Clock=0;
            break;
     }}}
     P1OUT &= ~0x01;  // Check 'L'
     P1OUT &= ~0x20;    // Data 'L'
  }

  P1OUT &= ~0x20;    // Data 'L'   Fertig
  P1OUT &= ~0x01;    // LED Aus
}

von Dirk (Gast)


Lesenswert?

Moin Moin,

mein Ursprungsidee war, den MSP430F2013 auszulagern und mit 3Ltgs 
anzubinden (*/- ImpulsLtg).

Hatte mir eine Pausenmodulation ausgedacht, damit ich das auch 
hinbekomme.
Aber dann fing der Ärger an.

Wenn die CalB wirklich gut arbeiten,
dann währe meine alte Idee wieder meine 'neue'.

Also:
- ADC 200/sec.
  (muß recht genau sein, möchte später mit Digitallen Filtern ran)
- die 16Bitpositionen übertragen
  (gesendet werden 17 H Impulse, letzte Pause)

  für 'H' einfache Pause '||_ '
  für 'L' doppelte Pause '||__'

Pausenmodulation,
 wegen der Option auf IR umzusteigen, dann Batterie/LadeC .

Der zweite µP übernimmt dann die Rückwandlung,
und müßte dann Zeitgesteuert arbeiten.


Wenn Du da Erfahrungen, Tipps oder Beispiele 
(kennst/hast/vermutest/usw.)

Vielen Dank im Vorraus
Dirk

von marcel (Gast)


Lesenswert?

hi dirk

erstmal vielen dank für deine hilfe! c kann ich, auch auf µc nur leider 
bin ich in sachen msp430 nen kompletter newbee (hab an der uni nur mit 
nem uralt 8051 rum gemacht). naja und son msp ist gegenüber dem 8051 wie 
nen 386 zu nem core2duo. im prinzip das selbe nur ganz anders.
ich schaus mir dein prog mal an vielleicht hilft es mir (ps. ich hab 
keinen f2013 sondern nen f169 aber die ti sollten code kompatibel sein).

mfg
marcel

von Dirk (Gast)


Lesenswert?

hi  marcel,

kenne keinen andern MSP, ist sozusagen mein erster run mit µP.

Arbeite mich recht und schlecht gleich in zwei ein.

Das wichtigste ist wohl für mich, anzuerkennen das es immer um Register 
geht.

P1DIR = 0x21; hiermit setzt Du das
 ganze Register(alle BitPositionen)=> alle PIN-DIRs

Mit den zwei Zeilen, setzt Du jeweils eine BitPosition im Register
P1OUT &= ~0x01;  // Check 'L'
P1OUT |= 0x20;   // BitData = 'H'
vieleicht geht auch hier die HEX-adition von mehreren BitPosition(PINs)

habe echt rumgemacht, bis es angekommen ist.
Nun habe ich eine Liste zum Nachschauen.

PIN Nummern - Hex-Wert - Lötpunkt


Dirk

von Dirk (Gast)


Lesenswert?

Bin in Urlaub für ne Woche!!!!

Dirk

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.