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


von Johannes (Gast)


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)


Lesenswert?

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

Auf Gleitkommaberechnungen verzichten.

von PittyJ (Gast)


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)


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)


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)


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)


Lesenswert?

Stichwort "Festkommaarithmetik".

von Mario M. (thelonging)


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)


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
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.