mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Startschwierigkeiten


Autor: glagnar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich mache gerade meine ersten Schritte mit dem MSP430 (in Verbindung mit 
MSP430-GCC unter Windows XP). Die Hardware funktioniert soweit 
(MSP430F1121A im BSL-Modus über USB-Seriell-Adapter). Ich habe ein 
kleines Python-Programm geschrieben, das mit dem BSL des MSP430 
kommuniziert und ich kann den Controller auslesen, beschreiben, etc. 
Leider läuft das einfachste Testprogramm nicht, und ich kann den Fehler 
nicht finden. Das Programm soll einfach eine LED blinken lassen, die an 
P1.4 angeschlossen ist. Was jedoch passiert ist, daß die LED dauerhaft 
leuchtet. Dabei macht es keinen Unterschied, ob ich den Controller 
resette oder den Code mittels der "Load PC" Bootloaderfunktion 
anspringe. Hier das Programm:

#include    <signal.h>
#include    <io.h>

    .section  .text
RESET:      mov     #0x300,R1        ; Initialize stack pointer

StopWDT:    mov     #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT

      bis.b  #0x10,&P1DIR

L1:      bis.b  #0x10,&P1OUT
      call  Delay
      bic.b  #0x10,&P1OUT
      call  Delay
      jmp    L1
      
      
Delay:    mov    #0xffff,R15
D1:      dec    R15
      jnz    D1
      ret

    .section  .vectors  
    .org    RESET_VECTOR,0xFF
    .word   RESET                   ; POR, ext. Reset, Watchdog

Das Makefile:

CC=msp430-gcc
CPPFLAGS= -g -O2 -mmcu=msp430x1121 -D_GNU_ASSEMBLER_ -nostartfiles -nostandartlibs

all:
  $(CC) $(CPPFLAGS) ledblink.S -o ledblink.o

hex:
  msp430-objcopy -I elf32-msp430 -O ihex ledblink.o ledblink.hex

clean:
  -rm -f $(PROGS)

Das Intel-Hexfile, das msp430-objcopy produziert:

:10F00000341231400003B240805A2001F2D0100087
:10F010002200F2D01000210090120E00F2C0100069
:10F02000210090120400F53F3F431F83FE2330412F
:040000030000F00009
:00000001FF


Und ein Hexdump des Controllers nach dem Flashen:

f000  34 12 31 40 00 03 b2 40 80 5a 20 01 f2 d0 10 00  4.1@...@.Z .....
f010  22 00 f2 d0 10 00 21 00 90 12 0e 00 f2 c0 10 00  ".....!.........
f020  21 00 90 12 04 00 f5 3f 3f 43 1f 83 fe 23 30 41  !......??C...#0A
f030  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................
f040  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................
f050  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................
f060  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................
f070  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes kannst du tun:

1. Nachprüfen, ob bis.b #0x10,&P1DIR die Leitung P1.4 auf Output setzt
   (Im Manual nachlesen!)
2. Mit welchen Takt läuft der µC? Womöglich ist die Zählschleife viel zu
   schnell abgelaufen, als daß du was blinken sehen könntest.
   (Dann sollte aber wenigstens die LED ~ auf halber Helligkeit
   leuchten.)
3. Im µC nachsehen, ob der Reset-Vektor auch initialisiert ist

Autor: glagnar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Uhu,

danke für Deine Antwort. Zu 1.: ja, der Befehl stimmt. Ich kann auch von 
Hand im BSL das 4. Bit an Adresse 0x22 (=P1DIR) setzen und die LED geht 
an. Lösche ich es, geht sie wieder aus ...

Zu 2.: Der BSL konfiguriert den internen Oszillator auf ~2 MHz, das 
Blinken sollte noch wahrnehmbar sein. Zur Sicherheit habe ich die 
Warteschleife aber dahingehend verändert:

Delay:   mov    #0x40,R15
D2:      mov    #0xffff,R14
D1:      dec    R14
         jnz    D1
         dec    R15
         jnz    D2
         ret

Kein Unterschied. Zu 3.: Die Interruptvektoren sehen so aus:

ffe0  00 f0 00 f0 00 f0 00 f0 00 f0 00 f0 00 f0 00 f0  ................
fff0  00 f0 00 f0 00 f0 00 f0 00 f0 00 f0 00 f0 00 f0  ................

Zeigen also alle auf meinen Code.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die vorletzte Zeile in deinen hex-File:

   :040000030000F00009

Wenn ich das richtig interpretiere, ist das dein Resetvektor - aber die 
Adresse ist 0. Warum?

Was auch merkwürdig ist: Wieso sind alle Interruptvektoren 
initialisiert? In deinem Hex-File steht das nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.