MSP430 willkürliche Speichereinträge

Gast #3281724
Lesenswert?

Hallo zusammen,
bei meinen Übungsversuchen mit dem MSP430 Launchpad wollte ich Zahlen an 
einem 16x2 Display ausgeben. Dazu habe ich das im Netz zu findende 
Unterprogramm ItoA angelegt und kann somit bequem Integer Werte in das 
benötigte Anzeige-Format wandeln.
Die Ansteuerung des Displays (Initialisierung, Anzeige usw...) habe ich 
bereits öfters verwendet und die funktioniert.
Das komische ist, dass das Programm anfangs läuft aber nach einer Zeit 
nur noch Mist in meinem Char-String steht. Auch wenn ich das Programm 
dann neu lade ist es nicht mehr lauffähig und es macht den Anschein als 
werde der Speicherbereich des Char-Strings mit zufälligen Werten 
überschrieben und die Berechnung der eigentlichen Werte findet nicht 
mehr statt oder wird sofort wieder überschrieben. Habe bereits 2 
Controller "zerschossen" (jetzt habe ich keinen neuen mehr) und ich 
komme seit Tagen nicht weiter.
Vielleicht kann mir jemand helfen.

Angaben zu mir:
Anfänger in Sachen Mikrocontroller
MSP430 Launchpad bestückt mit MSP430G2553
Code Composer Studio 4.2.4

Programm

#include <msp430.h>
#include <msp430G2553.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <LCD_DOGM162_SPI.h>

//Variablen
int w = 65;
char *Zahl;

//Funktionen
void ItoA(int, char*, int);



void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;

  P1OUT = 0x00;          // Ausgänge reset
  P2OUT = 0x00;          // Ausgänge reset
  P1DIR = 0x00;          // Ausgänge reset
  P2DIR = 0x00;          // Ausgänge reset

  LCD_DIR |= (CSB + RS);    // LCD-Port als Ausgang


// Kalibrierung der internen Clock für SPI-Datenübertragung
  BCSCTL1 = CALBC1_1MHZ;  //
  DCOCTL = CALDCO_1MHZ;  // Stabilisierte DCO mit f=1MHz
  __delay_cycles(3000);  // f~1MHz --> T~1us --> delay=3000*1us=3ms; 
stabilisieren DCO

// Initialisierung LCD
  SPI_Init();
  LCD_Init();
  LCD_Clear();
  LCD_Home();

  for (;;)
  {
    LCD_MoveCursor (2,5);
    ItoA(w, Zahl, 10);
    LCD_PrintStr(zahl);
//  }

}//main


void ItoA( int z, char* Buffer, int Base )
//Umwandlung einer Int-Variable in ein ASCII zeichen mit verschiedenen 
Zahlensystemen
// z = der zu wandelnde Int-Wert
// Buffer = Ziel-String
// Base = Basis der Umwandlung d.h Binär=2; Dezimal=10; Hex=16
{
  int i;
  int j;
  char tmp;
  unsigned u = 0;    // In u bearbeiten wir den Absolutbetrag von z.

    // ist die Zahl negativ?
    // gleich mal ein - hinterlassen und die Zahl positiv machen
    if( z < 0 ) {
      Buffer[0] = '-';
      Buffer++;
      // -INT_MIN ist idR. größer als INT_MAX und nicht mehr
      // als int darstellbar! Man muss daher bei der Bildung
      // des Absolutbetrages aufpassen.
      u = ( (unsigned)-(z+1) ) + 1;
    }
    else {
      u = (unsigned)z;
    }
    // die einzelnen Stellen der Zahl berechnen
    do {
      Buffer[i++] = u % Base + '0' ;
      if ((Base == 16) && (Buffer[i-1] > 0x39))  // nur bei 
Hexadezimalsystem (Basis 16)
      {                      // wenn die Zahl größer "9" --> Sprung im 
ASCII Satz z.B. "10"=A
         Buffer[i-1] += 7;
      }
      u /= Base;
    } while( u > 0 );

    // den String in sich spiegeln
    for( j = 0; j < i / 2; ++j ) {
      tmp = Buffer[j];
      Buffer[j] = Buffer[i-j-1];
      Buffer[i-j-1] = tmp;
    }
    Buffer[i] = '\0';
}
#3282784
Lesenswert?

Hi,

VROINI schrieb:
> Hallo zusammen,
...
> mehr statt oder wird sofort wieder überschrieben. Habe bereits 2
> Controller "zerschossen" (jetzt habe ich keinen neuen mehr) und ich
...
>     Buffer[i] = '\0';
> }

was willst Du damit sagen "... Habe bereits 2 Controller zerschossen 
..."?
Was ist kaputt gegangen? Meiner Meinung nach kannst Du mit dem Programm 
weder den Mikroprozessor noch das Display töten. Hast Du eventuell noch 
ein Hardwareproblem?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren