www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 F1232 startet nicht


Autor: SuperGrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich hab mich dazu durchgerungen, meinen Dimmercode neu zu schreiben.
Jetzt kommt es aber vor, das der MSP in der neuen Version nicht
startet, wenn ich ihn mit Spannung versorge. Erst, wenn ich ihn über
den Compiler starte, rennt er los. In meiner alten Version lief er auch
ohne Compiler. Ich hab dann zum testen das alte Programm noch mal
eingespielt, danach gab es keine Probleme: Einschalten --> läuft aber
mit der neuen Version: Einschalten --> läuft nicht.

Ich schätze mal, das es an der Initialisierung liegt. Jedoch ist die
weitgehend identisch. Ich hab in der neuen Version einige Routinen
ausgelagert. Darunter auch die Initialisierung. Hier mal der Code:

alte Routine (läuft):
#include <msp430x12x2.h>
#include "i2c.c"

void main(void);
void Schieberegister(int);
void wait_zykl(unsigned int, unsigned int);
void Display(int);
void Control_Word(int,int);
void Disp_Zeit(int,int);
void Disp_Charmap(char*);
volatile int Menue, enc_delta;    // 

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // watchdog aus
  P1DIR = 0x08;             // Definieren der E/As
  P2DIR |= 0xFF;            // Set P2 to output direction
  P3DIR |= 0x83;            // Set P3 to output direction 3.0, 3.1 3.7
= Out Rest Input
  P1OUT = 0x00;             // initialisieren der Ausgänge
  P2OUT = 0x00; 
  P3OUT = 0x00; 
  
  // Starten des Quarzes 
  BCSCTL1 |= XTS;         // ACLK = LFXT1 = HF XTAL
  do 
  {                       // pruefroutine, ob 8 Mhz-oszillator schon
stabil ist
    IFG1 &= ~OFIFG;       // OSCFault flag loeschen (zeigt
oszillatorfehler an)
    for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
  }
  while (IFG1 & OFIFG);   // OSCFault immer noch gesetzt?       
  BCSCTL2 |= SELM_3;      // MCLK = LFXT1 (safe) 8 MHz 8,0005560
  BCSCTL2 |= SELS;        // SMCLK = LFXT1
  BCSCTL2 |= DIVS_0;      // SMCLK = LFXT1/2 = 4 MHz

  _BIS_SR(GIE);           // allgemeiner interrupt-enable (noetig fuer
nulldurchgangserkennung)
  CCTL0 = CCIE;           // CCR0 interrupt enabled
  CCR0 = 200;
  TACTL = TASSEL_2 + MC_1;// SMCLK, upmode

  P1IE=0x04;              // pin 1.1 interrupt-faehig machen (noetig
fuer nulldurchgangserkennung)
  P1IES=0x00;             // interrupt auf pin 1.1 ausloesen bei
low->high - uebergang

//  ADC10CTL1 = INCH_10+ADC10DIV_7;           // Temp Sensor
ADC10CLK/4
//  ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; // + ADC10IE
keinen Interrupt !!;

  helligkeit_global = 4;  // Helligkeit Start und Min
  helligkeit_max = 395;   // Helligkeit Max

// Watchdog Timer wird als Takt-Timer benutzt, weil Timer A für das
Dimmen eingesetzt werden soll
  WDTCTL = WDT_MDLY_8;                      // Watchdog Timer auf 1ms
setzen (kein Reset)
  IE1 |= WDTIE;                             // Enable WDT interrupt

Variablen hab ich jetzt mal weggelassen.
Und jetzt das neue Programm, das nicht startet:
#include <msp430x12x2.h>
#include "i2c.c"              // einbinden der I²C Funktionen
#include "init.c"             // einbinden der Prozessor
Initialisierung
#include "dimmer_routinen.c"  // einbinden der Dimmer Routinen

void mcu_init(void);
void Status(int);
void Uhr_abfrage(void);
void Flash_lesen(void);
void Flash_speichern(void);
void Status_Drehgeber(void);
void drehgeberAbfrage(void);
void displayZeit(void);
void Temp_abfrage(void);
void displayMenu(char,char);

// Varialblen deklarationen
struct Zeit{char stunde, minute, sekunde;};

struct Zeit Uhrzeit;

void main(void)
{
  char TasteDr, TA;
  unsigned int wait, Taste1Time;
  Status(128);
  P2OUT = 0xff;
  mcu_init();                               // Prozessor
initialisierung
//...
}

in der Datei init.c ist dann die Routine mcu_init:
void mcu_init(void)         // Init des MSP430
{
  unsigned int i;

  WDTCTL = WDTPW + WDTHOLD; // watchdog aus
  P1DIR = 0x08;             // Definieren der E/As
  P2DIR |= 0xFF;            // Set P2 to output direction
  P3DIR |= 0x83;            // Set P3 to output direction 3.0, 3.1 3.7
= Out Rest Input
  P1SEL = 0x08;             // P1.3 auf Timer A schalten
  P1OUT = 0x00;             // initialisieren der Ausgänge
  P2OUT = 0x00; 
  P3OUT = 0x00; 
  
  // Starten des Quarzes 
  BCSCTL1 |= 0x40;         //  HF XTAL
  do 
  {                       // pruefroutine, ob 8 Mhz-oszillator schon
stabil ist
    IFG1 &= ~OFIFG;       // OSCFault flag loeschen (zeigt
oszillatorfehler an)
    for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
  }
  while (IFG1 & OFIFG);   // OSCFault immer noch gesetzt?       
  BCSCTL2 |= SELM_3;      // MCLK = LFXT1 (safe) 8 MHz 8,0005560
  BCSCTL2 |= SELS;        // SMCLK = LFXT1
  BCSCTL2 |= DIVS_0;      // SMCLK = LFXT1/2 = 4 MHz

  _BIS_SR(GIE);           // allgemeiner interrupt-enable (noetig fuer
nulldurchgangserkennung)
  CCTL0 = CCIE;           // CCR0 interrupt enabled
  CCR0 = 39000;
  CCR2 = 39000;
  TACTL = TASSEL_2 + MC_1;// SMCLK, upmode
  CCTL2 = OUTMOD_3;       // Ausgang Toggeln
  
  P1IE=0x04;              // pin 1.1 interrupt-faehig machen (noetig
fuer nulldurchgangserkennung)
  P1IES=0x00;             // interrupt auf pin 1.1 ausloesen bei
low->high - uebergang
  
  // Watchdog Timer wird als Takt-Timer benutzt, weil Timer A für das
Dimmen eingesetzt werden soll
  WDTCTL = WDT_MDLY_8;                      // Watchdog Timer auf 1ms
setzen (kein Reset)
  IE1 |= WDTIE;                             // Enable WDT interrupt

  // Initialisieren der RTC (Trickle Charger) daran hängt ein 2200uF
Kondensator, 
  // der reicht für ca. 12 Stunden Stromausfall
  I2C_start();                              // START senden
  I2C_init(0x68, 'w');                      // den RTC adressieren
  while (!(I2C_gotACK()));
  I2C_sendbyte(0x0A);                       // Control Register
auswählen
  while (!(I2C_gotACK()));
  I2C_sendbyte(169);                        // INT einschalten
  while (!(I2C_gotACK()));
  I2C_stop();                               // STOP senden     
  
  // Initialisieren des Temperatursensors (12 Bit Modus)
  I2C_init(0x49, 'w');                      // den sensor auslesen
  while (!(I2C_gotACK())); I2C_sendbyte(0x01);  // pointer register:
P1=0, P0=1 (d.h.: config. reg. ansprechen)
  while (!(I2C_gotACK())); I2C_sendbyte(0x60);  // TMP100 auf
12-bit-modus stellen
  while (!(I2C_gotACK())); I2C_start();
  I2C_init(0x49, 'w');                      // address: I2C-adresse
des auszulesenden TMP101; schreibender zugriff
  while (!(I2C_gotACK())); I2C_sendbyte(0x00);  // pointer register:
P1=0, P0=0 (d.h.: temperaturreg. ansprechen)

}

jedoch springt er hier gar nicht erst hin. Irgendwie hängt der sich
vorher schon auf. Debuggen ist nicht möglich, weil mit Compiler läuft
das Programm... Ohne jedoch nicht.

Kann das an dem POR liegen ? ich dachte der wäre beim 1232
standartmässig aktiviert. Weis jemand Rat ?

Gruß
Thomas

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach doch anstatt "P1OUT = 0x00" mal "P1OUT = 0xFF" dann siehst du
ob er wenigstens bis dahin kommt.

Autor: SuperGrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab ich vergessen zu erwähnen. Das hab ich schon mit
verschiedenen Möglichkeiten versucht. Bevor die mcu_init Routine
aufgerufen wird hab ich mit P2OUT = 0xff versucht die P2 Ausgänge zu
schalten, das klappt schon nicht. Das funktioniert auch nicht, wenn
"P2OUT = 0xff" vor der "Status" Routine gesetzt wird.
Also ich hab das gefühl, das die Main Routine nicht aufgerufen wird.
Diese ist aber unter den Options bei Debugger --> Setup --> Run to
(Häkchen gesetzt) "main" eingetragen.

(Die Status Routine gibt den Wert an ein Schieberegister (HC164) aus).

gruß
Thomas

Autor: SuperGrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch was:

wenn ich am Reset Pin einen Reset auslöse, rennt er auch los, als wenn
nix wäre...

gruß
Thomas

Autor: tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
setz mal das Abschalten des Watchdog wieder in die 1. Zeile der main.

evt. prototyp für main wieder einfügen?

Gruß
Tenner

Autor: SuperGrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das gerade mal versucht. Hab die Zeile

void main(void);

wieder reingenommen und direkt am Anfang der Main Routine mit

  WDTCTL = WDTPW + WDTHOLD;

den Watchdoch abgeschaltet.
Dies bringt jedoch keine Änderung. Der MSP lässt sich nur im Debugger
oder über den Reset Pin starten. Ich gehe doch richtig in der Annahme,
das eine Externe Einschalt-Reset-Logik nicht notwendig ist, oder ?
Müsste ich sonst den Reset Pin nach dem Einschalten kurzzeitig auf Low
ziehen ? Achso, der ist natürlich über einen 5k1 Wiederstand an Plus
angeschlossen.

gruß
Thomas

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hiho,
mal ne dumme Frage. Hast Du alle ISR's implementiert? Du enablest ja
einige (Flanke, Watchdog). Nicht, dass in der Vectortabelle FF's
stehen. Dann geht er natuerlich irgendwann in den Wald...

Autor: SuperGrobi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe davon aus, das ich das getan habe :)

Es sind 3 ISR`s vorhanden: Watchdog, TimerA und Port1
er geht ja nicht irgendwann in die Wicken, sondern fängt gar nicht erst
an, was zu machen... Und mit Debugger (IAR) läuft das ja...
kann dann hinterher den JTAG abziehen und der läuft weiter.
Ohne läuft es auch, ich muss halt einmalig nur den Reset machen...

ich schicke am besten mal den gesamten code als Anhang.

gruß
Thomas

die Routinen folgen gleich...

Autor: SuperGrobi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier die init Routine

Autor: SuperGrobi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
allgemeine Routinen

Autor: szimmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hmmm, hast Du einen Kondensator am Reset-Pin gegen Masse?
Der Controller sollte beim Einschalten wenigestens kurz mal ein Low
sehen.
Anbei mal die Beschaltung von Standard-Olimex-Boards.

Autor: SuperGrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich werde das mal probieren... ist aber lötarbeit :)

dies würde jedoch nicht erklären, warum das Programm_alt läuft und das
Programm_neu nicht.

gruß
Thomas

Autor: SuperGrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt 15nF von Masse zum Reset Pin gelötet.
bringt jedoch keine Besserung.
Ist leider alles beim alten geblieben.

gruß
Thomas

Autor: Supergrobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich muss diesen Beitrag jetzt doch noch mal nach oben holen, da
ich leider noch keine Lösung gefunden habe.

vielleicht kann mir jemand noch einen Tip geben, was ich noch probieren
kann ?

danke
Thomas

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal ordentliche header-files schreiben und kein .c's includieren ->
schlechter Stil... zu deinem Problem habe ich leider keine Antwort
parat... is scho komisch, check das morgen mal durch... schönen sa
abend...

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.