- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 13 von 13

Thema: ADC Sharp Ir Problem

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Anzeige

    Praxistest und DIY Projekte
    ... dass du irgendwie die Werte angezeigt ...
    In ähnlichen Fällen, aber GENAU bei meinen ersten Sharp-Distanzsensor-Erfahrungen, hatte ich nen Servo als "Zeigerinstrument" vom Sharp aus gesteuert. Wenn ich ne 8-Bit-Wandlung nehme, kann ich den Servo ziemlich easy direkt bedienen. Ich messe allerdings nicht selten mit dem DMM oder Oskar nach, ob die analoge Ausgabe des Sharps glaubhaft ist . . . .
    Ciao sagt der JoeamBerg

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Ich bekomme das UART einfach nicht zum laufen hier ist mal der Code:

    Code:
      /*
      * SMARTINIUS.c
      *
      * Created: 26.07.2011 00:17:22
      *  Author: Martinius
      */ 
     #define F_CPU 16000000
    #define BAUD 9600UL      // Baudrate
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
    #endif 
    
     #include <avr/io.h>
     #include <util/delay.h>
     #include <avr/interrupt.h> 
      char s[7];
     const int FWD = 1; // Definition der Richtungswerte
    const int STOP = 0;
    const int BWD = 2;
    const int ON = 1; //andere Werte
    const int OFF = 0;
    const int Left = 2;
    const int Right = 1;
    const int Enable = 1;
    const int Disable = 0;
    const int Reset = 2;
    const float A = 11.925;
    const float BL = 0.660;
    const float BR = 0.610;
    const float ADCconst = 00.04883;
     
     void Setup(void){ // Stellt den Controller für das nachfolgende Programm ein
                         // muss immer als erstes aufgerufen werden.
      UBRRH = UBRR_VAL >> 8;
      UBRRL = UBRR_VAL & 0xFF;
     
      UCSRB |= (1<<TXEN);  // UART TX einschalten
      UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
    
     DDRC |= (1<<PC7); // Status LED
     DDRB |= (1<<PB0); // IR_Eable
     DDRA &= ~(1<<PA0); // IR_Left
     DDRA &= ~(1<<PA1); // IR_Right
     ADMUX |= (1<<REFS0);//Reverrenzspannungsquelle des ADC wird festgelegt
     ADCSRA = (1<<ADPS1) | (1<<ADPS2);     // Frequenzvorteiler
     ADCSRA |= (1<<ADEN);                  // ADC aktivieren
     ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
     while (ADCSRA & (1<<ADSC) ) {}        // auf Abschluss der Konvertierung warten 
     }
     
     void Status_LED(uint8_t Status){
     if(Status == 1){
     PORTC |= (1<<PC7);
     }
     if(Status == 0){
     PORTC &= ~(1<<PC7);
     }
     }
    int uart_putc(unsigned char c)
    {
        while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
        {
        }                             
     
        UDR = c;                      /* sende Zeichen */
        return 0;
    }
    void uart_puts (char *s)
    {
        while (*s)
        {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
            uart_putc(*s);
            s++;
        }
    }
     uint16_t get_Ir_Distance (uint8_t Dir){ // Distance in mm
     if(Dir==1){//Right
       float x;
       ADMUX = (ADMUX & ~(0x1F)) | (1 & 0x1F);
       ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
       while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
       x = ADCW;
       x = x*ADCconst;
       x = x-BL;
       x = A/x;
       x = x*10
      uart_puts( itoa( x, s, 10 ) );
       return x;                    // ADC auslesen und zurückgeben
     }
     
     if(Dir==2){//Left
       float x;
       ADMUX = (ADMUX & ~(0x1F)) | (0 & 0x1F);
       ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
       while (ADCSRA & (1<<ADSC) ) {}  // auf Abschluss der Konvertierung warten
       x = ADCW;
       x = x*ADCconst;
       x = x-BL;
       x = A/x;
       x = x*10;
      uart_puts( itoa( x, s, 10 ) );
       return x;
       
     }
    return 0;
     }
     void Ir_Enable(uint8_t Status){
     if (Status == 1){
     PORTB |= (1<<PB0);
     }
     if(Status == 0){
     PORTB &= ~(1<<PB0);
     }
     }
     int main(void)
     {
     Setup();
     
     Ir_Enable(ON);
     
         while(1){
         drive_ahead();
         if(get_Ir_Distance(Right)<2000){
         Status_LED(ON);
         }
         if(get_Ir_Distance(Left)< 2000){
         Status_LED(ON);
         }
         }
     }
    MfG Martinius

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Ich habe das Problem gefunden da ich den Sensor immer erst eingeschaltet habe beim reset gab es immer einen sehr kleine spannungs einbruch den
    das Programm nätürlich sofort erkant hat.
    MfG Martinius

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Problem mit Sharp Sensor 2Y0A02
    Von juergen009 im Forum Sensoren / Sensorik
    Antworten: 5
    Letzter Beitrag: 01.10.2010, 13:26
  2. IR Sensor SHARP GP1U52 40KHz Problem!
    Von Oliver Preußger im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 27.02.2006, 22:40
  3. Unterschied SHARP GP2D12 zu SHARP GP2Y0A21YK
    Von java-robotik im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 25.02.2006, 09:30
  4. Problem mit Sharp Sensor GP2d120
    Von patti16 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 12.02.2006, 17:51
  5. Unterschied zwischen SHARP GP2D12 und SHARP GP2Y0A21YK
    Von Foooob im Forum Sensoren / Sensorik
    Antworten: 11
    Letzter Beitrag: 15.05.2005, 20:43

Berechtigungen

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

12V Akku bauen