- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 38

Thema: ACS an NIBObee

Hybrid-Darstellung

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

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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    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?

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    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!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    "Zugriff auf C:/Program Files (x86)/NIBObeeLib/src/nibobee/motpwm.c wurde verweigert." zum Beispiel

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Sollten sich die Dateien der Library nicht im AVR-Pfad befinden?

    C:\WinAVR\avr\include\nibobee
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    So, es klappt jetzt, nachdem ich den include-Ordner rüberkopiert habe. Allerdings funktioniert mein Programm immer noch nicht, wie es funktionieren sollte, könntest du noch einmal drübersehen?:
    Code:
    #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>
    #include <nibobee/base.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();
    	int16_t speed_l=0;
    	int16_t speed_r=0;
    	motpwm_setLeft(speed_l);
    	motpwm_setRight(speed_r);
    
        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] > 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));
    }

  8. #8
    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:
        while(1)
      	  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);
       }
    Wo werden die speed_x-Werte an die Antriebe übergeben?

    Hier stimmt es auch noch nicht:

    while(1==1) {

    und

    while(1)
    ACSData(data);

    Lese endlos die ACS-Daten ein...
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2011
    Alter
    29
    Beiträge
    104
    Ok, die beiden unteren Fehler habe ich gefunden, aber das mit den speed_x-Werte an die Antriebe übergeben, versteh ich nicht...

Ä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