- 3D-Druck Einstieg und Tipps         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 55

Thema: Tasterwerte an Hyperterminal übergeben

  1. #31
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich glaube, dass sich da noch ein Fehler eingeschlichen hat. Die SerWrite()-Funktion benötigt einen Pointer auf Daten. Aber hier werden 'Netto'-Bytes, also ohne Pointer, (z.B. das '-') an die Funktion übergeben.
    Ersetzt mit UartPutc() und dann geht es bei mir perfekt.

    Übrig bleiben ganze 56 Byte bei Optimizereinstellung -Os (size)

    Code:
    #include <asuro.h>
    
    void PrintChar (int x)
    {
       int b = 0;
    
       if (x < 0)
       {
          UartPutc ('-');
          x = -x;
       }
       if (x >= 10)
       {
          while (x >= 10)
          {
             b++;
             x -= 10;
          }
          PrintChar (b);
       }
       UartPutc (x + '0');
    }
       
       
    int main (void)
    {   
       Init ();
    
       while (1)
       { 
          PrintInt (-9854);
          PrintChar (-26978);
       }   
       return 0;
    }
    Gruß Sternthaler.
    P.S.: Na izaseba, jetzt kommt der Sport
    Lieber Asuro programieren als arbeiten gehen.

  2. #32
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo,
    P.S.: Na izaseba, jetzt kommt der Sport
    So ein Käse,
    da denkt man, man hat was konstruktives vollbracht, und dann so ein Käse.
    Das liegt wahrscheinlich daran, daß ich keine Zielhardware z.Z. habe und alles mehr oder weniger zusammenklicken muß (Gute Ausrede ? )

    Na gut, jetzt Plan B, ich hoffe, denn nimmst Du nicht so schnell auseinander, noch kleiner und ein Funktionsaufruf weniger:
    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)
    {   
    Init();
    while(1)
          {  
          
    	PrintChar(-1000);
          }   
    	return 0;
    }
    Ergibt bei mir auch mit -Os
    .text 730 0
    .bss 18 8388704
    1160 - 730 = 430 Bytes ?
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #33
    Neuer Benutzer Öfters hier
    Registriert seit
    13.11.2007
    Ort
    Ostfildern / BaWü
    Alter
    34
    Beiträge
    21
    Moin,

    hab mal den Code von Sternthaler von der ersten Page kopiert.
    Alles kein Problem, also draufgeflasht:

    Wenn ich jetzt aber die Taster drücke wird nichts gesendet!
    Ja, ich bin totaler Anfänger und hab zu 100% etwas falsch gemacht
    Also helft mir bitte!


    Gruß, Simon

  4. #34
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Nachtrag:

    Damit wirklich nur das eingebunden wird, was auch benötigt wird, habe ich eben die Funktionen aus der Asurolib zusammengetragen und mit einem _ versehen,
    Code:
    #include <asuro.h>
    
    void Uart_Putc (char zeichen) 
    {
       UCSRB  = 0x08;                        // enable transmitter
       UCSRA |= 0x40;                        // clear transmitter flag
       while (!(UCSRA & 0x20))               // wait for empty transmit buffer
         ;
      UDR = zeichen;
       while (!(UCSRA & 0x40))               // Wait for transmit complete flag (TXC)
         ;
     }
    
    /*void Ser_Print(char *data) 
    {
       unsigned char i = 0;
     
       while (data [i] != 0x00)
         Uart_Putc (data [i++]);
     }
    
    
    void Print_Int(int wert) {
    char text [7];                        // "-12345"
       itoa (wert, text, 10);
    	Ser_Print(text);
    }*/
    
    void PrintChar(int x)
       {
       int b=0;
       if (x < 0) {
    	Uart_Putc('-'); 
    	x = -x;
       }
       if (x >= 10) {
    	while (x >= 10) {
    	b++;
    	x -=10;
    	}
    	PrintChar(b);
    
    	}
    	Uart_Putc(x + '0');
      
       }
    	
       
    int main(void)
    {   
    Init();
    while(1)
          {  
        //  Print_Int(-1000);
    	PrintChar(-1000);
          }   
    	return 0;
    }
    Stand 928-744 = 184 Bytes
    Software is like s e x: its better when its free.
    Linus Torvald

  5. #35
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo Simon,

    Normal müßte das Programm von Sternthaler funktionieren, komisch das.
    Hast Du am Hyperterminal auch alles richtig eingestellt, 2400 Baud 8N1, richtige Com Schnittstelle ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #36
    Neuer Benutzer Öfters hier
    Registriert seit
    13.11.2007
    Ort
    Ostfildern / BaWü
    Alter
    34
    Beiträge
    21
    Ja, das ist richtig eingestellt!

    Ich weiß woran es lag, teste das eben noch
    Und zwar hab ich im Notepad die make+clean aus dem FirstTry
    Ordner eingestellt. Den Switch test aber in einem anderen Ordner
    gespeicher (FirstTry mit anderem Namen kopiert).
    Dadurch wars immer der leere FirstTry Code. Vll
    kann mir hier wer noch sagen wie ich das richtig mache?

    Switch Test wie gesagt gleich!

    Gruß, Simon

  7. #37
    Neuer Benutzer Öfters hier
    Registriert seit
    13.11.2007
    Ort
    Ostfildern / BaWü
    Alter
    34
    Beiträge
    21
    Öhm, ich bin mir grad nicht sicher was da ausgegeben werden sollte..
    Idee: 00001111000022220000444400008888000016161616000032 323232

    Bei mir kommt folgendes:


    Code:
    0
    0
    0
    0
    1
    1
    1
    1
    0
    0
    0
    0
    2
    2
    2
    2
    0
    0
    0
    0
    4
    4
    4
    4
    0
    0
    0
    0
    7
    7
    7
    7
    0
    0
    0
    0
    15
    15
    15
    15
    0
    0
    0
    0
    30
    30
    30
    30
    0
    0
    ...
    Code gekürzt.
    Das ist falsch! ?
    Sind die Taster kaputt?

    Gruß, Simon

  8. #38
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    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
    Lieber Asuro programieren als arbeiten gehen.

  9. #39
    Neuer Benutzer Öfters hier
    Registriert seit
    13.11.2007
    Ort
    Ostfildern / BaWü
    Alter
    34
    Beiträge
    21
    Hey Sternthaler,

    danke für den Link! Habs runtergeladen und geflashed.
    Leider bekomme ich schon beim ersten Test keine Daten...
    Nach drücken des ersten Tasters wird die StatusLED rot, und
    das wars... Woran liegt das nun? An der Lib2.71?

    gruß,Simon

  10. #40
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo {DerSimon},
    was hast du runtergeladen?
    Die neue Lib, oder das Programm zum Werte-Ermitteln?
    Lieber Asuro programieren als arbeiten gehen.

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test