Forum: Mikrocontroller und Digitale Elektronik Problem mit Werteübergabe zu miener Funktion


von Yasar (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite mit MPLAB X und benutze einen dsPic33.
Im folgenden Code ist meine Funktion, um meinem Display (dip 203-4) 
etwas anzeigen zu lassen.

Beim Aufruf der Funktion muss ich für *c ein String in "" geben und 
dessen länge.
z.B. LCD_write("Hallo Welt", 10);

Ich wollte jetzt statt dem String den Wert einer float Variable mit 2 
Nachkommastellen darstellen lassen. Jedoch ist es mit nicht gelungen 
dies umzusetzen.

Kann mir jemand behilflich sein?

1
/**********************************************************************
2
 * Funktion: void LCD_write(uint8_t *c, uint8_t length)
3
 * Description:
4
 * Der eingegebene String '*c' und dessen Anzahl an Zeichen inklusive Leerzeichen müssen beim Aufruf der Funktion übergeben werden.
5
 * Die Funktion bereitet dann die Zeichen zur Übertragung vor und sendet es zum Display.
6
**********************************************************************/
7
void LCD_write(uint8_t *c, uint8_t length){
8
    uint16_t dummyRead = 0;
9
    uint8_t i, hByte, lByte, tByte;
10
11
    PORTBbits.RB2 = 0;  // Aktiviere Chip-Select
12
    __delay32(100);
13
14
    // Initialisiere Übertragung
15
    SPI1BUF = 0x00FA;         
16
    while(!transferDone);    
17
    transferDone = 0;         
18
    dummyRead = SPI1BUF;
19
    __delay32(1000);        
20
21
    for(i = 0; i < length; i++)         // Die Schiebeoperationen der for-Schleife dienen zum Spiegeln der zu übertragenen Zeichen
22
    {                                   // D7..D0 -> D0..D7
23
        tByte = *(c + i);
24
        lByte = ((tByte & 0x01) << 7) | 
25
                ((tByte & 0x02) << 5) |
26
                ((tByte & 0x04) << 3) |
27
                ((tByte & 0x08) << 1);
28
29
        hByte = ((tByte & 0x10) << 3) |
30
                ((tByte & 0x20) << 1) |
31
                ((tByte & 0x40) >> 1) |
32
                ((tByte & 0x80) >> 3);
33
34
        SPI1BUF = (lByte << 8) | hByte;
35
        while(!transferDone);
36
        transferDone = 0;
37
        dummyRead = SPI1BUF;
38
    }
39
40
    PORTBbits.RB2 = 1;  // Deaktiviere Chip-Select
41
}

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

benutzt man für sowas nicht "dtoa"?

von Karl H. (kbuchegg)


Lesenswert?

Yasar schrieb:

> Beim Aufruf der Funktion muss ich für *c ein String in "" geben und
> dessen länge.

Die Längenangabe ist schon mal Unsinn. In C ist jeder ordentliche String 
mit einem Terminierungszeichen abgeschlossen, anhand dessen sich die 
FUnktion die Länge des Strings selbst ermitteln kann.
Bzw. in einer ordentlichen Stringausgabe braucht man die Länge überhaupt 
nicht. Man gibt einfach in einer SChleife einzelne Zeichen aus, bis man 
dieses Terminierungszeichen 'sieht'.
1
void LCD_write( const char* str )
2
{
3
  while( *str != '\0' ) {
4
    LCD_character( *str );
5
    str++;
6
  }
7
}

du brauchst dann natürlich eine Funktion LCD_character, die einen 
einzelnen Character ausgeben kann. Aber das hat noch nie geschadet, wenn 
man in seinem Toolkit unterschiedliche FUnktionen für alle möglichen 
Fälle vorrätig hat. Schliesslich will man ja nicht zur Ausgabe eines 
einzelnen Zeichens, dieses erst mal in einen String verpacken müssen.

> Ich wollte jetzt statt dem String den Wert einer float Variable mit 2
> Nachkommastellen darstellen lassen. Jedoch ist es mit nicht gelungen
> dies umzusetzen.

Ein Float ist nun mal kein String.
Aber man kann sich einen String erzeugen lassen.

Entweder indem man sich selbst eine Funktion dafür schreibt oder indem 
man eine der fertigen Library-Funktionen dafür benutzt.

Sinngemäss: FAQ
gleich der erste Punkt in der FAQ
und natürlich: jedes noch so grindige C-Lehrbuch für eine Übersicht über 
die Standardfunktionen bzw. wie String-Verarbeitung in C eigentlich 
funktioniert.

: Bearbeitet durch User
von Georg (Gast)


Lesenswert?

Yasar schrieb:
> Ich wollte jetzt statt dem String den Wert einer float Variable mit 2
> Nachkommastellen darstellen lassen.

Den Wert musst du halt zuvor in einen String umwandeln - wo ist das 
Problem?

Georg

von Yasar X. (yasar)


Lesenswert?

Das meine float variable in ein string umgewandelt werden muss ist klar, 
jedoch ist wie im FAQ beschriben im meinem header <stdlib.h> keine 
Funktion ftoa() vorhanden.

Selber konnte ich es bis jetzt nicht programmieren und nach einer langen 
suche im Internet wurde ich auch nicht schlau.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Yasar Xxxx schrieb:
> Das meine float variable in ein string umgewandelt werden muss ist klar,
> jedoch ist wie im FAQ beschriben im meinem header <stdlib.h> keine
> Funktion ftoa() vorhanden.

Google Recherche mit
"MPLAB X ftao"

liefert zb diesen Link
http://www.microchip.com/forums/m183763.aspx

>
> Selber konnte ich es bis jetzt nicht programmieren und nach einer langen
> suche im Internet wurde ich auch nicht schlau.

Ich frag mich ja immer, wie die Leute eigentlich suchen, wenn sie 'nach 
langer Suche nichts finden' und selber hat man in 5 Sekunden mindestens 
10 erfolgversprechende Links an der Hand.

Allerdings:
> Ich wollte jetzt statt dem String den Wert einer float Variable
> mit 2 Nachkommastellen darstellen lassen.

wenn du sowieso immer 2 Nachkommastellen haben willst, was hindert dich 
daran, erst mal den Vorkomma-Anteil als Integer auszugeben, dann einen 
Dezimalpunkt aufs DIsplay zu schreiben, gefolgt vom Nachkommanteil, den 
du mit 100 mulitplizert ebenfalls so aufbereiten kannst, dass du ihn mit 
einer Integer-Ausgabe ausgeben kannst.

Wenn du die volle Bandbreite an Möglichkeiten, die mit Gleitkomma daher 
kommen können, nicht benötigst, dann ist das ein gangbarer Weg.

: Bearbeitet durch User
von Yasar X. (yasar)


Lesenswert?

Danke für diesen Tipp.

Damit hat es funkitoniert.

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.