- Akku Tests und Balkonkraftwerk Speicher         
Seite 33 von 39 ErsteErste ... 233132333435 ... LetzteLetzte
Ergebnis 321 bis 330 von 386

Thema: .: Projekt Wall E :.

  1. #321
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Anzeige

    E-Bike
    Feierabend für heute. Der zweite Inkrementalgeber ist auch eingebaut. Morgen werd ich dann noch zwei IR Sensoren verbasteln und dann kann ich alles in ein hübsches Programm verpacken.

    Irgendwas muss ich mir auch noch überlegen um die ganzen Kabel im inneren sauber zu führen. Im Moment hängen die lose rum, was sicher dazu führt, dass sich mal eins ins Getriebe verirrt.

  2. #322
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Ich hätte nicht gedacht, dass ich so viele Kabel im Roboter unterbringen muss und verlegen. Langsam bekomm ich wirklich sorge wie ich das ganze ordentlich unterbringen könnte. Dabei ist bisher nur ein Mega32 zu implementieren, dafür an dem alle I/O Pins.

  3. #323
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Gerade beschäftige ich mich mit verschiedenen Programmen für meinen MotorMega32. Dieser soll folgende Funktionen können:
    - Batteriespannung AD einlesen und als Bargraph anzeige ausgeben (10 gelbe LEDs)

    - 2 Sharp IR Sensoren (vorn und hinten) auslesen und Wert über RS232 ausgeben

    - Motorstrom für Motor 1 und 2 ausgeben über RS232

    - Kommunikation über I²C mit MainController

    - Status und Notaus LED ansteuern

    - 2 Motoren mit L298 steuern.

    Soweit bin ich jetzt und jedes der Module funktioniert für sich und in der Summe wunderbar.

    ABER:

    Ich schaff es nicht die beiden Inkrementalgeber auszulesen und den Wert anzeigen zu lassen. Aus einem alten Projekt hab ich mir nochmal die Interrupt Routine angesehen für einen Inkrementalgeber (leider ist der Code damals nicht von mir geschrieben worden), ich schaffs aber nicht diesen Code auf zwei Interruptquellen zu erweitern.

    Jetzt hoffe ich, dass einer von euch, dieses Problem schon einmal gelöst hat oder zumindest weis wo ich suchen muss, ich komm nämlich nimmer weiter. Vermutlich haben es schon tausende vor mir gemacht da zwei Inkrementalgeber einlesen nicht so exotisch ist. Ich find aber nichts.

    Hier noch der Code den ich bisher verwende für 1 Quelle. Zukünftig würde ich gerne die Quellen INT0 und INT1 (Port PD2 und PD3 am Mega32) verwenden:

    Code:
    /*
    Autor: Daniel Reitmair
    Datum: 14.12.2008
    Vers.: 1.0
    */
    
    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <avr/delay.h>
    
    #define BAUD        19200UL
    #define F_CPU       7372800UL
    #define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
    
    
    //Globale Variablen
    //*****************
    
    	int32_t durchSens_counter = 0;	//Counter fuer Durchflusssensor
    	int8_t timer_counter = 0;		//Counter fuer Timer_IRQ jede 1sec.
    	int impulse = 0; 
    
    static int
    uart_putchar(char c, FILE *stream)
    {
    	// ... warten bis der Sendepuffer leer ist ...
        while ( !( UCSRA & (1<<UDRE)) )
            ;
    	UDR = c;
    	
    	return 0;
    }
    
    
    static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
    
    void IRQ_init(void){
    //IRQ initialisieren
    
    	//SREG = Status Register
    	//I (bit 7) = Global Interrupt Disable
    	//SREG |= (0<<7);
    	// alle Interrupts abschalten
    	cli();
    
    	//externen IRQ setzen
    	//===================
    	//GICR = General Interrupt Control Register
    	//External Interrupt Request Disable fuer INT2
    	GICR |= (0<<INT2); 
    
    	//MCUCSR = MCU Control and Status Register
    	//ISC2 = Interrupt Sense Control 2: 0= falling edge; 1=rising edge auf PB2(INT2/AIN0)
    	MCUCSR |= (1<<ISC2);
    
    	//GIFR = General Interrupt Flag Register
    	//INTF2 = External Interrupt Flag 2: Loeschen mit logischer 1
    	GIFR |= (1<<INTF2);
    
    	//External Interrupt Request Enable
    	GICR |= (1<<INT2);
    
    	//Timer Overflow IRQ setzen
    	//=========================
    	TIMSK |= (1<<TOIE0);	//Timer Overflow Enable
    
    
    	//SREG = Status Register
    	//I = Global Interrupt Enable
    	//SREG |= (1<<7);
    	//alle Interrupts erlauben
    	sei();
    
    }
    
    
    void uart_init(void)
    {
        // Baudrate einstellen ( Normaler Modus )
        UBRRH = (unsigned char) (UBRR_BAUD>>8);
        UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
    
        // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
        UCSRB = (1<<RXEN)|(1<<TXEN);
    
        // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    
    //IRQ fuer Durchflussensor
    ISR(INT2_vect){
    	durchSens_counter++;
    }
    
    ISR(TIMER0_OVF_vect){
    //IRQ fuer Counter Overflow
    
    	uint8_t tmp_SREG;
    
    	timer_counter++;
    		
    	if (timer_counter == 125){
    		tmp_SREG = SREG;
    		cli();					// IRQ frei ausfuehrung des folgenden Programmcodes
    		
    
    		//Durchflusssensor
    		// pumpe_steuern();
    		impulse = durchSens_counter; 
    		durchSens_counter = 0; 
    			
    		timer_counter = 0;		// Counter Variable Reset
    		// PORTB |= PINB ^ (1<<PB4);
    
    		SREG = tmp_SREG;		// Status register wiederherstellen
    		
    
    		TCNT0 = 6;				// Counter Register auf 6 setzen; zaehlen von 6 bis 255
    		SFIOR |= (0<<PSR10);	// Counter Reset
    			
    	}	
    }
    
    
    
    void IO_init(void){
    	//PB2: Eingang für IRQ (Durckflussensor)
    	//PB4: Ausgang für rote LED
    	//PB3: Ausgang für grüne LED 
    	DDRB = (0 << DDB2) | (1<<DDB4) | (1 << DDB3);
    
    	//Timer/Counter Control Register 0
    	//WGM00 und WGM01: Counter im Normalmodus zaehlen
    	//CS02, CS01 und CS00: Prescale auf 256
    	//TCCR0 |= (0<<WGM00) | (0<<WGM01) | (0<<COM01) | (0<<COM00) | (1<<CS02) | (0<<CS01) | (0<<CS00);
    	TCCR0 = (1<<CS02) | (0<<CS01) | (0<<CS00);
    
    	//Timer/Counter Register 0
    	TCNT0 = 6;	// Wert mit 6 init --> zählen von 6 bis 255 --> nach 125 Counter Overflow ist 1 sec vorrueber
    
    }
    
    
    
    int main (void){
    
    	IRQ_init();
    	IO_init();
    	uart_init();
        
    
    	PORTB |= (1<<PB3); // Grün
    
    	stdout = &mystdout;
        
    	uint16_t value = impulse; 
    	    
    
    	while(1){ 
    	 	value = impulse / 10; // Value in ml
    	 	
    		printf_P(PSTR("Der Wert des Sensors betraegt: %i ml/s \n \r "), value);
    	 	_delay_ms(2000); 
    
    		
    
    	}
    }
    Bitte helft mir, damit ich Wall E fahren lassen kann!

  4. #324
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    UPDATE:

    ich hab mich noch ein wenig gespielt und versucht wenigstens ein Programm zu schreiben, dass zwei Interrupts auslöst:

    Code:
    /*
    Autor: Thomas 
    Datum: 18.4.2010
    Vers.: 1.0
    */
    
    #include <stdio.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <avr/delay.h>
    
    #define BAUD        19200UL
    #define F_CPU       7372800UL
    #define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
    
    
    //Globale Variablen
    //*****************
    
    	int32_t durchSens_counter = 0;	//Counter fuer Durchflusssensor
    	int8_t timer_counter = 0;		//Counter fuer Timer_IRQ jede 1sec.
    	int impulse = 0; 
    
    
    	int counter1 = 0; 
    	int counter2 = 0; 
    
    static int
    uart_putchar(char c, FILE *stream)
    {
    	// ... warten bis der Sendepuffer leer ist ...
        while ( !( UCSRA & (1<<UDRE)) )
            ;
    	UDR = c;
    	
    	return 0;
    }
    
    void uart_init(void)
    {
        // Baudrate einstellen ( Normaler Modus )
        UBRRH = (unsigned char) (UBRR_BAUD>>8);
        UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
    
        // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
        UCSRB = (1<<RXEN)|(1<<TXEN);
    
        // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    
    static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
    
    void IRQ_init(void){
        //IRQ initialisieren
    
    	//SREG = Status Register
    	//I (bit 7) = Global Interrupt Disable
    	//SREG |= (0<<7);
    	// alle Interrupts abschalten
    	cli();
    
    	//externen IRQ setzen
    	//===================
    	//GICR = General Interrupt Control Register
    	//External Interrupt Request Disable fuer INT2
    	GICR |= (0<<INT0)|(0<<INT1); // 
    
    	//MCUCSR = MCU Control and Status Register
    	//ISC2 = Interrupt Sense Control 2: 0= falling edge; 1=rising edge auf PB2(INT2/AIN0)
    	MCUCSR |= (1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);
    	//MCUCSR |= (1<<ISC2);
    
    	//GIFR = General Interrupt Flag Register
    	//INTF2 = External Interrupt Flag 2: Loeschen mit logischer 1
    	GIFR |= (1<<INTF0) | (1<<INTF1); 
    
    	//External Interrupt Request Enable
    	GICR |= (1<<INT0) | (1<<INT1); //
    	//GICR |= (1<<INT1); 
    
    	//Timer Overflow IRQ setzen
    	//=========================
    	//TIMSK |= (1<<TOIE0);	//Timer Overflow Enable
    
    
    	//SREG = Status Register
    	//I = Global Interrupt Enable
    	//SREG |= (1<<7);
    	//alle Interrupts erlauben
    	sei();
    
    }
    
    
    
    
    //IRQ fuer Durchflussensor
    ISR(INT0_vect){
      PORTA &= ~ (1<<PA5); 
      PORTA |= (1<<PA7);
      counter1++; 	
    }
    
    
    ISR(INT1_vect){
      PORTC &= ~ (1<<PC5);
      PORTC |= (1<<PC3);
      counter2++;
    }
    
    
    
    
    
    void IO_init(void){
    	//DDRB = (0 << DDB2);
    	DDRD = (0<< PD3) | (0 <<PD2);
        DDRA = (1<< PA5) | (1 <<PA7); 
    	DDRC = (1<< PC5) | (1 <<PC3); 
    }
    
    
    
    int main (void){
    
    	IRQ_init();
    	IO_init();
    	uart_init();
       
    
    	stdout = &mystdout;
    
    	   
    	while(1){ 
    
    	 	
    		printf_P(PSTR("Der Wert 1 betraegt: %i     Der Wert 2 betraegt %i \n"), counter1, counter2);
    	 	PORTA |= (1<<PA5);
    		PORTA &= ~ (1<<PA7);
    	    PORTC |= (1<<PC5);
    		PORTC &= ~ (1<<PC3);
    		_delay_ms(1000); 
    
    		
    
    	}
    }
    Das Progrmm funktioniert soweit auch. Immer wenn die Inkrementalgeberscheibe auf Schwarz steht wird ein Interrupt ausgelöst.
    Leider bleibt der dann aktiv solange bis ich weiter auf weis drehe. Ich möchte aber eigentlich dass der Interrupt nur einmal ausgelöst wird und erst beim nächsten Schwarzen Feld wieder. Er soll also nicht dauerhaft aktiv bleiben (der Zähler zählt dann munter weiter und weiter bis er überläuft und wieder von vorn anfängt, abgesehen davon reagiert der Controller dann nicht, da er sich in Interrupt Routine befindet).

    Ich dachte eigentlich mit dem MCUCSR Bits den Interrupt auf steigende Flanke eingestellt zu haben.

    Gerade hab ich die beiden Werte für High und Low mit dem Oszi untersucht und die Spannung sind in Ordnung, wakeln also bis auf 1mV nicht hin und her.

    Es wird auch nicht daran liegen, dass die Gabellichtschranke nicht sauber wechselt von Low auf High, den dann würde es der Interrupt nicht weiter aktiv bleiben wenn die Scheibe auf schwarz steht.

    Was ist da los?

  5. #325
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Muss ich eigentlich in die Schaltung für die Lichtschranken noch einen Schmitt-Trigger (z.B. 74HC14) einbauen? Damit ich wirklich saubere Flanken bekomme?

  6. #326
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521
    Hallo,

    mir ist nur ein Fehler aufgefallen, für INT0 und INT1 muss man MCUCR und nicht MCUCSR verwenden, der ist nur für INT2.

    Wobei ich zugeben muss dass ich den selben Fehler umgekehrt für INT2 im Programm habe und es trotzdem funktioniert

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  7. #327
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    @damfino, DANKE!!! Das war der Fehler, jetzt funktioniert es einwandfrei wie gewünscht. Jetzt muss ich nur noch das mit den Zählern implementieren.

  8. #328
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.04.2009
    Ort
    345**
    Alter
    31
    Beiträge
    435
    entschuldige die frage, aber war Wall E schon mal in Irland, genauer gesagt an den Klippen von Moher?

    mfg wisda.noobie

  9. #329
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Höchstens autonom, aber nicht mit meinem Einverständnis.

  10. #330
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    42
    Beiträge
    4.534
    Blog-Einträge
    1
    Es gibt wieder Neuigkeiten: Leider keine neuen Bilder, da ich im Moment nur an der Ansteuerung arbeite. Nachdem die Motoransteuerung soweit fertig ist arbeite ich aktuell am Kopf. Hier müssen die 3 Servos für den Hals implementiert werden, der Laser zwischen den Augen und natürlich die Solarzelle. Eigentlich nicht besonders viel und auch entsprechend schnell zu machen.

    Was mit aktuell noch fehlt zu meinem Glück, ist ein LCD Grafikdisplay welches ich mit einem Mega32 ansteuern kann. Hat einer von euch vielleicht sowas schon mal erfolgreich gemacht?

Seite 33 von 39 ErsteErste ... 233132333435 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen