-
        

Seite 1 von 8 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 78

Thema: Programmier Fragen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45

    Programmier Fragen

    Anzeige

    Hallo!

    Ich habe mir erst vor kurzem den Asuro gekauft und eine erweiterungsplatine erstellt die ich über I²C ansteuere

    -> ein A/D Übersetzer
    -> eine Porterweiterung die eine LED dimmfunktion hat

    ich möchte damit
    2 taster
    3-4 LEDs
    einen mini Lautsprecher

    die zwei ausgebauten licht transistoren ( für den I²C bus )
    und einen licht transistor mit über 2 widerstände( von porterw. gest.) verstellbaren arbeitspunkt zum auffinden einer lichtquelle

    ansteuern

    und da haben sich einige Fragen ergeben :

    -> was genau ist Clock Stretching und was muss ich dabei berücksichtigen ( das macht mein A/D beim T/H )

    kann ich die I²C Master-Bibilothek einfach dazuincluden... oder?

    kann ich mir Go() und Turn() wie poilingbetrieb vorstellen bis der asuro z.B
    400mm gefahren ist oder rufe ich die funktion auf und kann dann z.B daten vom I²C bus einlesen?

    welcher Timer ist eigentlich noch zur interruptprogrammierung frei ?

    Ich bin in Punkto Mikrokontroller programmierung noch nicht sehr eingearbeitet ( habe zwar C programmierung an der Schule aber erst seit einem semester Microcontroller Programmierung in C )
    und bin deshalb umso mehr für jede Hilfe dankbar!

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    was genau ist Clock Stretching und was muss ich dabei berücksichtigen ( das macht mein A/D beim T/H )
    Spielt wahrscheinlich keine Rolle, da die I2C Emulation sowieso langsam ist. Ansonsten siehe im RN-Wissen
    http://www.roboternetz.de/wissen/ind...ock_Stretching

    kann ich die I²C Master-Bibilothek einfach dazuincluden... oder?
    Wenn du die Lib von P.Fleury meinst, ja. Einfach im Makefile die folgende Zeile enfügen

    ASRC = i2cmaster.S
    kann ich mir Go() und Turn() wie poilingbetrieb vorstellen bis der asuro z.B
    400mm gefahren ist oder rufe ich die funktion auf und kann dann z.B daten vom I²C bus einlesen?
    Go und Turn arbeiten im Pollingbetrieb. Die Funktionen werden erst beendet, wenn der Asuro die entsprechende Strecke gefahren ist.

    welcher Timer ist eigentlich noch zur interruptprogrammierung frei ?
    Timer0 wäre noch frei. Ist aber nur ein 8-Bit Timer.
    Timer1 läuft mit 36kHz für serielle Kommunikation und Zeitschleifen.
    Timer2 wird für die PWM der Motoren benötigt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45
    mhm ich habs wirklich nicht mit dem einbinden

    Code:
    # List Assembler source files here.
    # Make them always end in a capital .S.  Files ending in a lowercase .s
    # will not be considered source files but generated files (assembler
    # output from the compiler), and will be deleted upon "make clean"!
    # Even though the DOS/Win* filesystem matches both .s and .S the same,
    # it will preserve the spelling of the filenames, and GCC itself does
    # care about how the name is spelled on its command-line.
    ASRC = i2cmaster.S
    ich verwende die dateien von FirstTry und habe die letze zeile eingefügt
    im selben ordner befindet sich die assembler source
    aber ich bekomme beim make trotzdem ein implicit function declaration

    könnte es daran liegen dass die datei <avr/io.h> die die assembler datei einbindet am falschen platz ist ?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi hast die I2C Header Datei auch in deinem C-Programm included?

    Code:
    #include "asuro.h"
    #include "i2cmaster.h"

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45
    Wow unglaublich ich habe es tatsächlich geschafft Compilierbaren Code zu Produzieren

    Danke!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45
    Hmm ich hab mich etwas durch die beschreibung des ATmega8 gelesen

    wenn ich den INT0 Pin als falling Edge Interrupt verwenden möchte
    und Den Timer 0 prescaled mit 256 dann müsste ich das schreiben oder.. ?

    INT0 aktivierung

    Code:
    sei();
    MCUCR|=0x03;
    MCUCR&=0xF7;
    SREG|=0x80;
    GICR|=0x40;
    Timer 0
    Code:
    TCCR0|=0x07;
    TCCR0=0xFC;
    TIMSK|=0x01;
    wenn ich mir jetzt ausrechnen möchte in welchem Zeitabstand der Interrupt
    ausgelöst wird muss ich
    Dauer eines Clock Zyklusses ( wie schnell ist der Clock takt ? )
    mal 256 ( Prescaler )
    mal 1..256 (TCNT0)
    richtig ?

    nebenbei ist Encoder aktiviert
    und INT0 sowie Timer0 sind höherrangiger als der Encoder Interrupt....
    kann ich es riskieren eine I2C Abfrage in den Timer Interrupt zu geben ?

    Ich habe die Go funktion kopiert und so umgeschrieben dass sie immer nachdem die variable driveEnable in einem Interrupt gesetzt wird einmal ausgeführt wird
    .. es wird zwar dadurch erheblich seltener aufgerufen aber immernoch mehrmals pro sekunde .. das dürfte reichen oder ?

    was bedeutet dieser Error?

    Code:
    make: [test.eep] Error 1 (ignored)
    avr-objdump -h -S test.elf > test.lss
    /usr/bin/sh: test.lss: Permission denied
    make: *** [test.lss] Error 1
    Wenn ich compiliere kommt folgende Fehlermeldung:

    Windows - Kein Datenträger
    X Es befindet sich kein Datenträger im Laufwerk. Legen Sie einen Datenträger in Laufwerk ein.

    wenn ich sie ca 60 mal abbreche verschwindet sie ...
    dann geht auch das compilieren ... es werden eine errors angezeigt

    dafür aber Processed Exit Code 1

    NACHTRAG Wenn ich Syntaxfehler habe werden diese angezeigt und natürlich nicht zu ende compiliert
    wenn ich sie behoben habe kommt wieder die komische Fehlermeldung

    was benötigt weniger Speicher
    5 elseif's
    oder Switch case ?

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45
    ich habe zwar seit einem weilchen nichtmehr erfolgreich kompiliert aber
    mir ist aufgefallen dass meine HEX datei 8kB groß ist .....
    das beunruhigt mich...

    das hier ist mein programm...
    es ist mit vielen globalen variablen und ohne zeiger programmiert
    .. da wäre vermutlich noch etwas komprimiermöglichkeit
    außerdem habe ich einige INT's wo chars reichen würden..
    aber ist dieses programm wirklich schon fast zu groß für den ASURO

    Code:
    #include <asuro.h>
    #include <i2cmaster.h> 
    
    #define  I2C_PORTERW 0x40 
    #define  I2C_ADC  0xC8   
    #define  TASTE1   0x01
    #define  TASTE2	  0x02
    #define  BOTH     0x00
    #define  NONE     0x03
    #define  SEC2     0xFF
    /* MODUS : 
    	0...	Stop
    	1...	Folge Linie
    	2...	Suche Lichtquelle
    	3...	Freestyle zur zeit STOP
    	4...	Langsame Geschwindigkeit
    	5...	Schnelle Geschwindigkeit
    	
    */
    void i2c_startConfig(void);
    void i2c_setPorterw(unsigned char chooseRegister,unsigned char wert);
    unsigned char i2c_readPorterw(void);
    void Drive (void); // is set by global Speed
    volatile int driveEnable=0;
    volatile int measure;
    volatile int checkTasten=0;
    volatile int modus=0;
    volatile int speed=200;
    
    int main(void)
    {
    	Init();
    	i2c_init();					// initialize I2C library
    	
    	sei();
    	MCUCR|=0x03;
    	MCUCR&=0xF7;
    	SREG|=0x80;
    	GICR|=0x40; 
    	TCCR0|=0x07;
    	TCCR0=0xFC;
    	TIMSK|=0x01; 
    	EncoderInit();
    	i2c_startConfig();
    	//unsigned char ret;
    	while (1)
    	{
    		
    		if(modus==0 || modus==3)
    		{	MotorDir(BREAK,BREAK);
    		}
    		else if(modus==1)
    		{	//Linienfolge
    		}
    		else if(modus==2)
    		{	//Lichtsuche
    			if(driveEnable)
    			{	Drive();
    			}
    		}
    		else if(modus==4)
    		{	//Geschwindigkeit Langsam
    			speed=100;
    			modus=0;
    			
    		}
    		else if(modus==5)
    		{	//Geschwindigkeit Schnell
    			speed=200;
    			modus=0;
    		}
    	return 0;
      }
    }
    SIGNAL (SIG_INTERRUPT0)
    {	checkTasten=1;
    }
    SIGNAL(SIG_OVERFLOW0)
    {
    	if(checkTasten==1)
    	{
    		static int time; // Zählt die vergangene Zeit nach dem Tastendruck
    		static unsigned char wert1=0; 	// wert1 ist nötig um das drücken Beider Tasten richtig zu erkennen 
    		unsigned char wert;
    		wert=i2c_readPorterw();
    		wert1&=wert;
    		if(wert1!=NONE)					// Wenn checkTasten zurecht gestetzt wurde beginnt die messung der Tastendruckdauer
    		{ time++;
    		}
    		else if(wert==NONE && time)	// Da das Auslassen der Tasten keinen Einfluss auf wert1 hat wird wert überprüft
    		{	
    			if(time<SEC2)				
    			{
    				modus=wert1;			
    			}
    			else						// Wurde länger als 2 Sekunden gedrückt werden 3 andere Modis verwendet.
    			{
    				modus=wert1+3;			
    			}
    			checkTasten=0;
    			time=0;
    			wert1=0;
    			
    		}
    			
    	}
    	driveEnable=1;
    	
    }
    
    void i2c_startConfig(void)
    {	
    	unsigned char data1=0,data2=0;
    	
    	// Porterweiterungs Initialisierung
    	
    	data1=0x0F; 		// Configuration Register 
    	data2=0x0B;		// xxxx1011
    					// Interrupt Enabled,Global Intensity Off, Blink Flip On, Blink Enable
    	i2c_setPorterw(data1,data2);
    	
    	
    	data1=0x03;		// Input/Output Configuration Register
    	data2=0x03;	// Port 1 und 2 Inputs
    	i2c_setPorterw(data1,data2);
    	
    	
    	// intensity //interrupt configured as interrupt -> goes low if change is detected
    	
    	data1=0x0E;		//Master and Global Intensity Register
    	data2=0x10;		//PWM On ,Interrupt is not used as General Puropse Output 
    	i2c_setPorterw(data1,data2);
    	
    	// intensity leds
    	data1=0x12;		// P5,P4      //Blaue Leds.. Helligkeit Signalisiert Geschwindigkeit
    	data2=0xEE;		// High Intensity
    	i2c_setPorterw(data1,data2);
    	data1=0x13;		// P6 und Tonausgabe		// Gelbe Led Reagiert auf Tastendruck
    	data2=0x77;     // Tonausgabe Rechtecksignal
    	i2c_setPorterw(data1,data2);
    	data1=0x11;
    	data2=0xFF;		// Widerstände statisch High
    	i2c_setPorterw(data1,data2);
    	
    	// Blink Phasen  initialisierung
    	
    	data1=0x01;		// Blink Phase 1
    	data2=0xBC;		// 1011 1100
    					//
    	i2c_setPorterw(data1,data2);
    	
    	data1=0x09;		// Blink Phase 2
    	data2=0xCC;		// 1100 1100
    	i2c_setPorterw(data1,data2);
    	
    	// ADC Initialisierung
    	 //Setup Byte // AIN3/ REF = Ref output, SingleEnded, Clockstretching sampling activated
    	 //Configuration Byte 
    	i2c_start(I2C_ADC+I2C_WRITE);
    	i2c_write(0xF2);
    	i2c_write(0x05);
    	i2c_stop();
    	
    }
    void i2c_setPorterw(unsigned char chooseRegister, unsigned char wert)
    {	
    	unsigned char data=0;
    	i2c_start(I2C_PORTERW+I2C_WRITE);
    	data=chooseRegister;
    	i2c_write(data);
    	data=wert;
    	i2c_write(data);
    	i2c_stop();
    }
    
    void Drive ()
    {
       int diff = 0;
       int l_speed = speed, r_speed = speed;
    	MotorSpeed(l_speed,r_speed);
    	MotorDir(FWD,FWD);
       
    	 driveEnable=0;
        
         diff = encoder[LEFT] - encoder[RIGHT];
         if (diff > 0)
         { //Left faster than right
           if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
           else r_speed += 10;
         }
         if (diff < 0)
         { //Right faster than left
           if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
           else l_speed += 10;
         }
         EncoderSet(0,0); // reset encoder
         MotorSpeed(l_speed,r_speed);
    	
       
       
     }
    unsigned char i2c_readPorterw()
    {	
    	unsigned char data=0x00,wert=0;
    	i2c_start(I2C_PORTERW+I2C_READ);
    	i2c_write(data);
    	wert=i2c_readNak();
    	wert&=0x03;
    	return wert;
    }
    wenn ja ist das ... verdammt schlecht....
    ich habe bis jetzt nicht viel mehr als die tastenabfrage und die initialisierung programmiert ?!?

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45
    mhm falls ich wirklich so viel speicher benötige.. gibt es möglichst unaufwändige möglichkeiten den speicher zu erweitern ?

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    8kB Hex File Größe ist überhaupt kein Problem. In dem File sind die Binärdaten ASCII kodiert. Dazu kommen noch Adress, Längen Angaben und CRCs. Im Speicher des Asuro sind dadurch weniger als die Hälfte belegt.
    In der Asuro Lib bis zur Version 2.6.1 wurde zudem jede Menge Speicherplatz vergeudet, weil immer alle Funktionen mit eingebunden wurden, egal ob sie benötigt wurden oder nicht. Mit der neuen Lib V2.7 kriegt man wesentlich kleinere Hex-Files zustande.

    Bei der Timer Programmierung kann ich dir leider nicht helfen.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    20.02.2007
    Alter
    28
    Beiträge
    45
    ok das ist beruhigend ^^



    ich komme momentan überhaupt nicht weiter ...
    ihr habt doch für eure libary auch timer konfugurieren müssen oder ?
    das einzige das ich bis jetzt gefunden habe ist 8Mhz .... könnte das der Takt
    der CLK I/O sein ?

    außerdem habe ich das hier zu GCC 4 gefunden....
    Code:
    ISR (INT0_vect)
    {
        /* Interrupt Code */
    }
    
    void TIMER0_OVF_vect (void) __attribute__((interrupt));
    void TIMER0_OVF_vect (void)
    {
        /* Interrupt Code */
    }
    -> leider war es nicht erklärt..
    die definition des interrupts ok .. einfach umschreiben
    aber die des timers .. auch einfach umschreiben ?

    und irgendwie waren bei diesen beispielen immer irgendwelche avr\include\interrupt etc. included
    wenn ich die asuro libary verwende brauche ich das nichtmehr oder ?

Seite 1 von 8 123 ... LetzteLetzte

Berechtigungen

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