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'; }
>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.
Danke!! Buch ist bestellt :-) String mit 17 Char denke ich ist auch klar (max 2Byte also 16 + Abschlusszeichen '\0')
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.