- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: ADC-Werte mit Codeschnipsel

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2006
    Beiträge
    15

    ADC-Werte mit Codeschnipsel

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo, ich habe mir die Codeschnipsel von muraad runtergeladen und aalles funktioniert auhc wunderbar mit einem Eingang, da ich aber 2 Sensoren (CNY70) habe möchte ich ständig die Werte von diesen in 2 unterschiedlichen integern speichern.

    Mein jetziger Code
    Code:
    int main(void) // Main-Funktion, d.h. dass was der Roboter macht!
    {
    init();
    warte(2000);
    
    unsigned int l; // ADC-Wert für linken Sensor
    unsigned int r; // ADC-Wert für rechten Sensor
    
       ADCinit;
       ADCchannel_init;
       //ADCfree;
       ADCvintern;
       //ADCinterrupt_on;
       ADCprescaler_16;
    
    while(1==1)
    {
    
       ADCchannel_1;
       ADCstart;
       l=getadc();
    
       ADCchannel_reset;
    
       ADCchannel_2;
       ADCstart;
       r=getadc();
    
    
    if (l>0 && l<8) // wenn schwarzer Untergrund
    L_Motor_v();
    
    if (l>=8) // wenn weißer Untergrund
    L_Motor_r();
    
    
    if (r>0 && r<8) // wenn schwarzer Untergrund
    R_Motor_v();
    
    if (r>=8) // wenn weißer Untergrund
    R_Motor_r();
    
    
    warte(10);
    }
    
    
    return 0;
    }
    Jedoch funktioniert dieser nicht.

    Bitte um schnelle Hilfe.

    PS: Hier noch die Defines aus dem Codeschnipsel:
    Code:
    /* Analog/Digital converting */
    #define ADCchannel_init   DDRA=0x00                 // ADC Port als Eingang deklarieren
    #define ADCinit           ADCSRA|=_BV(ADEN)         // Teilt dem Board mit, dass der jeweilige Port für ADC verwendet wird
    #define ADCdisable        ADCSRA &=~_BV(ADEN)       // mach das vorherige wieder rückgängig
    #define ADCstart          ADCSRA|=_BV(ADSC)         // startet eine Konvertierung auf dem gewünschten Kanal/Pin
    #define ADCfree           ADCSRA|=_BV(ADATE)        // schaltet den freilaufenden Modus ein
    #define ADCvintern        ADMUX|=_BV(REFS0)     	// interne Spannungsversorgung
    #define ADCinterrupt_on   ADCSRA|=_BV(ADIE)                // ADC interrupt wird freigeschaltet
    #define ADCprescaler_2    ADCSRA |=_BV(ADPS0)              // gewünschter Teilungsfaktor/Prescaler 
    #define ADCprescaler_4    ADCSRA|=_BV(ADPS1)
    #define ADCprescaler_8    ADCSRA=_BV(ADPS1) | _BV(ADPS0)
    #define ADCprescaler_16   ADCSRA|=_BV(ADPS2)
    #define ADCprescaler_32   ADCSRA=_BV(ADPS2) | _BV(ADPS0)
    #define ADCprescaler_64   ADCSRA=_BV(ADPS2) | _BV(ADPS1)
    #define ADCprescaler_128  ADCSRA=_BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0)
    #define ADCprescaler_reset ADCSRA = ~_BV(ADPS2) & ~_BV(ADPS1) & ~_BV(ADPS0)        
    #define ADCchannel_1                                      // gewünschter Kanal z.B bei ATmega32 PINA0 - PINA7
    #define ADCchannel_2      ADMUX|=_BV(MUX0)                // wenn kein Freilaufen-Modus muss ADCchannel_x vor ADCstart
    #define ADCchannel_3      ADMUX|=_BV(MUX1)                // kommen, dann kann man mit getadc() den 
    #define ADCchannel_4      ADMUX= _BV(MUX1) | _BV(MUX0)    // Adcwert des gewählten Kanals auslesen
    #define ADCchannel_5      ADMUX|=_BV(MUX2)
    #define ADCchannel_6      ADMUX= _BV(MUX2) | _BV(MUX0)
    #define ADCchannel_7      ADMUX= _BV(MUX2) | _BV(MUX1)
    #define ADCchannel_8      ADMUX= _BV(MUX2) | _BV(MUX1) | _BV(MUX0)
    #define ADCchannel_reset  ADMUX= ~_BV(MUX2) & ~_BV(MUX1) & ~_BV(MUX0)
    
    inline unsigned int getadc(void)
    {
       while (ADCSRA & _BV(ADSC)) {}
       return ADC;
    }

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Was funktioniert nicht? Welchen Kontroller verwendest du? Bist du dir sicher das der Fehler genau in den Codeschnipsel liegt die du gepostet hast?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2006
    Beiträge
    15
    Ich benutze das RN-Control 1.4 Board und ich kann es mithilfe von Schleifen nciht hinbekommen das sowohl der ADC-Wert von Channel1 als auch der von Channel2 ständig in einem integer gespeichert wird.

    Es sollen also ständig beide Spannungen der Sensoren umgewandelt werden in digitale Werte.

    Im Grunde habe ihc versucht erst den Wert des ersten Sensors zu speichern und dann den des 2., dann sollen die Motoren auf die Werte reagieren(Linienverfolgung) und dann soll wieder der 1. und dann der 2. ausgelesen werden usw...

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Was für einen Sensor wertet er aus? Keinen oder unregelmässig?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2006
    Beiträge
    15
    Er wertet einen CNY70 Optoreflexkopller aus der einfach nur seine Spannung ändert zwischen 0 und 5V. Als ich einfach nur 1 Sensor ausgewertet habe hat er die Werte im Integer immer wieder aktualisiert und halt mti dem Motor drauf reagiert, z.b wenn ich ein Stück Papier vor den Sensor gehalten habe.

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

    wo hast Du die Defines her, hab das jetzt nicht nachgerechnet mit den Bitmanipulationen, schaut aber erstmal komisch aus

    Vor dem ersten einstellen in der Schleife sollte dann wohl auch noch ein ADCchannel_reset stehen, sonst wird immer nur der 2. Kanal gemessen.

    Und so wie das ausschaut muss Du jedesmal den Prescaler neu setzen,
    aber ich glaub Du musst erstmal in jeder Zeile die Zuweisung der Bits gleich vornehmen, einmal mit einmal ohne | "oder", da kommt alles durcheinander.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2006
    Beiträge
    15
    Hmm also die defines sind von dem Forum hier aus der Download Sektion:

    https://www.roboternetz.de/phpBB2/dl...le&file_id=178

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Schau mal im Wiki auf die ADC (Avr) Seite, die ist im Moment auch auf der Hauptseite und verlinkt,
    da ist auch ein Beispiel drin, das sollte gehen.

    €dit:
    Da ist auf jeden Fall der Wurm drin in den Defines, ich würde jede Zeile mit | zuweisen !
    zB. bei ADCchannel_reset wird sonst die Referenzeinstellung gelöscht, falls nicht extern.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    27.07.2006
    Beiträge
    15
    Hmm ich habe jetzt einfach mal die Funktion ausm Wiki genommen, dort wird immer ein Datentyp uint16_t von der Funktion wiedergegeben, kann ich den einfach als normalen int benutzen??

    Edit:

    Vielen Dank der Code aus dem Wiki ist besser jetzt kann ich beide Sensoren gleichzeitig auslesen und die Motoren danach programmieren.
    Hat wunderbar ohne die Defs funktioniert.

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Schau dir in deinen defines den ADCannel_1 an, da ist nichts definiert

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus