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
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.
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)
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.
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.
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.
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?
Dete Kosschlovsski schrieb: > was ist hier falsch? Das hier. > if ((P2IN & 0x10) == 1) Ein mit 0x10 verANDeter Wert kann niemals den Wert 1 annehmen.
na wie frage ich den p2.4 ob ein high anliegt richtig ab?
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 | }
|
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)
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?
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.
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?
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).
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.