Forum: Mikrocontroller und Digitale Elektronik IAR workbench + olimex msp430-jtag-ISO


von Dete K. (dete)


Lesenswert?

hallo zusammen,

ich will einen msp430F1232 mittels olimex msp430-jtag-ISO Programmer und 
der IAR workbench programmieren.
ich habe die Treiber von olimex installiert und ins IAR .. Verzeichniss 
kopiert (alles laut Anleitung auf der olimex-Seite).

Nun ist es aber so, dass ich keine Erfahrung mit dem msp430, dem olimex 
Programmer und der IAR Workbench habe und mir deswegen verschiedene 
Tutorials, Anleitung und Beispiele angeschaut habe.
Auch die Beiträge hier im Forum zum Thema msp430 programmieren bin ich 
durchgegangen.

Das verwirrende ist das in jeder Anleitung, die man im Netz findet, auch 
andere Einstellungen in der IAR Workbench vorgenommen werden. Das mir 
einzigst Klare ist, dass unter "general options" --> Device meinen 
mps430f1232 auswählen muß.

diese ganze Testerei, mit den verschieden Anleitungen und 
unterschiedlichen Einstellungen hat zur Folge das ich jetzt bei 
"download und debug" eine Fehlermeldung bekomme "session could not be 
started ...   *.txt was corrupt or an unsopported Format"

Welche Einstellung ist nur die richtige?
Welche Einstellungen muß ich vornehmen?
muß ich "Debug" oder "Release" auswählen?
..
..


bitte helft mir Licht ins Dunkel zu bekommen.

Gruß dete

von Jörg S. (joerg-s)


Lesenswert?

Dete Kosschlovsski schrieb:
> muß ich "Debug" oder "Release" auswählen?
Mit beiden kannst du programmieren. Aber nur bei debug werden die Infos 
erzeugt damit du Breakpoints etc. setzen kannst.

von Dete K. (dete)


Lesenswert?

Ich habe jetzt einige Erfolge erzielt.
Ich bin nochmal die die Tutorials durchgegangen die ich gefunden hatte 
und
und stieß, für die Einstellungen unter "options" auf dem Punkt:

Debugger --> setup --> override default  --> haken rein

download und debug starten und siehe da er tat was.
Es wurde erkannt dann mein target ein msp430f123 ist. ????
obwohl auf der TI Sample tüte msp430f1232 steht ???
naja habe also unter general options das device auf msp430f123 geändert 
und seit dem funktioniert es.

Aber es tauchen einige neue Fragen auf:

woran erkenne ich ob ich zum programmieren nun Jtag oder SPY-BI-WIRE 
benutze?

und:

an den Pins 28,27,26 und 25 des msp430 ist die jtag schnittstelle.
wenn ich aber diese Pins als GPIO (P1.7, P1.6 P1.5 und P1.4) nutze,
und nur zum Programmieren sie als jtag, Wie wird dann im debug modus 
zwischen jtag komm. und eigentlichen Daten die an den pins rein und raus 
sollen unterschieden?

oder seh ich das was falsch? und ja was?

z.Z letzte Frage:

Im debugmodus, an der stelle:
1
 P1DIR=0xFF;  // port 1 = output

steigt der Strom der in schaltung reinfließt extrem an. obwohl an dem 
port nichts angeschloßen ist? (nur halt die Jtag schnittstelle) 
eigentlich ist da ein LCD modul dranne(steckbar)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dete Kosschlovsski schrieb:
> woran erkenne ich ob ich zum programmieren nun Jtag oder SPY-BI-WIRE
> benutze?

Das hängt davon ab, was Du angeschlossen hast.

Dein Problem mit den doppelt belegten JTAG-Pins würde sich in nichts 
auflösen, wenn Du Spy-Bi-Wire verwenden würdest.

von Jörg S. (joerg-s)


Lesenswert?

Dete Kosschlovsski schrieb:
> wenn ich aber diese Pins als GPIO (P1.7, P1.6 P1.5 und P1.4) nutze,
> und nur zum Programmieren sie als jtag, Wie wird dann im debug modus
> zwischen jtag komm. und eigentlichen Daten die an den pins rein und raus
> sollen unterschieden?
Mit dem "TEST" Pin werden JTAG Pins auf JTAG geschaltet. Siehe 
Pin-Schema im Datenblatt.

von Jörg S. (joerg-s)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Dein Problem mit den doppelt belegten JTAG-Pins würde sich in nichts
> auflösen, wenn Du Spy-Bi-Wire verwenden würdest.
Er hat aber einen alten 1xx MSP ohne SBW.

von Dete K. (dete)


Lesenswert?

hallo

ich benutze jtag, das ist nun sicher.
soweit funktioniert alles, auch der plötzlich es stromanstieg ist 
behoben.

--> jetzt gehts ans programmieren

habe dazu auch noch eine frage / problem
1
 for(;;) 
2
      {  
3
        if ((P2IN & 0x10) == 0 && tempp == 0 )
4
          {
5
           tempp = 1;
6
           inc++;
7
          }
8
        if ((P2IN & 0x10) == 1)
9
          {
10
           tempp = 0;
11
          }
12
      }

an P2.4 ist taster angeschloßen und in der endlosschleife (in der später 
noch mehr passieren soll) prüfe ich ob taster gedrückt ist oder nicht.
ist er gedrückt liegt an p2.4 low an und damit soll inc un eins erhöht 
werden.
damit das aber pro drücken nur einmal passiert, wird halt diese tempp =1 
gesetzt.
ist Taster nicht gedrückt liegt ein high an (mit oszi gemessen)

problem:
das ein low anliegt erkennt er und geht auch in die 1. if bedingung rein
aber das high erkennt er nicht und setzt dementsprechend tempp nicht 
wieder auf 0
und somit komme ich auch nicht wider in die erste if bedingung ???

was ist hier falsch?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dete Kosschlovsski schrieb:
> was ist hier falsch?


Das hier.

> if ((P2IN & 0x10) == 1)


Ein mit 0x10 verANDeter Wert kann niemals den Wert 1 annehmen.

von Dete K. (dete)


Lesenswert?

na wie frage ich den p2.4 ob ein high anliegt richtig ab?

von Christian R. (supachris)


Lesenswert?

Ganz einfach so:

if (P2IN & 0x10)

Fertig.

von Dete K. (dete)


Lesenswert?

jetzt kapier ich gar nichts mehr
1
 for(;;) 
2
      {  
3
        if ((P2IN & 0x10) == 0 && tempp == 0 ) // rein wenn pin low ist
4
          {                                  // taster gedrückt
5
           tempp = 1;
6
           inc++;
7
          }
8
        if (P2IN & 0x10) // rein wenn high ist
9
          {                // taster nicht gedrückt
10
           tempp = 0;
11
          }
12
      }

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dete Kosschlovsski schrieb:
> jetzt kapier ich gar nichts mehr

Wieso nicht?

Du müsstest entweder anstelle von

> if ((P2IN & 0x10) == 1)

mit dem Wert vergleichen, der bei einer verANDund mit 0x10 nur 
herauskommen kann:

> if ((P2IN & 0x10) == 0x10)

oder aber (und das macht Christians Beispiel) einfach nur überprüfen, 
daß das Ergebnis der verANDung wahr, also nicht 0 ist.

> if ((P2IN & 0x10) != 0)

oder, kürzer formuliert

> if (P2IN & 0x10)

von Dete K. (dete)


Lesenswert?

oh man, erst mal danke für eure geduld
und vor allem eure hilfe

es wäre doch einfacher die pins einzeln abzu fragen, oder?
also nur den P2.4 ober er ==0 oder ==1 ist
geht das?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dete Kosschlovsski schrieb:
> es wäre doch einfacher die pins einzeln abzu fragen, oder?

> also nur den P2.4 ober er ==0 oder ==1 ist
> geht das?

Nur auf wenigen Controllerarchitekturen, die den Zugriff auf einzelne 
Bits erlauben, und dann auch nur, wenn der C-Compiler für diese 
Architekturen diese einzelnen Bits wiederum in C-Datentypen verpackt.

Für die MCS-51-Reihe gibt es derartiges, aber für MSP430 nicht.

Einfacher ist das auch nicht, es bedarf nur etwas mehr Beschäftigung 
mit Bitoperationen in C.

Wer etwas mehr C programmiert, für den sind Ausdrücke wie die weiter 
oben vollkommen normal und transparent zu lesen.

In der AVR-Welt (die in diesem Forum recht häufig vertreten ist), werden 
übrigens gerne Konstanten für die Nummern der Bits verwendet und dann 
mit dem Schiebeoperator der Bitwert daraus bestimmt.

So etwas sieht dann so aus:
1
#define PIN4 4
2
3
if (P2IN & (1 << PIN4))

Das aber ist auf dem MSP430 wiederum ungebräuchlich, dort wird der 
Konstante nicht die Nummer, sondern der Wert des Bits zugewiesen und 
entsprechend anders abgefragt:
1
#define PIN4 0x10
2
3
if (P2IN & PIN4)

Die Bit_nummern sind für die AVR-Reihe wichtig, da dort die mit den 
üblichen Compilern ausgelieferten Headerdateien, die die 
Controllerperipherie beschreiben, auch von Assemblerprogrammen aus 
genutzt werden können sollen; die AVR-Reihe kann wie auch die 
MCS-51-Reihe bitweise auf Register zugreifen, und dafür ist das 
erforderlich.

Beim MSP430 aber enthalten die Headerdateien keine Bitnummern, sondern 
eben Bitwerte, und Du wirst in Codebeispielen von TI praktisch nie die 
(1 << Bitnummer)-Notation finden.

von Dete K. (dete)


Lesenswert?

hallo

erstmal vielen Dank für euere Antworten und eure hilfe.
in den letzten Freizeitstunden hab ich viel am Quellcode geschafft.

mein anfängliches Tasterproblem hat sich auch erledigt -- Es ist mir wie 
schuppen von den Augen gefallen

aber ein kleines großes Problem ahb ich noch:

ich muß über 400 (genauere zahl kann ich noch nicht nennen) x 5 byte 
speichern.

Anfangs hatte ich mir eine switch anweisung überlegt

a la:

..
..
case 100:
Din[0] = 12;
Din[1] = 24;
Din[2] = 8;
Din[3] = 34;
Din[4] = 1;
break;
case 101:
Din[0] = 255;
Din[1] = 89;
Din[2] = 87;
Din[3] = 32;
Din[4] = 11;
break;
.
.
usw...

aber auch Speichergründen hatte ich das verworfen und bin auf:

char D1[400] = {1,23,56,75,7,8 ....
char D2[400] = {23,2,5,15,7,81 ....
char D3[400] = {14,223,52,35,7,28 ....
char D4[400] = {21,213,143,45,7,84 ....
char D5[400] = {17,233,150,77,7,82 ....

aber bei so vielen Werten mekkert der comiler rum, selbst bei nur 50 
Werten pro array.
testhalber sind die Arrays jetzt nur 25 lang

compilermeldung:

Error[e16]: Segment CSTACK (size: 0x50 align: 0x1) is too long for 
segment definition. At least 0x2d more bytes needed. The problem 
occurred while processing the segment placement command 
"-Z(DATA)CSTACK+_STACK_SIZE#",
where at the moment of placement the available memory ranges were 
"CODE:2dd-2ff"
   Reserved ranges relevant to this placement:
   200-2c9              DATA16_I
   2ca-2dc              DATA16_Z
   2dd-2ff              CSTACK


wie kann ich die ca 400 x 5 byte speichern?

von Jörg S. (joerg-s)


Lesenswert?

Der MSP430F1232 hat 256Byte RAM und 8kByte Flash. Du musst du schon mal 
nachschauen ob das alles da rein passt :)
Deine 2000Byte gehen also nur ins Flash. Dazu musst du ein "const char" 
benutzen.
Die Werte sind dann natürlich fest (unveränderlich).

von Dete K. (dete)


Lesenswert?

5 byte * 400 = 2kB

da hab ich dann noch 6 KB für mein Programm.

ich benutzte die IAR Workbench von der TI.com seite
Wo sehe ich denn wieviel speicher ich bereits im Controller verwende?

von Jörg S. (joerg-s)


Lesenswert?

Du kannst die Anzeige unten im Compiler so einstellen das er nicht nur 
die Warnungen und Error ausgibt, sondern alles.
Wenn du da mit der rechten Maustaste raufklickst, solltest du in das 
Menü kommen wo du den "Output" von dem Fenster einstellen kannst.

von Dete K. (dete)


Lesenswert?

wollt gearden schreiben das ich das gefunden habe.

ich bekomme die Meldung:

   IAR C/C++ Compiler V5.10.6.30180/W32, Kickstart edition for MSP430
   Copyright 1996-2010 IAR Systems AB.

 936 bytes of CODE  memory
 127 bytes of CONST memory
 146 bytes of DATA  memory (+ 14 bytes shared)


...

     IAR Universal Linker V4.61T/W32
     Copyright (C) 1987-2010 IAR Systems AB.

 1 670 bytes of CODE  memory
   201 bytes of DATA  memory (+ 14 absolute )
   102 bytes of CONST memory


...

wenn ich mir die Werte anschaue, würde ich sagen das die etwa 2kB  für 
die array da noch rein passen. Das Programm ist komplett.

von Dete K. (dete)


Lesenswert?

nur zur info:

ich habe das Problem gelöst.
Da sich die Werte in den 5 char Arrays nicht ändern und nur gelesen 
werden,
habe ich sie als const char [] .. deklariert.
somit mekkert der Compiler oder Linker nicht rum.

@ all: danke für eure hilfe,
Ich wünsche euch allen ein frohes Fest

gruß Dete

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.