- LiFePO4 Speicher Test         
Seite 5 von 5 ErsteErste ... 345
Ergebnis 41 bis 45 von 45

Thema: Programm Starten und Stoppen über Hyper Terminal

  1. #41
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    E-Bike
    Hallo

    Zeiger sind auch nicht mein Gebiet (was kann ich überhaupt?). Das Ampersand & bedeutet die Speicheradresse der Variablen. Ich hab's nun so gelöst (Vorsicht beim Betrachten!) und kann nun warnungsfrei Übersetzen:
    Code:
       char message[5], *zeiger_auf_message;
    
    		zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
    		SerWrite(zeiger_auf_message,1); // kompilieren
    Zurück zum Problem: Das Hyperterminal sendet nur, wenn man auch [Enter] drückt! Es werden also mindestens zwei Zeichen gesendet. Mein aufgebockter (=Räder berühren nicht den Boden) Clon reagiert nun mit diesem Testcode:

    Code:
    #include "asuro-probot.h"
    #include "asuro-probot.c"
    
    //#include "asuro.h"
    //#include "stdlib.h"
    
    void BackLED(char left, char right){}; // Dummi
    void SerRead(char *data, unsigned char length,unsigned int timeout)
    {
    	unsigned char i = 0;
    	unsigned int  time = 0;
    	UCSRB = 0x10; // enable receiver
    	/* non blocking */
    	if (timeout != 0) {
    		while (i < length && time++ < timeout) {
    			if (UCSRA & 0x80) {
    				data[i++] = UDR;
    				time = 0;
    			}
    		}
    		if (time > timeout) data[0] = 'T';
    	}
    	/* blocking */
    	else {
    		while (i < length) {
    			if (UCSRA & 0x80)
    				data[i++] = UDR;
    		}
    	}
    }
    
    void pause_ms(unsigned int dauer)
    {
    	while(dauer--) Sleep (36); // Sleep(72) bei asuro-CD-Library!
    }
    
    int main(void)
    {
       unsigned int data[2];
       char data0[5], data1[5];
       char message[5], *zeiger_auf_message;
    
       Init();
       SerWrite("Hallo :)\n\n\r", 11);
    
       while( 1 )
       {
    		pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
    		StatusLED(RED);
    		SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
    		zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
    		SerWrite(zeiger_auf_message,1); // kompilieren
    		SerWrite("\n\r", 2);
    		StatusLED(YELLOW);
    		
    		if(message[0] == 'g')
       	{
             FrontLED(ON);
    			Sleep(10); // Eine LED wird nicht schlagartig hell
             LineData(data);
    
             itoa (data[0], data0, 5);
             itoa (data[1], data1, 5);
             SerWrite (data0, 4);
             SerWrite (" links\n\r", 8);
             SerWrite (data1, 4);
             SerWrite (" rechts\n\r", 9);
    
          	pause_ms(2);
    
             MotorDir(FWD,FWD);
             MotorSpeed(110,100);
             BackLED(OFF,OFF);
    
             if ( data[0] < 50 )
             {
                MotorDir(RWD,RWD);
                MotorSpeed(100,150);
                BackLED(ON,OFF);
    
                pause_ms(120);
             } // if
    
             if ( data[1] < 50 )
             {
                MotorDir(RWD,RWD);
                MotorSpeed(100,150);
                BackLED(OFF,ON);
    
                pause_ms(120);
             } // if
    
             if (PollSwitch() >= 1)
             {
                MotorDir(RWD,RWD);
                MotorSpeed(255,255);
                BackLED(OFF,OFF);
                StatusLED(RED);
    
                pause_ms(300);
             } // if PollSwitch()
    
          } // if(message[0] == 'G')
    
          if(message[0] == 's')
          {
             MotorDir(FREE,FREE);
             FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
             StatusLED(OFF);
          } // if(message[0] == 's')
    
       } // while( 1 )
       return 0;
    } //main(void)
    Das ist im wesentliche immer noch das alte Programm, allerdings etwas geputzt. Neu ist pause_ms() für die Wartezeiten. Das ist natürlich noch die Variante für meinen Clon. Man muss im Moment die Befehle mehrmals senden bis er reagiert.

    Ungetestet für den orginalen asuro:
    Code:
    #include "asuro.h"
    #include "stdlib.h"
    
    void pause_ms(unsigned int dauer)
    {
    	while(dauer--) Sleep (72);
    }
    
    int main(void)
    {
       unsigned int data[2];
       char data0[5], data1[5];
       char message[5], *zeiger_auf_message;
    
       Init();
       SerWrite("Hallo :)\n\n\r", 11);
    
       while( 1 )
       {
    		pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
    		StatusLED(RED);
    		SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
    		zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
    		SerWrite(zeiger_auf_message,1); // kompilieren
    		SerWrite("\n\r", 2);
    		StatusLED(YELLOW);
    
    		if(message[0] == 'g')
       	{
             FrontLED(ON);
    			Sleep(10); // Eine LED wird nicht schlagartig hell
             LineData(data);
    
             itoa (data[0], data0, 5);
             itoa (data[1], data1, 5);
             SerWrite (data0, 4);
             SerWrite (" links\n\r", 8);
             SerWrite (data1, 4);
             SerWrite (" rechts\n\r", 9);
    
          	pause_ms(2);
    
             MotorDir(FWD,FWD);
             MotorSpeed(110,100);
             BackLED(OFF,OFF);
    
             if ( data[0] < 50 )
             {
                MotorDir(RWD,RWD);
                MotorSpeed(100,150);
                BackLED(ON,OFF);
    
                pause_ms(120);
             } // if
    
             if ( data[1] < 50 )
             {
                MotorDir(RWD,RWD);
                MotorSpeed(100,150);
                BackLED(OFF,ON);
    
                pause_ms(120);
             } // if
    
             if (PollSwitch() >= 1)
             {
                MotorDir(RWD,RWD);
                MotorSpeed(255,255);
                BackLED(OFF,OFF);
                StatusLED(RED);
    
                pause_ms(300);
             } // if PollSwitch()
    
          } // if(message[0] == 'G')
    
          if(message[0] == 's')
          {
             MotorDir(FREE,FREE);
             FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
             StatusLED(OFF);
          } // if(message[0] == 's')
    
       } // while( 1 )
       return 0;
    } //main(void)
    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #42
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    Hallo

    Aufgeben will ich nicht ich lass es nur mal eine weile gehen weil ich jetzt gerade mein Ultraschall löte und dann mach ich da weiter


    Lg

  3. #43
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    Ich glaube der Fehler liegt darin das beim Flashen nur 32 von 33 seiten übertragen werden

    aber keine Ahnung wie ich die 33 PAGE auch noch flashen soll

    Bei allen anderen Programmen werden immer alle Seiten geflasht

    Mfg

  4. #44
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Gelegentlich ergeben Rundungsfehler falsche Angaben für die Seiten. Wenn das Flashen fehlerfrei beendet wurde, wurde das gesamte Programm geflasht.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #45
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.11.2010
    Ort
    Österreich
    Alter
    30
    Beiträge
    173
    Ok danke

    Man lernt nie aus

Seite 5 von 5 ErsteErste ... 345

Berechtigungen

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

Labornetzteil AliExpress