Forum: Mikrocontroller und Digitale Elektronik Programmier Probleme beim MSP430


von Markus S. (Gast)


Lesenswert?

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

von Christian R. (supachris)


Lesenswert?

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.

von OVP (Gast)


Lesenswert?

"mich" und "mir" üben!

von Johnny B. (johnnyb)


Lesenswert?

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
}

von Wolfgang-G (Gast)


Lesenswert?

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

von Markus S. (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mark (Gast)


Lesenswert?

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.

von Jörg S. (joerg-s)


Lesenswert?

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 Johnny B. (johnnyb)


Lesenswert?

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.

von Markus S. (Gast)


Lesenswert?

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

von Mark (Gast)


Lesenswert?

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.

von Markus S. (Gast)


Lesenswert?

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

von Markus S. (Gast)


Lesenswert?

Ich meinte natürlich
"Hallo Mark"

von Mark(us) (Gast)


Lesenswert?

schon OK, ich hatte meinen Namen nur abgekürzt ;-)

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.