- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: Frage RN-Control 1.4 und Sharp GP2D12 (gelöst)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.11.2004
    Ort
    nähe Darmstadt
    Alter
    43
    Beiträge
    15

    Frage RN-Control 1.4 und Sharp GP2D12 (gelöst)

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich bräuchte mal ein wenig hilfe.
    Ich möchte an PORTA PIN 0 den Enfernungssensor GP2D12 anschließen.
    Wenn die Spannung größer wie 1V wird sollen die LED's 1..4 angehen.
    Habe auch ein Quellcode, verstehe aber nicht warum es nicht funktioniert.
    Mit den Tastern hat das geklappt.


    Code:
    #include <avr/io.h> 
    
    #define SYSCLK   16000000 
    
    void init(void); 
    unsigned char get_adc(void); 
    
    // Hauptprogramm 
    int main(void) 
    { 
       unsigned char w; 
       init(); 
        
       while(1) 
       { 
          /* Ergebnis auslesen und anzeigen */ 
          w = get_adc(); 
           
          if (w > 40) 
             PORTC = 0x70; 
          else 
             PORTC = 0x7f; 
       } 
        
       return 0;    
    } 
    
    /* 
     * Initialisierung des µC 
     */ 
    void init(void) 
    { 
       DDRA = 0x00;      // Port als Eingang deklarieren  
       PORTA = 0xff;
       
       DDRB = 0xff;      // Port als Ausgang deklarieren
       PORTB = 0x00; 
        
       DDRC = 0xff;      // Port als Ausgang deklarieren 
       PORTC = 0x00; 
        
       DDRD = 0xff;      // Port als Ausgang deklarieren
       PORTD = 0x00; 
        
       // Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis )  
       ADMUX = (1<<REFS0)|(1<<ADLAR); 
       ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
    } 
    
    unsigned char get_adc(void) 
    { 
       unsigned char i;
       /* ADC0 mit Vcc als Referenzspannung */ 
       ADMUX = (1<<REFS0)|(1<<ADLAR)|0x0e; 
        
       /* AD Wandler starten */ 
       ADCSRA |= (1<<ADSC); 
        
       /* Warten bis das Ergebniss zur Verfügung steht */ 
       while(!(ADCSRA & (1<<ADIF))); 
        
       /* Ergebnis auslesen und anzeigen */ 
       i = ADCH; 
        
       return i; 
    }
    Bitte helft mir.

    Im vorraus schon mal danke

    LG Jens

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    hab jetzt nur mal überflogen,
    was mir auffällt, ist die Zeile
    i = ADCH
    das ADC-Register ist ein 16-Bit Register, d.H. man muss immer beide auslesen, in der richtigen Reihenfolge, denn sonst kommen die Registerwerte duchreinander beim nächsten Auslesen !
    Also am besten gleich einen Integer Wert verwenden.

    Und ich denke die Pullups sollten in diesem Fall nicht aktiviert werden.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.11.2004
    Ort
    nähe Darmstadt
    Alter
    43
    Beiträge
    15
    habe die Pullups rausgenommen und
    lese das Register wie folgt aus: i = (4<<ADCH)|ADCL;
    Beim aufruf von get_adc setze ich i auf 0.
    Das funktioniert aber auch nicht.

    Habe jetzt folgenden Quellcode:
    Code:
    #include <avr/io.h> 
    
    #define SYSCLK   16000000 
    
    void init(void); 
    unsigned char get_adc(void); 
     
    // Hauptprogramm 
     
    int main(void) 
    { 
       unsigned char i; 
       init(); 
       
       while(1) 
       { 
          // Ergebnis auslesen und anzeigen
          i = get_adc(); 
           
          if (i != 0xff) 
             PORTC = ~(1<<i) & 0x7f; 
          else 
             PORTC = 0x7f; 
       } 
        
       return 0;    
    } 
    
    // Initialisierung des µC 
    void init(void) 
    { 
       DDRA = 0x00;      // Port als Eingang deklarieren ( A/D-Wandleer Eingänge ) 
       PORTA = 0x80;
       
       DDRB = 0xff;      // Port als Ausgang deklarieren
       PORTB = 0x00; 
        
       DDRC = 0xff;      // Port als Ausgang deklarieren 
       PORTC = 0x00; 
        
       DDRD = 0xff;      // Port als Ausgang deklarieren
       PORTD = 0x00; 
        
       // Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis )  
       ADMUX = (1<<REFS0)|(1<<ADLAR); 
       ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); 
    } 
    
    
    unsigned char get_adc(void) 
    { 
       unsigned char i, taste = 0xff;
       // ADC7 mit Vcc als Referenzspannung 
       ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07; 
        
       // AD Wandler starten *
       ADCSRA |= (1<<ADSC); 
        
       // Warten bis das Ergebniss zur Verfügung steht
       while(!(ADCSRA & (1<<ADIF))); 
        
       // Ergebnis auslesen und anzeigen
       i = ADCH; 
        
       if (i < 36) 
          taste = 4; 
       else if (i < 57) 
          taste = 3; 
       else if (i < 76) 
          taste = 2; 
       else if (i < 94) 
          taste = 1; 
       else if (i < 150) 
          taste = 0; 
        
       return taste; 
    }
    Wenn ich jetzt verschiedene Spannungen zwischen 0 und 2,3 Volt anlege, dann leuchtet auch die entsprechende LED. Schließe ich aber den GP2D12 an, dann passiert da nichts. Wieso denn dass? Ich messe aber mit einem Multimeter am gelben Kabel des Senors Spannungen zw. 0,3 und 2,5 V.


    Jens

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.06.2005
    Alter
    35
    Beiträge
    364
    Hat der Sensor und die RN-Control dan gleichen Masseanschluss?

Berechtigungen

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

Solar Speicher und Akkus Tests