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:
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