Hallo izaseba,
ich glaube, das nun 2 Dinge dagegen sprechen:
[EDIT] Ich sehe gerade die Version 3 oder 4, ich meine hier die Version, bei der direkt in's UDR geschrieben wird.
[EDIT 2]Es wird in der neuen Asuro-Lib unter anderem eine kleine Änderung zum Stromsparen geben. Der Sender wird in der UartPutc()-Funktion zum Schluß wieder disabled. Dann würden nach dem Aufruf von SerRead() nie wieder Zeichen gesendet.
Da ist sie gerade von m.a.r.v.i.n eingestellt worden: Asuro Lib V2.71 veröffentlicht
1: Der Code für die Funktion ist mit 62 Byte gegenüber den oben angegebenen 56 Byte viel, viel größer geworden.
Die eingesparte Funktion PrintChar() wird ja spätestens dann auch mit eingebunden, wenn andere Strings zu senden sind.
2: Probiere mal das folgende Programm und achte besonders auf die zu zu übertragende "-2".
Das Problem ist, dass du in deiner Funktion nun nicht mehr den Sender einschaltest, so dass hier das '-'-Zeichen verloren geht. Warum danach überhaupt wieder gesendet wird kann ich allerdings nicht sagen.
Code:
#include <asuro.h>
void PrintChar (int x)
{
int b = 0;
if (x < 0)
{
while (! (UCSRA & (1 << UDRE)))
;
UDR = '-';
x = -x;
}
if (x >= 10)
{
while (x >= 10)
{
b++;
x -= 10;
}
PrintChar (b);
}
while (! (UCSRA & (1 << UDRE)))
;
UDR = x + '0';
}
int main (void)
{
char indaten [10];
Init ();
while (1)
{
PrintInt (-9876); UartPutc ('\n');
PrintChar (2); UartPutc ('\n');
PrintChar (1); UartPutc ('\n');
PrintChar (0); UartPutc ('\n');
PrintChar (-1); UartPutc ('\n');
SerRead ((unsigned char *)indaten, 1, 1); // Nicht auf Input warten
PrintChar (-2); UartPutc ('\n');
PrintChar (-3); UartPutc ('\n');
}
return 0;
}
Mal zu meinen Byte-Angaben. Ich sehe mir die *.lss-Datei an, und picke Start- und Ende-Position der Funktion raus.
Code:
void PrintChar (int x)
{
5e: cf 93 push r28
60: df 93 push r29
62: ec 01 movw r28, r24
int b = 0;
if (x < 0)
64: 97 ff sbrs r25, 7
66: 07 c0 rjmp .+14 ; 0x76 <PrintChar+0x18>
.
.
while (! (UCSRA & (1 << UDRE)))
8c: 5d 9b sbis 0x0b, 5 ; 11
8e: fe cf rjmp .-4 ; 0x8c <PrintChar+0x2e>
;
UDR = x + '0';
90: 9e 01 movw r18, r28
92: 20 5d subi r18, 0xD0 ; 208
94: 2c b9 out 0x0c, r18 ; 12
96: df 91 pop r29
98: cf 91 pop r28
9a: 08 95 ret
0000009c <main>:
Also 0x9c - 0x5e = 0x3e = 62 Byte
@{DerSimon}
Ich sehe gerade, dass du ein voll funktionsfähiges Programm hast.
Es sollten zwar die Zahlen 1, 2, 4, 8, 16 und 32 kommen, aber genau das ist ja die Aufgabe vom Programm rauszubekommen, ob das erfolgt. Bei dir ja nun nicht. Also musst du nur in der Funktion PollSwitch() den Multiplikator MY_SWITCH_VALUE (wenn du die Lib nutzt) oder den Wert 61 (kann auch 62 oder 63) in der Formel am Ende der Funktion anpassen.
Mit dem Programm aus ASURO emittelt Werte für Lib V2.70 myasuro.h selber kannst du dir diesen Wert ermitteln lassen, oder du versuchst es einfach mit Werten zo zwischen 55 und 70.
Kein Taster ist kaputt.
Gruß Sternthaler
Lesezeichen