Forum: Mikrocontroller und Digitale Elektronik Daten über uart an pc senden - Programm zu groß


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johannes (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte mir gerne unter anderem zwei Matrizen und 4 Arrays über UART 
an meinen PC Senden. Allerdings wird dadurch das Programm für den 
Mikrocontroller (ATTINY2313) zu groß.
1
...
2
        else if(state == STATE_SEND){
3
            if(0 == sendData)
4
            {
5
                sendData = 1;
6
                for(n=0; n<4; n++){
7
                    for(m=0; m<4; m++){
8
                        usartTransmit(weightInputHidden[n][m]*1000);
9
                    }
10
                    usartTransmit(0x0A); /* New Line */
11
                }
12
                usartTransmit(0x0A); /* New Line */
13
                
14
                for(n=0; n<4; n++){
15
                    usartTransmit(netHidden);
16
                }
17
                usartTransmit(0x0A); /* New Line */
18
                for(n=0; n<4; n++){
19
                    usartTransmit(outHidden);
20
                }
21
                usartTransmit(0x0A); /* New Line */
22
                
23
                
24
                for(n=0; n<4; n++){
25
                    for(m=0; m<4; m++){
26
                        usartTransmit(weightHiddenOut[n][m]*1000);
27
                    }
28
                    usartTransmit(0x0A); /* New Line */
29
                }
30
                usartTransmit(0x0A); /* New Line */
31
                
32
                for(n=0; n<4; n++){
33
                    usartTransmit(netOut);
34
                }
35
                usartTransmit(0x0A); /* New Line */
36
                for(n=0; n<4; n++){
37
                    usartTransmit(outOut);
38
                }
39
                usartTransmit(0x0A); /* New Line */
40
            }
41
        }
42
...
43
void usartTransmit( unsigned char data )
44
{
45
    while ( !( UCSRA & (1<<UDRE)) );/* Wait for empty transmit buffer */
46
    UDR = data; /* Put data into buffer, sends the data */
47
}

Die variablen input und output sind uint8_t. Die anderen Variablen, 
netHidden, outHidden, netOut, outOut, weightInputHidden und 
weightHiddenOut sind float.
Mit dem senden, ist das Programm 2546bytes groß. Kommentiere ich es aus, 
ist das Programm nur noch 1198 bytes (58,5% Full) groß.
Gibt es eine Möglichkeit das ganze noch irgendwie kleiner zu machen und 
trotzdem alles zu senden?

Johannes

von g457 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Gibt es eine Möglichkeit das ganze noch irgendwie kleiner zu machen und
> trotzdem alles zu senden?

Auf Gleitkommaberechnungen verzichten.

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
das
*1000
kann auch der PC übernehmen.

Was ist überhaupt usartTransmit?
Da kommen Zeichen rein wie 0x0A andererseits auch Float Werte.
Ist das C++ und überladen?

Gibt es nicht eine Transmit Funktion die klassisch einen Pointer und 
eine Länge bekommt? Dann könnte man die Schleifen sparen.

von Johannes (Gast)


Bewertung
0 lesenswert
nicht lesenswert
g457 schrieb:
> Auf Gleitkommaberechnungen verzichten.

Die brauche ich, da es werte zwischen 0 und 1 sind.

PittyJ schrieb:
> das
> *1000
> kann auch der PC übernehmen.

Am Pc benutze ich hterm um mir die Daten anzusehen. Dort habe ich noch 
keine Funktion gefunden, wo man so etwas einstellen könnte. Ohne das 
*1000 würden dann nur nullen angezeigt werden

PittyJ schrieb:
> Was ist überhaupt usartTransmit?

Das ist die Funktion zum Senden

Johannes schrieb:
> void usartTransmit( unsigned char data )
> {
>     while ( !( UCSRA & (1<<UDRE)) );/* Wait for empty transmit buffer */
>     UDR = data; /* Put data into buffer, sends the data */
> }

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Johannes schrieb:
> Die brauche ich, da es werte zwischen 0 und 1 sind.

Nur wenn du vorher so rechnest, dass Werte zwischen 0.0 und 1.0 
rauskommen.
Float brauchst du nur bei hoher Dynamik der Daten.

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du kannst mit einer Funktion, die ein char versendet, keine floats 
versenden.

Vielleicht schaust du erst einmal in dein C-Buch, was Floats sind, und 
wie die aufgebaut sind.
Die Binärdarstellung gibt es z.B. unter
https://de.wikipedia.org/wiki/IEEE_754

von batman (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stichwort "Festkommaarithmetik".

von Mario M. (thelonging)


Bewertung
0 lesenswert
nicht lesenswert
batman schrieb:
> Stichwort "Festkommaarithmetik".
Es gibt sogar einen Artikel dazu - hier bei Mikrocontroller.net:
https://www.mikrocontroller.net/articles/Festkommaarithmetik

von Marco H. (damarco)


Bewertung
0 lesenswert
nicht lesenswert
PittyJ schrieb:
> Du kannst mit einer Funktion, die ein char versendet, keine floats
> versenden.
>
> Vielleicht schaust du erst einmal in dein C-Buch, was Floats sind, und
> wie die aufgebaut sind.
> Die Binärdarstellung gibt es z.B. unter
> https://de.wikipedia.org/wiki/IEEE_754

Ganz deiner Meinung, das muss man als String zusammenbasteln. %d.%d 
z.Bsp um nicht sprint zu bemühen sendet man die Dinge eben nacheinander 
-> zahl"."zahl   mit unter benötigt man noch eine Maske um 
Nachkommastellen auszublenden.


printf/sprint kann mit float umgehen allerdings auf einen AVR mit 
128byte nicht zu empfehlen Dinge aus der Standard Lib zu benutzen.

1
usartTransmit(weightInputHidden[n][m]*1000);
 solche Konstrukte funktionieren nicht. Da diese Funktion sicher das 
ganze als byte erwartet.

Da kommt nur Käse raus, inkl. Warnung und die sollte einen stutzig 
machen. Immer Warnung nachgehen -> nie ignorieren.


Dein Problem ist außerdem das du die Werte aus dem Flash nicht so 
einfach in den 128byte großen sram laden kannst.  Du muss dir Gedanken 
über den Speicher machen. Außerdem könntest du probieren die Optimierung 
auf "Size" zu stellen.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.