- 3D-Druck Einstieg und Tipps         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 38

Thema: ACS an NIBObee

  1. #21
    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

    Praxistest und DIY Projekte
    Zumindest zwischen + und - sollte an allen Erweiterungssteckern die Bordspannung messbar sein. Testweise kann man anstelle der Pausen einen Programmstop einfügen, dann hat man mehr Zeit zum Messen. Aus _delay_ms(5000); wird ein schlichtes while(1); (mit Semikolon!)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #22
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104
    So, Problem gefunden, die Akkus waren fast leer. Jetzt klappt alles.
    Mittlerweile habe ich auch ein Programm geschrieben was beide IR-LEDs leuchten lässt.
    Könntest du mir jetzt vielleicht abschließend erklären, wie ich den TSOP einbinden kann? Sprich wie ich ihn definiere und wie ich ihn in if-Bedingungen einbinden kann.

  3. #23
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Code:
    // Übungen für ACS an Nibobee                                         11.6.11 mic
    
    // https://www.roboternetz.de/community/showthread.php?53494-ACS-an-NIBObee
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "acs_defines.h" // Definitionen als Headerdatei einbinden
    
    void set_leds(uint8_t status)
    {
    	PORTB &= 0xf0;
    	PORTB |= (0x0f & status);
    }
    
    int main(void)
    {
    	ddr_acs_led_l |= pin_acs_led_l;
    	//port_acs_led_l |= pin_acs_led_l;
    	port_acs_led_l &= ~pin_acs_led_l;
    
    	ddr_acs_led_r |= pin_acs_led_r;
    	//port_acs_led_r |= pin_acs_led_r;
    	port_acs_led_r &= ~pin_acs_led_r;
    
    	ddr_acs_36kHz |= pin_acs_36kHz;
    	port_acs_36kHz &= ~pin_acs_36kHz;
    	
    	DDRB |= 0x0f; // LEDs
    	set_leds(0b1001);
    	_delay_ms(1000);
    	set_leds(0);
    
    	while(1)
    	{
    		if(port_acs_tsop & pin_acs_tsop)
    			set_leds(0b0001);
    		else
    			set_leds(0b1000);
    	}
    	return(0);
    }
    Deine Datei acs_defines.h:
    Code:
    // pacman-bee
    
    // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0)
    // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1)
    // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden
    // Der IR-Empfänger ist mit PA2 (X2-AN2) verbunden
    
    #define ddr_acs_led_l  	DDRA 	// Anoden der IR-LEDs links
    #define port_acs_led_l 	PORTA
    #define pin_acs_led_l	(1<<PA1)
    
    #define ddr_acs_led_r  	DDRA    // rechts
    #define port_acs_led_r 	PORTA
    #define pin_acs_led_r 	(1<<PA0)
    
    #define ddr_acs_36kHz  	DDRA 	// Kathoden der IR-LEDS mit 36kHz getaktet
    #define port_acs_36kHz 	PORTA
    #define pin_acs_36kHz 	(1<<PA3)
    
    #define ddr_acs_tsop  	DDRA 	// Eingang IR-Empfänger
    #define port_acs_tsop 	PINA  // Achtung, das ist ein Eingang!
    #define pin_acs_tsop  	(1<<PA2)
    [Edit]
    Mittlerweile habe ich auch ein Programm geschrieben was beide IR-LEDs leuchten lässt.
    #define ddr_acs_36kHz DDRA // Kathoden der IR-LEDS mit 36kHz getaktet

    Das ist dir aber sicher auch schon aufgefallen ;)

    Du bist nun da wo Pinsel gestartet ist:
    https://www.roboternetz.de/community...bstandsmessung

    Um es nun etwas abzukürzen:

    PHP-Code:
    // ACS Testprogramm für die bee                                      11.6.2011 mic

    // Infrarot-ACS für die bee im zweiten Anlauf mit pacman ;)

    // https://www.roboternetz.de/community/showthread.php?53494-ACS-an-NIBObee
    // https://www.roboternetz.de/community/showthread.php?46233-nibobee-IR-Abstandsmessung
    // &p=444151&viewfull=1#post444151

    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include "acs_defines.h" // Definitionen der ACS-Hardware als Headerdatei einbinden

    volatile uint8_t count36kHz;
    volatile uint8_t acs=0;

    void Sleep(uint8_t pause);
    void Msleep(uint16_t pause);
    void ACSData(uint16_t *data);

    int main(void)
    {
        
    uint16_t data[2]; // Speicher für ACS-Werte

        
    led_init();

        
    // Setup Timer2
        
    TCCR2 = (<< WGM20)|(<< CS20); // PhaseCorrect-PWM, no prescaling, no OC2-Pin!
        
    TCNT2  96// (512-416) 36kHz @15MHz
        
    OCR2 151// (255-(208/2)) 151 ist 50:50 Compare Match für symetrische Halbwellen
        
    TIMSK |= (<< OCIE2)|(<< TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum!
        
    enable_interrupts();

        
    ddr_acs_led_l |= pin_acs_led_l;        // die Anoden der IR-LEDs
        
    port_acs_led_l &= ~pin_acs_led_l;

        
    ddr_acs_led_r |= pin_acs_led_r;
        
    port_acs_led_r &= ~pin_acs_led_r;

        
    ddr_acs_36kHz |= pin_acs_36kHz;        // die Kathoden der IR-LEDs

          
    led_set(0,1);
        
    Msleep(2000); // wait4programmer
          
    led_set(0,0);

        while(
    1)
       {
          
    ACSData(data);
          
    PORTB &= ~15// alle Leds aus
          
    if(data[0] > 251led_set(1,1);
             else if(
    data[0] > 230led_set(0,1);
          if(
    data[1] > 251led_set(2,1);
             else if(
    data[1] > 230led_set(3,1);
          
    Msleep(100);
       }
       return(
    0);
    }
    ISR (TIMER2_COMP_vect)
    {
        
    port_acs_36kHz ^= pin_acs_36kHz// IR-LEDs togglen
    }
    // Frequenzkorrektur für 36kHz (512-416 plus 3 Takte fürs Laden von TCNT2?)
    ISR (TIMER2_OVF_vect)
    {
        
    TCNT2  += 99// += bewirkt, dass schon erfolgte Zähltakte nicht ignoriert werden!
        
    port_acs_36kHz &= ~pin_acs_36kHz// bei Nulldurchgang soll die IR-LED aus sein!
        //port_acs_36kHz |= pin_acs_36kHz; // seltamerweise funktioniert das auch?
        
    if(count36kHzcount36kHz--;
       if(
    acsacs--;
    }

    void Sleep(uint8_t pause// 1/36000 Pause blockierend
    {
        
    count36kHz=pause;
        while(
    count36kHz);
    }
    void Msleep(uint16_t pause// 1/1000 Pause blockierend
    {
        while(
    pause--) Sleep(36);
    }
    void ACSData(uint16_t *data)
    {
       
    OCR2=253;
       
    port_acs_led_l |= pin_acs_led_l// ACS LED left on
       
    while((port_acs_tsop pin_acs_tsop) && (OCR2 151))
       {
          
    acs=10// Impulse senden, acs wird in OVF-ISR runtergezählt
          
    while(acs);
          
    OCR2--;
       }
       
    port_acs_led_l &= ~pin_acs_led_l// ACS LED left off
       
    data[0]=OCR2;
       while(!(
    port_acs_tsop pin_acs_tsop)); // warten bis keine Echo mehr

       
    OCR2=253;
       
    port_acs_led_r |= pin_acs_led_r// ACS LED right on
       
    while((port_acs_tsop pin_acs_tsop) && (OCR2 151))
       {
          
    acs=10;
          while(
    acs);
          
    OCR2--;
       }
       
    port_acs_led_r &= ~pin_acs_led_r// ACS LED right off
       
    data[1]=OCR2;
       while(!(
    port_acs_tsop pin_acs_tsop));

    Das Programm reagiert auf die Annäherung eines Hindernisses und auf eine Fernbedienung. Es wird nun doch die nibobee-Library verwendet. Erklärung folgt...
    Geändert von radbruch (11.06.2011 um 15:23 Uhr) Grund: Testprogramm angefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #24
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104
    vielen Dank, radbruch! Du hast mir sehr geholfen und mir viel beigebracht. Nachdem ich ein Programm geschrieben hab, wobei der NIBObee fährt und an Hindernisse vorbeifährt, melde ich mich wieder, damit du "dein" Werk begutachten kannst

    achso und:
    #define ddr_acs_36kHz DDRA // Kathoden der IR-LEDS mit 36kHz getaktet

    Das ist dir aber sicher auch schon aufgefallen
    ja, das ist mir aufgefallen.....nur halt ein bischen später

  5. #25
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104
    Hallo! Ich bräuchte doch noch einmal eure Hilfe ... und zwar versuche ich meinen vorhandenen Code der Hindernisdetektion durch Fühler mit dem Code der Hindernisdetektion durch das ACS zu kombinieren. Alleine kann ich die Codes compilieren, doch sobald ich nur ein "include" oder "integer" kopiere, folgen haufenweise Errors. Von: "conflicting types for 'led_set' " bis hin zu "expected '(' before 'while' ".
    Ich sitze jetzt schon fast den ganzen Tag dran und bin langsam am verzweifeln

  6. #26
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104

    Fehlermeldung beheben

    Hallo, ich habe folgenden
    Code:
    // Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0)
    // Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1)
    // Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden
    // Der IR-Empfänger ist mit PA2 (X2-AN2) verbunden
    
    #define ddr_acs_led_l  	DDRA 	// Anoden der IR-LEDs links
    #define port_acs_led_l 	PORTA
    #define pin_acs_led_l	(1<<PA1)
    
    #define ddr_acs_led_r  	DDRA    // rechts
    #define port_acs_led_r 	PORTA
    #define pin_acs_led_r 	(1<<PA0)
    
    #define ddr_acs_36kHz  	DDRA 	// Kathoden der IR-LEDS mit 36kHz getaktet
    #define port_acs_36kHz 	PORTA
    #define pin_acs_36kHz 	(1<<PA3)
    
    #define ddr_acs_tsop  	DDRA 	// Eingang IR-Empfänger
    #define port_acs_tsop 	PINA  // Achtung, das ist ein Eingang!
    #define pin_acs_tsop  	(1<<PA2)
    
    #include <nibobee/iodefs.h>
    #include <nibobee/led.h>
    #include <nibobee/motpwm.h>
    #include <nibobee/sens.h>
    
    volatile uint8_t count36kHz;
    volatile uint8_t acs=0;
    
    void Sleep(uint8_t pause);
    void Msleep(uint16_t pause);
    void ACSData(uint16_t *data);
    
    int main(void)
    {
        uint16_t data[2]; // Speicher für ACS-Werte
    	
        led_init();
    	motpwm_init();
    	sens_init();
    	while(1==1) {
    	
        // Setup Timer2
        TCCR2 = (1 << WGM20)|(1 << CS20); // PhaseCorrect-PWM, no prescaling, no OC2-Pin!
        TCNT2  = 96; // (512-416) 36kHz @15MHz
        OCR2 = 151; // (255-(208/2)) 151 ist 50:50 Compare Match für symetrische Halbwellen
        TIMSK |= (1 << OCIE2)|(1 << TOIE2); // Comp und OVF-ISR enable, Overflow bei Bottum!
        enable_interrupts();
    
        ddr_acs_led_l |= pin_acs_led_l;        // die Anoden der IR-LEDs
        port_acs_led_l &= ~pin_acs_led_l;
    
        ddr_acs_led_r |= pin_acs_led_r;
        port_acs_led_r &= ~pin_acs_led_r;
    
        ddr_acs_36kHz |= pin_acs_36kHz;        // die Kathoden der IR-LEDs
    
          led_set(0,1);
        Msleep(2000); // wait4programmer
          led_set(0,0);
    
        while(1)
       {enable_interrupts();
    	int16_t speed_l=0;
    	int16_t speed_r=0;
    	motpwm_setLeft(speed_l);
    	motpwm_setRight(speed_r);
         
    	  ACSData(data);
          PORTB &= ~15; // alle Leds aus
          if(data[0] > 251) speed_l = 500;
             else if(data[0] > 230) speed_l = 800;
          if(data[1] > 251) speed_r = 500;
             else if(data[1] > 230) speed_r = 800;
          Msleep(100);
       }
       return(0);
    }
     ISR (TIMER2_COMP_vect)
    {
        port_acs_36kHz ^= pin_acs_36kHz; // IR-LEDs togglen
    }
    // Frequenzkorrektur für 36kHz (512-416 plus 3 Takte fürs Laden von TCNT2?)
     ISR (TIMER2_OVF_vect)
    {
        TCNT2  += 99; // += bewirkt, dass schon erfolgte Zähltakte nicht ignoriert werden!
        port_acs_36kHz &= ~pin_acs_36kHz; // bei Nulldurchgang soll die IR-LED aus sein!
        //port_acs_36kHz |= pin_acs_36kHz; // seltamerweise funktioniert das auch?
        if(count36kHz) count36kHz--;
       if(acs) acs--;
    }
    
    void Sleep(uint8_t pause) // 1/36000 Pause blockierend
    {
        count36kHz=pause;
        while(count36kHz);
    }
    void Msleep(uint16_t pause) // 1/1000 Pause blockierend
    {
        while(pause--) Sleep(36);
    }
    void ACSData(uint16_t *data)
    {
       OCR2=253;
       port_acs_led_l |= pin_acs_led_l; // ACS LED left on
       while((port_acs_tsop & pin_acs_tsop) && (OCR2 > 151))
       {
          acs=10; // Impulse senden, acs wird in OVF-ISR runtergezählt
          while(acs);
          OCR2--;
       }
       port_acs_led_l &= ~pin_acs_led_l; // ACS LED left off
       data[0]=OCR2;
       while(!(port_acs_tsop & pin_acs_tsop)); // warten bis keine Echo mehr
    
       OCR2=253;
       port_acs_led_r |= pin_acs_led_r; // ACS LED right on
       while((port_acs_tsop & pin_acs_tsop) && (OCR2 > 151))
       {
          acs=10;
          while(acs);
          OCR2--;
       }
       port_acs_led_r &= ~pin_acs_led_r; // ACS LED right off
       data[1]=OCR2;
       while(!(port_acs_tsop & pin_acs_tsop));
    }
    Beim Compilieren gibt er mir folgende Errors:
    -static declaration of '__vector_3' follows non-static declaration
    -previous declaration of '__vector_3' was here
    -static declaration of '__vector_4' follows non-static declaration
    -previous declaration of '__vector_4' was here
    -expected declaration or statement at end of input

    das ganze bezieht sich auf diesen Teil:
    Code:
    ISR (TIMER2_COMP_vect)
    {
        port_acs_36kHz ^= pin_acs_36kHz; // IR-LEDs togglen
    }
    // Frequenzkorrektur für 36kHz (512-416 plus 3 Takte fürs Laden von TCNT2?)
     ISR (TIMER2_OVF_vect)
    {TCNT2  += 99; // += bewirkt, dass schon erfolgte Zähltakte nicht ignoriert werden!
        port_acs_36kHz &= ~pin_acs_36kHz; // bei Nulldurchgang soll die IR-LED aus sein!
        //port_acs_36kHz |= pin_acs_36kHz; // seltamerweise funktioniert das auch?
        if(count36kHz) count36kHz--;
       if(acs) acs--;}

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

    Vor return fehlt eine }

    Aber das löst noch nicht alle Probleme. In allen Funktionsaufrufen der Library fehlt das void wenn kein Parameter übergeben wird, atomic kann mein Kompiler auch nicht und base.h muss eingebunden werden wegen nibobee_initialization:

    In motpwm.c:
    Code:
    void motpwm_init(void) {
      nibobee_initialization |= NIBOBEE_MOTPWM_INITIALIZED;
      set_output_group(IO_MOTOR);
      activate_output_group(IO_MOTOR);
      PWM_TIMER_CCRA = PWM_TIMER_CCRA_INIT;
      PWM_TIMER_CCRB = PWM_TIMER_CCRB_INIT;
      PWM_TIMER_IMSK |= PWM_TIMER_IMSK_INIT;
    }
    
    
    void motpwm_stop(void) {
      //ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
      cli();
        motpwm_motor_l = 0;
        motpwm_motor_r = 0;
        PWM_TIMER_OCRA = 0;
        PWM_TIMER_OCRB = 0;
      sei();
      //}
    }
    sens.c:
    Code:
    void sens_init(void) {
      set_output_group(IO_SENS);
    }
    leds.c:
    Code:
    void led_init(void) {
      activate_output_group(IO_LEDS);  // LED bits als Output
    }
    base.h einbinden:
    Code:
    ...
    #define pin_acs_tsop  	(1<<PA2)
    
    #include <nibobee/base.h>
    #include <nibobee/iodefs.h>
    ...
    Ich habe den Beitrag mal hier eingeordend, das passt hier besser.

    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!

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104
    Also, wenn ich das dazuschreibe, kommen noch mehr Fehlermeldungen: zB 'PWM_TIMER_CCRB' undeclared (first use in this function) ?

  9. #29
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    28
    Beiträge
    104
    Hallo, da bin ich wieder. Ich bin kurz vor dem Ziel. Mein letztes Problem ist noch, dass ich, wenn ich die sens.c Datei und die anderen ändern will, den Zugriff verweigert bekomme. Weiß einer wie ich das umgehen kann, oder muss ich die gesamte Datei in mein Programm kopieren?

  10. #30
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Wie lautet denn der genaue Wortlaut der Meldung? Screenshot?
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Ähnliche Themen

  1. NiboBee und Windows 7
    Von m125 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 12.02.2015, 11:21
  2. nibobee IR-Abstandsmessung
    Von pinsel120866 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 39
    Letzter Beitrag: 10.10.2011, 10:19
  3. Nibobee: Rad-Getriebe
    Von c07 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 16
    Letzter Beitrag: 21.01.2011, 15:57
  4. Nibobee laden
    Von Blacky666 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 3
    Letzter Beitrag: 07.12.2010, 12:08
  5. USB-Programmierer vom Nibobee
    Von Silver-Drago im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 06.11.2010, 01:39

Berechtigungen

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

12V Akku bauen