Forum: Mikrocontroller und Digitale Elektronik MSP430 willkürliche Speichereinträge


von VROINI (Gast)


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';
}

von holger (Gast)


Lesenswert?

>char *Zahl;

Das ist nur ein Pointer und der stellt keinen Speicher
für deine ASCII Umwandlung zur Verfügung.

Lies verdammt noch mal ein C Buch.
Try and Error bringt dich nicht weiter.

von malloc (Gast)


Lesenswert?

Mach aus
char *zahl;
einfach
char zahl_string[17];

von VROINI (Gast)


Lesenswert?

Danke!!
Buch ist bestellt :-)
String mit 17 Char denke ich ist auch klar (max 2Byte also 16 + 
Abschlusszeichen '\0')

von Wolfgang H. (frickelkram)


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?

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.