Hallo liebes Forum,
beschäftige mich erst seit kurzem mit Mikrocontrollern und arbeite
gerade an einem Projekt für die Uni. Arbeite mit dem MSP430G2553 auf dem
LaunchPad und nutze CCS 5.5.
Zum Einstieg habe ich mir das Buch "Das MSP430 Mikrocontroller Buch" von
Marian Walter geholt.
Erste Frage, ist das veraltet oder warum funktionieren die CodeBeispiele
nicht, wenn ich Sie abtippe?
Bsp:
1
#pragma vector=TimerA0_VECTOR
2
__interruptvoidTIMERA0(void)
funktioiert nicht.
Im Internet habe ich dann folgendes gefunden:
1
#pragma vector = TIMER0_A0_VECTOR
2
__interruptvoidTIMER0_A0_ISR(void)
Das funktioniert.
Oder beispielsweise
1
TACTL|=TASSEL_2;
muss doch eigentlich
1
TA0CTL|=TASSEL_2;
heißen?!
Woran liegt das? Anderer MSP430 oder neuere Version von CCS?
Noch viel wichtiger, wo finde ich solche richtigen Funktionen etc. ?
Habe mal in der Head-Datei gesucht, aber daraus werde ich auch nicht
schlauer. Das Datenblatt vom MSP430G2553 gibt auch nichts her.
Wäre dankbar, wenn Ihr mir mal die richtige Richtung zeigen könntet, wie
ich mir bei Problemen am Besten selbst helfe.
LG, Andy
wieder mal die tibetanische Gebetsmühle:
1. Lies das zugehörige Manual.
2. Zieh dir aus diesem Manual alle dich interessierenden Namen von
Registern, Vektoren usw. heraus und dann gleichst du deine Headerdatei
damit ab oder schreibst dir einfach selbst eine gemäß Manual.
3. Dann denkst du dir deine eigene Anwendung aus und versuchst nicht,
sklavisch irgendwelche Beispiele ohne eigenes Nachdenken abzutippen.
W.S.
Weil du dir das Datenblatt zu dem mC nicht anschaust.
Schaust du da rein wirst du feststellen das es ein TACTL gar nicht gibt,
sondern nur TA0CTL, TA1CTL, usw...
Andreas S. schrieb:> TACTL |= TASSEL_2;
Ist halt allgemein gehalten, sollte dann aber meiner Meinung nach TAxCTL
heißen. vielleicht ist das Buch einfach "nicht so gut" verfasst, was
gerade für Leute wie dich, die was Lernen wollen, besonders schade ist.
Beim nächsten Beispiel einfach ein bisschen mit denken, ruhig mal kurz
ins datenblatt schauen, dann sollte es auch ohne Internet funktionieren
;)
Andreas S. schrieb:> Wäre dankbar, wenn Ihr mir mal die richtige Richtung zeigen könntet, wie> ich mir bei Problemen am Besten selbst helfe.
Einfach mal ein bisschen im Datenblatt lesen ^^
http://www.ti.com/lit/ds/symlink/msp430g2553.pdf
Grüße
Andreas S. schrieb:> Woran liegt das? Anderer MSP430?
Genau das. Das Buch dürfte halt ziemlich veraltet sein, und die
Registernamen sind nicht bei allen MSP430-Varianten identisch, was damit
zu tun hat, daß manche Peripherieelemente bei manchen Varianten mehrfach
oder auch in neueren, erweiterten Versionen vorhanden sind.
@all
Das hat doch rein gar nichts mit dem µC zu tun. Es geht auch nicht um
alt und neu. Das sind C Syntax Fehler, zu denen der Compiler eindeutige
Meldungen ausgibt.
Also erst ein paar C Grundlagen lernen und erst dann anderer Leute
Arbeit kritisieren.
Die fehlerhafte Programmierung von jemandem, der C Syntax noch nicht
kennt.
Das erste Beispiel zeigt es sehr gut: Gleiche Buchstabenfolge, nur
einmal alles groß geschrieben, und einmal klein/groß gemischt.
Das hat mit Datenblättern oder unterschiedlichen uC rein gar nichts zu
tun!
Naaaaa .... ?
Go MSP schrieb:> Das erste Beispiel zeigt es sehr gut: Gleiche Buchstabenfolge, nur> einmal alles groß geschrieben, und einmal klein/groß gemischt.
Gleiche Buchstabenfolge?
> #pragma vector=TimerA0_VECTOR> __interrupt void TIMERA0(void)> #pragma vector = TIMER0_A0_VECTOR> __interrupt void TIMER0_A0_ISR(void)
Aha. Soso.
Wohl doch nicht. Wie übrigens die ISR selbst heißt, ist völlig
irrelevant, das einzig entscheidende ist die korrekte Schreibweise des
Interruptvektors.
Und das wiederum hat mit C exakt nichts zu tun, denn C kennt gar keine
Interruptvektoren. Tatsächlich sind das numerische Konstanten, die in
irgendeiner Headerdatei drinstehen, und die von der proprietären
Compilererweiterung #pragma vector verwendet wird.
Sicher, daß Du Dich aus diesem Fenster lehnen möchtest?
Hallo Andreas,
ich würde dir dringend raten den Code Composer Studio von Ti runter zu
laden. Der ist für privat kostenlos und die Codebeschränkung ist bei den
kleinen Typen auch unbedeutend.
Das besondere ist da gibt es unter Projects>CCS Example Project ca. 70
so genannte MSP430G2x53 One-Click Project Files. Da ist nichts großes
oder weltbewegendes dabei, aber eben viel kleine Progrämmchen an denen
kann man mal einwenig rumspielen oder sie als Rahmen für die ersten
eigenen Projekte verwenden. Erfahrungsgemäß ist so was immer sehr
ergiebig.
Gruß Bernhard
Rufus Τ. Firefly schrieb:> Und das wiederum hat mit C exakt nichts zu tun, denn C kennt gar keine> Interruptvektoren. Tatsächlich sind das numerische Konstanten, die in> irgendeiner Headerdatei drinstehen, und die von der proprietären> Compilererweiterung #pragma vector verwendet wird.>> Sicher, daß Du Dich aus diesem Fenster lehnen möchtest?
Ja, bin mir sicher.
Du schreibst ja selber 'numerische Konstanten' . Irgendeiner hat C Code
in einen Header geschrieben. Und jetzt passt der Header nicht zum
eigenen C file. That 's all!
Das hat nix mit dem uC zu tun. Ob mein uC genau diesen Timer hat, ist
dem Compiler doch völlig egal!
@Andy
Wirf einen Blick in das Header file für genau deinen Controller. Du
findest die Datei beim Compiler im Pfad INC oder INCLUDE. Dort findet du
die ganzen Bezeichner und dann über setzt der Compiler fehlerfrei.
@Go MSP: du redest leider etwas wichtig, aber inhaltlich eher.. äähm
hmmh. naja. so halt. ich darfs nich schreiben, sonst kommen die
moderatoren^^
Mit Syntax hat das alles nichts zu tun. Groß/Kleinschreibung und
Symbolnamensgebung sind keine Syntaxelemente.
Ich hoffe dein Fenster ist nicht im 3. Stock.....
... schrieb:> @Go MSP: du redest leider etwas wichtig, aber inhaltlich eher..> äähm> hmmh. naja. so halt. ich darfs nich schreiben, sonst kommen die> moderatoren^^>> Mit Syntax hat das alles nichts zu tun. Groß/Kleinschreibung und> Symbolnamensgebung sind keine Syntaxelemente.>> Ich hoffe dein Fenster ist nicht im 3. Stock.....
Kein Problem. Ich glaube aber nicht, dass er ohne verständliche Hinweise
einen übersetzbaren Code bekommt.
Ich wohne noch höher. :-D
Ich kenne den MSP nicht, aber vermutlich ist es genau das gleiche
Problem, wie bei den Atmel AVR. Die Entwickler sind so stolz auf ihren
MC, daß sie nicht im Entferntesten an die Programmierung denken.
Bei jedem Typ werden die Registernamen und die Bits und die
Interruptvektoren völlig neu gemischt.
Ich glaube, es gibt keinen MC-Entwickler, der mal weiter als bis zur
Nasenspitze denkt und generische Namen vergibt, die auch für zukünftige
Derivate Platz lassen. Einfach Timer0..100, Port 0..100, Interrupt
0..100 usw.
Aber nein, bei den ersten AVRs wurden die Register für Timer 0, 1,
Interrupt 0, 1 usw. wild gemischt. Und ab Timer 2 steht man dann
plötzlich blöd da und nennt alles um.
Die Compilerbauer können natürlich nicht anders und müssen die Namen aus
den Datenblättern nehmen, die der Hersteller vorgibt. Und daher kriegst
Du bei einem anderen Target sofort tonnenweise Fehler um die Ohren
geballert.
Peter Dannegger schrieb:> Ich kenne den MSP nicht, aber vermutlich ist es genau das gleiche> Problem, wie bei den Atmel AVR.
Nein, so ist das nicht. Die Compilerbauer haben für den MSP Aliasse
eingesetzt. Wo es von der HW kompatibel ist, ist es auch vom SW
Interface kompatibel. Wo es aber inkompatible Unterschiede in der HW
gibt, sind natürlich die Registernamen in den Header unterschiedlich.
Zumindest bei AVR ändern sich die Namen manchmal, ich vor allem bei
Namen für Interrupt-Vektoren drüber gestolpert. Das ist vor allem dann
nervig, wenn das vorliegende Datenblatt nicht mit der vorliegenden
C-Library (avr-libc) überein stimmt.
Manchmal hilft ein Blick direkt in die Libraries, um herauszufinden. Oft
scheitert es nur wie in Deinem Fall an der Numerierung und an
Unterstrichen.