Gast
#3281724
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'; }