- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 38

Thema: ACS an NIBObee

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #21
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    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!

Ä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
  •  

LiFePO4 Speicher Test