Forum: Mikrocontroller und Digitale Elektronik Warum funktionieren Codebeispiele nicht?


von Andreas S. (andymilbe)


Lesenswert?

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
__interrupt void TIMERA0(void)
funktioiert nicht.

Im Internet habe ich dann folgendes gefunden:
1
#pragma vector = TIMER0_A0_VECTOR
2
__interrupt void TIMER0_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

von W.S. (Gast)


Lesenswert?

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.

von Kaj (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Go MSP (Gast)


Lesenswert?

@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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Go MSP schrieb:
> Das sind C Syntax Fehler, zu denen der Compiler eindeutige
> Meldungen ausgibt.

Ach ja?

Und was verursacht diese Syntaxfehler? Naaaa?

von Go MSP (Gast)


Lesenswert?

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 .... ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von BernhardT (Gast)


Lesenswert?

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

von Go MSP (Gast)


Lesenswert?

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!

von Go MSP (Gast)


Lesenswert?

@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.

von ... (Gast)


Lesenswert?

@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.....

von Go MSP (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Go MSP (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

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.