- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Asuro Programmierung

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129

    Asuro Programmierung

    Anzeige

    Powerstation Test
    Hallo,
    Ich wollte ein paar Messungen mit den Linienensensoren meines ASURO'S machen und sie dann über die IR Schnittstelle an den PC senden.
    Nun klappt das mit dem Convertieren nicht so ganz.

    hier mal mein code:

    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    int main (void) 
    {
    
        unsigned int lData[2];
        unsigned char Wert;  
        Init();
        
            for(;;)
            {
            
                FrontLED(ON);
                LineData(lData);
                itoa(lData[1],Wert,10);
                SerWrite(Wert,4);
                
            }
      return 0;
    }
    Ich habe die stdlib.h auch in dem gleichen Ordner wie die anderen Dateien auch.
    Danke schonmal im vorraus für eure Hilfe!

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170

    Re: Asuro Programmierung

    Zitat Zitat von Berghuhn
    Hallo,
    Ich wollte ein paar Messungen mit den Linienensensoren meines ASURO'S machen und sie dann über die IR Schnittstelle an den PC senden.
    Nun klappt das mit dem Convertieren nicht so ganz.

    hier mal mein code:

    #include "asuro.h"
    #include <stdlib.h>

    int main (void)
    {

    unsigned int lData[2];
    unsigned char Wert;
    Init();

    for(;
    {

    FrontLED(ON);
    LineData(lData);
    itoa(lData[1],Wert,10);
    SerWrite(Wert,4);

    }
    return 0;
    }
    Ich habe die stdlib.h auch in dem gleichen Ordner wie die anderen Dateien auch.
    Danke schonmal im vorraus für eure Hilfe!
    unsigned char Wert;

    ist einer Deklaration von nur einen Zeichen. Damit es mit SerWrite ausgesendet werden kann muss es ein Zeichenketten sein, sehe:

    http://www.rn-wissen.de/index.php/C-...ichenketten.29

    Gab es kein Kompilation Fehler bis jetzt? Nächste versuch bitte diese dann auch posten.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129
    Nein, es gab keinen Kompilations Fehler.
    Danke er sendet jetzt zumindest Zahlen =).
    Jetzt aber nochmals ein Problem bei mir Funktioniert der Befehlt Msleep(); nicht. Hast du vllt eine Idee warum?

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Welches Asuro Code-Bibliothek (asuro.c) verwendest du? In dem Original Bibliothek gibt es keine Msleep Funktion. Das gibt es nur in dem Erweiterte Asuro Bibliotheken.

    Außerdem muss noch ein wert zwischen den Krumme Klammern.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Hallo,

    Was hast du mit der stdlib.h gemacht? Normalerweise lässt du die schön in Ruhe im WinAVR-Ordner, das sind Headerfiles an denen du NICHTS ändern musst/sollst.
    Davon abgesehen: Der Code oben compiliert bei mir problemlos (Aber nicht ohne Warnings -> Beheben). Du solltest nicht nur schreien wenn du Schmerzen hast, wenn du uns verrätst was wehtut würde das weiterhelfen.

    Daher: Gehe zurück auf Los, ziehe keine 4000$ ein, verfasse eine vernünftige Fehlerbeschreibung und gib alle Fehlermeldungen mit an.

    mfG
    Markus

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129
    Ok das mit dem Msleep(zeit); hat sich geklärt, da ich noch die Standart lib hatte.

    Nun mein neues Problem:

    Code:
    #include "asuro.h"
    #include <stdlib.h>
    
    
    void Msleep(int dauer)
    {
       int z;
       for(z=0;z<dauer;z++) Sleep(72);
    }
    
    unsigned int zaehler;
    unsigned int zaehler2;
    unsigned char ir1;
    	
    int main (void)
    {
    
    	unsigned int lData[2];
    	unsigned int oData[2];
    	unsigned int oldO1;
    	unsigned int oldO2;
    	
    	unsigned char sw, speed;
    	unsigned char ir;
    	
    	unsigned char ir2;
    	
    	Init();
    	OdometrieData(oData);
    	oldO1 = oData[0] + 500;
    	oldO2 = oData[1] + 500;
    	 DDRD |= (1 << DDD1);   // Port D1 als Ausgang
    	 PORTD &= ~(1 << PD1);   // PD1 auf LOW
    	 OCR2  = 0xFC;
    	 speed=130; 
    	for(;;)
        {
    		ir=PIND & (1 << PD0); 
    		FrontLED(ON);
    		LineData(lData);
    		OdometrieData(oData);
    		if (ir || ir1)
    		{
    			if(lData[1] <= 50 && lData[1] >= 10)
    			{
    				BackLED(ON,ON);
    				StatusLED(GREEN);
    				MotorDir(RWD, RWD);
    				MotorSpeed(190, 190);
    				Msleep(500);
    				MotorDir(BREAK, RWD);
    				MotorSpeed(0, 150);
    				Msleep(500);
    			
    			}
    			else if (PollSwitch() != 0)
    			{
    				Sleep(281);
    				if(PollSwitch() != 0)
    				{
    					BackLED(ON,ON);
    					StatusLED(GREEN);
    					MotorDir(RWD, RWD);
    					MotorSpeed(150, 150);
    					Msleep(1000);
    					MotorDir(BREAK, RWD);
    					MotorSpeed(0, 150);
    					Msleep(500);
    				}
    				else
    				{
    					FrontLED(ON);
    					BackLED(OFF,OFF);
    					StatusLED(RED);
    					MotorDir(FWD, FWD);
    					MotorSpeed(130, 130);
    				}
    			}
    			else
    			{
    				FrontLED(ON);
    				BackLED(OFF,OFF);
    				StatusLED(RED);
    				MotorDir(FWD, FWD);
    				MotorSpeed(130, 130);
    			}
    			if(oData[0] >= oldO1 - 1 && oData[0] <= oldO1 + 1)
    			{
    				zaehler++;
    				if(zaehler >= 100)
    				{
    					zaehler = 0;
    					BackLED(ON,ON);
    					StatusLED(GREEN);
    					MotorDir(RWD, RWD);
    					MotorSpeed(150, 150);
    					Msleep(750);
    					MotorDir(BREAK, RWD);
    					MotorSpeed(0, 150);
    					Msleep(400);
    				}
    			}
    			else
    			{
    				zaehler = 0;
    				oldO1 = oData[0];
    			}
    			
    			
    			if(oData[1] >= oldO2 - 1 && oData[1] <= oldO2 + 1)
    			{
    				zaehler2++;
    				if(zaehler2 >= 100)
    				{
    					zaehler2 = 0;
    					BackLED(ON,ON);
    					StatusLED(GREEN);
    					MotorDir(RWD, RWD);
    					MotorSpeed(150, 150);
    					Msleep(800);
    					MotorDir(BREAK, RWD);
    					MotorSpeed(0, 150);
    					Msleep(400);
    				}
    			}
    			else
    			{
    				zaehler2 = 0;
    				oldO2 = oData[1];
    			}
    		}
    		else 
    		{
    			  BackLED(ON,ON);
    			  MotorDir(RWD,RWD);
    			  MotorSpeed(speed,speed);
    			  if (speed > 0) Msleep(500);
    			  MotorDir(BREAK,RWD);
    			  MotorSpeed(0,speed);
    			  if (speed > 0) Msleep(500);
    		}
    		
    		
    			
    		ir1=ir;
    		ir2=ir1; 
    		
    		sw = PollSwitch();
    		
    		   if (sw & 0x04)
    		   {
    			  OCR2  = 0xFC;
    		   }
    		   if (sw & 0x08)
    		   {
    			  OCR2  = 0xFB;
    		   }
    		
        }
    	return 0;
    }
    Also der ASURO sollte eine Tischkante erkennen, was auch funktioniert (das tut er leider auch bei schwarz).
    Zudem sollten die Taster überprüft werden, was auch funktioniert.
    Er sollte auch noch über IR-Sensoren gegenstände schon aus der entfernung erkennen und merken wann ein Rad stehen bleibt(wenn er hängt), über die Odometriesensoren, was beides leider nicht funktioniert.

    Es kommt eine Warnung bei mir und zwar folgende:

    test.c:58: warning: large integer implicitly truncated to unsigned type

    Was aber nichts damit zu tun haben sollte, dass dies nicht funktioniert.

    Danke schonmal im vorraus.

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Sleep(281);

    Maximalwert für Sleep() ist 255.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.09.2010
    Alter
    30
    Beiträge
    129
    ou
    danke ^^
    haste auch ne idee warum das nicht funktioniert liegt nicht daran.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Ob das den Komplete lösung ist weiss ich nicht aber du verwendest den BackLEDs zusammen mit Odometrie messungen. Die gehen nicht zusammen weil es den gleichen Ports am Atmega8 Chip Benutzt, aber in unterschiedliche Schaltzustanden. Also, BackLEDS anruffen raus, oder kein Odometrie verwenden.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Code:
    ...
    if(oData[0] >= oldO1 - 1 && oData[0] <= oldO1 + 1)
    ...
    if(oData[1] >= oldO2 - 1 && oData[1] <= oldO2 + 1)
    Diese beide abfragen sind nur True bei Stillstand der Rädern. (genauer gesagt: die Helligkeit oData[0/1] soll gleich hell/dunkel sein plus/minus 1 ADC wert als die letzte Messung) Aber dein Asuro kann kaum Stillstehen mit dein Programm. Was hast du vor mit diesen code (mit zaehler1 und zaehler2 usw.) Bitte erkläre die Kondition die du erfassen und zahlen möchtest.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen