Hallo allen Progammierexperten, ich habe mich vor einigen Monaten zeigen lassen was man mit einem Microprozessor alles machen kann. Seit dieser Zeit bin ich dabei mich in die Programmierung von einem MSP430 einzuarbeiten. Ich habe bei einer blinkenden LED angefangen und habe es letzte Woche geschafft, mit einen Temparaturwiderstand (normaler NTC) und einer 7-Segmentanzeige ein Thermometer zu programmieren. Ich möchte mit dem MSP430149F irgendwann einmal meine Heizung steuern. Leider bin ich jetzt an einem Punkt angelangt wo ich nicht weiter komme. Ich habe einen guten Kollegen der mich sehr gut in der C-Programmierung untersützen kann. Leider kennt er sich nicht mit Microprozessor aus. Ich habe schon sehr viel hier im Forum und auf einigen anderen Seiten gelesen und schon einiges gelernt. Ich habe mir schon diverse Datenblätter, User Guides, Beispielprogramme von TI usw. runter geladen. Leider ist mein englisch nicht so gut dass ich alle Detail verstehe. Ich weiß mitterlweile wie zB. ein Timer arbeitet aber ich verstehe nicht wie man von einer Taktfrequenz von 8MHz auf eine Sekunde kommt. Und wenn ich dazu die Progammbeispiele sehe fehlt mir der Zusammenhang. Es gibt hier im Forum ja sehr viele Experten die das Programmieren im schlaf beherschen. Meine Frage lautet einfach wo oder wie kann man das am besten lernen. Ich habe auch schon mal nach deutschen Büchern gegoogelt aber so richtig fündig geworden bin ich nicht. Das einzige Buch was für mich recht gut erschien, ist für die nächsten 3 bis 8 Monate nicht lieferbar. Ich hoffe ihr könnt einem Anfänger helfen wie man Programmieren von einem MSP430 am besten lernen kann. Ich bedanke mich für jeden Tip Gruß Markus
Mit einem Timer alleine kommst du nicht auf eine Sekunde. Der hat nur 16 Bit und kann aus 8MHz daher mindestens 15,25Hz, wenn du den /8 Vorteiler noch mit rein nimmst. Du kannst aber mit Hilfe des Timers (/8 Teiler benutzen) die alle 50.000 Impulse einen Interrupt generieren lassen und in dem Interrupt eine Variable hochzählen. Wenn die Variable 20 erreicht hat, ist eine Sekunde rum. Dann die Variable wieder zurück setzen und weiter gehts.
Genau, mach einfach einen Timerinterrupt (da gibts genügend Beispiele) und Teile den Takt dann selber weiter herunter. Ich würde das in etwa so machen wie unten, wobei die 2000 natürlich Deinen Bedürfnissen bzw. gemäss dem periodischen Timerinterrupt angepasst werden muss. Interrupt vom Timer:
1 | mein_zaehler++; |
2 | |
3 | if (mein_zaehler > 2000) |
4 | {
|
5 | mein_zaehler = 0; |
6 | |
7 | eine_sekunde_erreicht = 1; |
8 | }
|
Hauptprogramm:
1 | while(1) |
2 | {
|
3 | if (eine_sekunde_erreicht) |
4 | {
|
5 | eine_sekunde_erreicht = 0; |
6 | |
7 | // Hier kommt Dein Code rein...
|
8 | }
|
9 | }
|
vielleicht: Lutz Bierl - Das große MSP430 Praxisbuch (deutschsprachig) Man kann den MSP430F149 mit einem 32768Hz UND einem 8MHz Quarz bestücken. Mit dem 32768Hz Quarz lassen genaue Sekundentakte, sowie vielfache und Teile einer Sekunde erzeugen. MfG
Hallo, vielen Dank erst mal für Eure Hilfe. Die Sache mit dem Timer war ja nur ein Beispiel. Es ist sehr nett dass ihr mir erklärt wie ein Timer Funktioniert aber ich hätte dazu gleich wieder 1000 Fragen aber das will hier keinem zumuten sonst würde dieser Beitrag sehr lang werden. Ich werde mir mal das Buch welches Wolfgang-G vorgeschlagen hat ansehen vielleich klappt es damit. Wie habt ihr denn das programmieren gelernt?? Studium oder selbst bei gebracht? Helfer gehabt? Danke noch mal. Markus
Naja, der Bierl ist hier nicht so gut geeignet. Der ist nicht als einführende Literatur in die Programmierung allgemein oder auch in die MSP430-Reihe gedacht, sondern ist eher ein auf Deutsch formuliertes Programmierhandbuch mit ein paar knappen Beispielen.
Hallo Markus möglicherweise fehlen Dir die Grundlagen in Digitaltechnik. Da solltest Du Dich zuerst mal reinknien, wenns da mangelt. Das 'Programmieren' ist ein weiter Begriff, erlernen kann man das selber, es gibt jetzt so viele Möglichkeiten (vielleicht zu viele), Bücher, Datenblätter von Controllern, Application Notes, GigaBytes von Code-Beispielen im Internet, Foren usw. - da ist eigentlich alles verfügbar. Ein Widerspruch ist für mich Deine Aussage : "Ich weiß mitterlweile wie zB. ein Timer arbeitet aber ich verstehe nicht wie man von einer Taktfrequenz von 8MHz auf eine Sekunde kommt." Das kann ich wirklich nicht nachvollziehen. Vielleicht hängt es damit zusammen, dass man mit den verfügbaren Starter-Kits und Code-Beispielen relativ schnell anfängliche (Schein-)Erfolge erzielen kann. Wenn man aber dann eigene Ideen umsetzen möchte fehlen eben die einfachsten Grundlagen. Du kannst ja mal schreiben, wie Deine Kenntnisse im Bereich Digitaltechnik sind.
Markus S. schrieb: > Wie habt ihr denn das programmieren gelernt?? Studium oder selbst bei > gebracht? Helfer gehabt? Learning by Doing. Ich lerne am besten wenn ich mir fertigen Code anschaue und dann versuche zu verstehen was da getan wird. Du kennst Mathar schon? http://www.mathar.com/msp430.html
Von Büchern halte ich persönlich nichts. Am schnellsten wirst Du zum Ziel kommen, wenn Du Dir die Grundlagen an einem Kurs aneignest. Am besten erstmal Digitaltechnik und C Programmierung. Danach steigst Du gleich in ein konkretes Projekt ein und setzt das gelernte um bzw. suchst Dir die fehlende Information bei Kollegen oder im Internet. Wissenslücken sind normal, auch bei Profis. Keiner weiss alles und daher ist es wichtig zu lernen, wie man überhaupt an die gesuchten Informationen rankommt.
Hallo Mark, ich bin gelernter Elektriker und habe später Maschinenbau studiert und habe deshalb ein gewisses verständiss für Elektrik. Im Elektronikbereich bin ich (leider) nur ein Laie. Ich weiß leider auch nicht was man speziell unter "Digitaltechnik" versteht. Sind damit Logikverküpfungen gemeint? UND, ODER, NAND usw.? Vielleicht kannst du mir ein paar Stichworte geben damit ich weiß wonach ich suchen muss. Wenn Das Lernen von C Programmierung macht mir nicht so viele Schwierigkeiten den da gibt es ja wirklich genug Hilfe im Netz. Leider sind diese Beispiele sehr auf PC Anwendungen bezogen und nicht auf Microprozessoren. >Ein Widerspruch ist für mich Deine Aussage : >"Ich weiß mitterlweile wie zB. ein Timer arbeitet aber ich verstehe >nicht >wie man von einer Taktfrequenz von 8MHz auf eine Sekunde kommt." Es es leider nicht so einfach zu erklären. Ich werde es mal mit einem Beispiel versuchen. #include <msp430x12x2.h> void main(void) { WDTCTL = WDTPW+WDTHOLD; // Stop WDT P2DIR = 0x001; // P2.0 output TACCTL0 = CCIE; // TACCR0 interrupt enabled TACCR0 = 65536-1; TACTL = TASSEL_1 + MC_1 + ID_3; // ACLK, upmode, divider 8 P2OUT = ~0x001; // P2 out _BIS_SR(LPM3_bits + GIE); // LPM3, enable interrupts } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P2OUT ^= 0x001; // Toggle P2.0 int i; for (i = 32000; i>0; i--); // Delay P2OUT = ~0x001; // P2 out } Ich habe hier mal irgendein Programbeispiel mit Timer hier aus dem Forum kopiert. Wenn ich mir die Zeilen ansehe verstehe ich : Watch Dog aussschalten P2.0 als IO Pin deklarieren nächste Zeile wird schon schwierieger. Ich würde sagen "Interrupt aktiviert". Aber woher weiß ich dass das durch diese Befehlszeile gemacht wird? Ich versuche immer mich mit den Blockdiagrammen aus den User Guids zu behelfen aber da finde ich den Ausdruck TACCTL0 nicht. Die nächste Zeile sagt wohl das der Zähler von 65536 bis 1 zählt. Danach wird festgelegt dass der Auxillary Clock verwendet wird, das aufwärts gezählt wir und das der Teiler 8 verwendet wird. Aber was bewirkt der Teiler 8? wird dabei die Frequenz von zB. 32KHz zu 4KH gewandelt? Die Bedeutung der nächsten beiden Zeile verstehe ich leider nicht. Ich weiß leider nicht ob bei der Zeile: _BIS_SR(LPM3_bits + GIE); das ein fester Befehl ist oder ob das Varablen mit bei sind so Ich hoffe ich konnte dir so einigermaßen Beschreiben was ich verstehe und was nicht. >Das kann ich wirklich nicht nachvollziehen. Vielleicht hängt es damit >zusammen, dass man mit den verfügbaren Starter-Kits und Code-Beispielen >relativ schnell anfängliche (Schein-)Erfolge erzielen kann. Wenn man >aber dann eigene Ideen umsetzen möchte fehlen eben die einfachsten >Grundlagen. Da ist mit sicherheit was drann. Denn ich habe sehr viel auf der Seite: http://www.mathar.com/msp430.html gelesen und gelernt und auch einige Erfolgserlebnisse gehabt. Und da es anscheinend an einigen Kenntnissen noch fehlt, will ich das ja lernen und wollte ja auch nur mal fragen wie man das am besten macht. Ich bedanke mich wieder für Eure Hilfe und werde weiter am Ball bleiben. Gruß Markus
Hallo Markus vielen Dank für die ausführliche Beschreibung! Grob gesagt würde ich folgende Agenda vorschlagen : 1) Studium Grundlagen Digitale Schaltungstechnik 2) Grundlagen Mikrocontroller Programmierung 3) MSP430 programmieren ... Für jeden Controller gibt es Blockschaltbilder der einzelnen Komponenten. Da Du bei µCs sehr nah an der Hardware programmierst, musst Du diese Block- bzw. Schaltbilder prinzipiell verstehen, dann siehst Du auch, dass der Timer z.B. einen Vorteiler hat und dieser wiederum aus verschiedenen Clocks gespeist werden kann. Das hardwarenahe Programmieren wird von vielen Programmierern wörtlich genommen, manche schreiben C-Code der fast wie Assembler aussieht. Und Kommentare sind natürlich Luxus. Die Zeile _BIS_SR(LPM3_bits + GIE); bewirkt z.B. dass sich der µC in den Stromsparmode 3 schlafen legt, aber gleichzeitig noch auf Interrupts reagieren kann. Ich meine noch kryptischer kann man das kaum hinschreiben, ausser man würde die Konstanten noch in ternärer Codierung ausdrücken oder so. Hier ist jeder Programmierer auch gefragt lesbaren und verständlichen Code zu schreiben, aber das ist alles subjektiv... Aus Deinen Ausführungen schliesse ich, dass Du in C auch noch üben musst. Falls Du mit englischen Abhandlungen nicht so klar kommst wäre vielleicht doch deutsche Literatur zu dem Thema C und Digitaltechnik angebracht.
Hallo Markus, wou das ging aber schnell. Ich werde versuchen deine Agenda abzuarbeiten ;o) Wenn ich dann ein spezielles Problem habe (die werde ich besimmt bekommen), werde ich mich hier im Forum wieder melden. Bis dahin vielen Dank noch mal. Gruß Markus
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.