-         

Ergebnis 1 bis 10 von 10

Thema: Arrays definieren

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    37
    Beiträge
    38

    Arrays definieren

    Anzeige

    Hallo hier im Forum!

    Bin neu hier und versuche meine ersten Schritte in Sachen programmieren!

    Seit ca. 2 Stunde versuche ich unten stehndes Programm in Gang zu bringen! Ergebnis negativ Könnt ihr mir sagen wo der Fehler liegt? Ich denke mal, es liegt an dem Array... aber was?

    PS: Es soll mit dem Programm eine Logitech Harmony 525 angelernt werden!

    Danke!

    Code:
    #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
      initRobotBase();
    	
    	setLEDs(0b111111);
    	
    	writeString_P("\n\n  Welcher RC5 Code soll gesendet werden?:\n");
    	
    	while(true)
    	{
    				
    		char antwort[1]; 
            
    		receiveBytes(2); 
    	    waitUntilReceptionComplete();
    		copyReceivedBytesToBuffer(&antwort[0]);	
    		
    		if(antwort[0] == '32') // Mit Eingabe 32 wird der RC5 Code 32 gesendet
    			{
    				writeString_P("RC5 Code: 32 - Befehl 'VORWÄRTS' wird gesendet\n");
    				IRCOMM_sendRC5(17,32);  // sendet 
    			}
    			
    		if(antwort[0] == '33') // Mit Eingabe 33 wird der RC5 Code 33 gesendet
    			{
    				writeString_P("RC5 Code: 33 - Befehl 'RÜCKWÄRTS' wird gesendet\n");
    				IRCOMM_sendRC5(17,33);
    			}
    		
    		if(antwort[0] == '11') // Mit Eingabe 11 wird der RC5 Code 11 gesendet
    			{
    				writeString_P("RC5 Code: 11 - Befehl 'STOP' wird gesendet\n");
    				IRCOMM_sendRC5(17,11);
    			}	
    		
    		task_ACS();
    		
    		mSleep(50);
    	}
      
      return 0;
    
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Achte mal auf die Warnung, die da kommen! '32' ist keine zulässige Schreibweise in C. Die Hochkommata sind für Einzelbuchstaben als ASCII-Code vorgesehen. '3' liefert also den ASCII-Code für die Zahl 3. Aber nur, wenn da ein einziges Zeichen steht. Aus deinem '32' macht der Compiler irgendwas (*), nur keine 32 als Zahlenwert.

    Wahrscheinlich wäre
    if(antwort[0] == 32)
    richtig.

    (*) Hab's gerade mal getestet: Er schein nur das letzte Zeichen zu übernehmen, aus '32' wird die Zahl 2.

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    char antwort[1];

    receiveBytes(2);
    Anscheinend willst du 2 Bytes empfangen. Das Array hat aber nur die Länge 1.
    -> char antwort[2];

    if(antwort[0] == '32') // Mit Eingabe 10 wird der RC5 Code 32 gesende
    Irgendwie passt der Kommentar nicht zum Code. Was soll denn hier im Array stehen? Vielleicht die Zeichenfolge "10"?
    -> if (antwort[0] == '1' && antwort[1] == '0')
    MfG
    Stefan

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Hallo

    So ganz verstehe ich den Sinn des Programms auch nicht. Meine Vermutung: Du willst mit dem RP6 deiner Fernbedienung RC5-Codes beibringen. Der RP6 wird dabei über das Terminal im Loader gesteuert:
    Code:
    #include "RP6RobotBaseLib.h"
    
    int main(void)
    {
    	initRobotBase();
    	powerON();
       setLEDs(0b111111);
       writeString_P("\n\n  Welcher RC5 Code soll gesendet werden?:\n");
    
       while(true)
       {
    
          if(readChar() == 'w') // Mit Eingabe w wird der RC5 Code 32 gesendet
          {
             setLEDs(1);
    			writeString_P("RC5 Code: 32 - Befehl 'VORWÄRTS' wird gesendet\n");
             IRCOMM_sendRC5(17,32);  // sendet
             mSleep(200);
    			setLEDs(0b111111);
          }
    
          if(readChar() == 'x') // Mit Eingabe x wird der RC5 Code 33 gesendet
          {
             setLEDs(2);
             writeString_P("RC5 Code: 33 - Befehl 'RÜCKWÄRTS' wird gesendet\n");
             IRCOMM_sendRC5(17,33);
             mSleep(200);
             setLEDs(0b111111);
          }
    
          if(readChar() == 's') // Mit Eingabe s wird der RC5 Code 11 gesendet
          {
             setLEDs(4);
             writeString_P("RC5 Code: 11 - Befehl 'STOP' wird gesendet\n");
             IRCOMM_sendRC5(17,11);
             mSleep(200);
             setLEDs(0b111111);
          }
          task_ACS();
          mSleep(50);
       }
      return 0;
    }
    Nach w, s oder x (und ENTER!) schickt der RP6 das entsprechende Signal. (Ab dem zweiten Mal muss man die Zeichen mit dem Terminal mehrfach senden (?) und ich weiß nicht, ob deine Harmony das Ergebniss frißt.)

    Gruß

    mic

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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    37
    Beiträge
    38
    Sorry - der Kommentar war falsch - ist jetzt richtig gestellt.

    Hab das Programm jetzt folgend abgeändert!

    Wusste nicht, dass " ' " nur für einstellige Werte verwendet werden darf! Zwar kommt jetzt keine Fehlermeldung, trotzdem geht's nicht - Leider...


    Code:
    #include "RP6RobotBaseLib.h" 
    
    int main(void) 
    { 
      initRobotBase(); 
        
       setLEDs(0b111111); 
        
       writeString_P("\n\n  Welcher RC5 Code soll gesendet werden?:\n"); 
        
       while(true) 
       { 
                 
          char antwort[2]; 
            
          receiveBytes(2); 
           waitUntilReceptionComplete(); 
          copyReceivedBytesToBuffer(&antwort[0]);    
           
          if(antwort[0] == 32) // Mit Eingabe 32 wird der RC5 Code 32 gesendet 
             { 
                writeString_P("RC5 Code: 32 - Befehl 'VORWÄRTS' wird gesendet\n"); 
                IRCOMM_sendRC5(17,32);  // sendet 
             } 
              
          if(antwort[0] == 33) // Mit Eingabe 33 wird der RC5 Code 33 gesendet 
             { 
                writeString_P("RC5 Code: 33 - Befehl 'RÜCKWÄRTS' wird gesendet\n"); 
                IRCOMM_sendRC5(17,33); 
             } 
           
          if(antwort[0] == 11) // Mit Eingabe 11 wird der RC5 Code 11 gesendet 
             { 
                writeString_P("RC5 Code: 11 - Befehl 'STOP' wird gesendet\n"); 
                IRCOMM_sendRC5(17,11); 
             }    
           
          task_ACS(); 
           
          mSleep(50); 
       } 
      
      return 0; 
    
    }

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    37
    Beiträge
    38
    Zitat Zitat von radbruch
    Nach w, s oder x (und ENTER!) schickt der RP6 das entsprechende Signal. (Ab dem zweiten Mal muss man die Zeichen mit dem Terminal mehrfach senden (?) und ich weiß nicht, ob deine Harmony das Ergebniss frißt.)
    Funktionieren tut das ganze eigentlich schon da ich gestern schon erfolgreich war. Die Harmony spielt da voll und ganz mit...

    Allerding hab ich gestern für die Programmierung der FF nur 8 x RC5 Codes benötigt. Das Array war somit nur ein Bit lang.

    Heute wollte ich jedoch mehr als 9 Codes senden - und da fing das Problem an, da das Arráy jetzt 2 stellig ist und ich auch 2 stellige Daten vom "Terminal" empfangen will!

    Ich hab in dem Beispiel Programm allerdings nur 3 Bedingungen eingefügt, damit das ganze übersichtlich bleibt!

    Oder ist es evtl. gar nicht möglich, dass man in einer "if" bedingung nicht mehr als einstellige Werte abfragen kann?

    Danke...

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    if(antwort[0] == 32)
    ->
    if (antwort[0] == '3' && antwort[1] == '2')
    MfG
    Stefan

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    37
    Beiträge
    38
    Zitat Zitat von sternst
    if(antwort[0] == 32)
    ->
    if (antwort[0] == '3' && antwort[1] == '2')
    Danke - so geht das also

    Letzte Frage noch zu dem Programm: Wie lange wird der RC5 Code gesendet bzw. gehe ich mal davon aus, dass er so lange sedet, bis ein neuer Code gsendet wird...

    Gibt es eine STOPP Funktion für das senden von IR Signalen?

    Danke...

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.782
    Blog-Einträge
    8
    Aus der Beschreibung von IRCOMM_sendRC5():
    * This function initiates a RC5 transmission with the IRCOMM.
    * You need to call the "task_ACS()" function (s. below) frequently
    * out of the main loop - otherwise it will not work! (this is required
    * because it needs to be synchronized with the ACS...)
    * The transmission itself is interrupt based and takes about 20ms.
    Es wird einmalig der Code gesendet.

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

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    26.10.2008
    Ort
    Wien
    Alter
    37
    Beiträge
    38
    Danke für die tolle Hilfe!!

Berechtigungen

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