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
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
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
Danke Jörg S. schaue mir die Tips mal mit mehr ruhe an. Bin etwas ungehalten über die PDFs von TI. Dirk
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
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
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
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 }
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.