Problem mit Werteübergabe zu miener Funktion

Gast #3780427
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
}
#3780448
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.
#3780483
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.
#3780538
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.