- LiFePO4 Speicher Test         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 40 von 40

Thema: Auswertung/Funktionsweise des A/D Wandlers

  1. #31
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Anzeige

    Praxistest und DIY Projekte
    Hi Flite!
    Cooooooooooooooooooool!
    Juuuuuuuuuuhuuuuuuuuuu!
    *supermegafreu*

    Ich will mit meinem AVR den GP2D12 und den ADXL 202JE auswerten!
    Damit möchte ich mein JuFo-Projekt machen!

  2. #32
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    wow - genial!

    ich hab grade versucht dich per icq zu kontaktieren. Aber der Server von denen ist wohl grade down.

    Meine Nummer ist: 98927688

    Vielleicht klappts bei dir ja

    Viele Grüße
    Flite

  3. #33
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    So!
    Jetzt funktionierts!
    Danke an Flite nochmal!
    Wens interessiert, ein Video:
    http://www.cer-online.de/video/video.avi

  4. #34
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hi @ all!
    Ich habe nochmal zwei kleine Fragen!
    Wie kann ich den ADC Port z.B. von PC0 auf PC2 verlegen?
    Wie kann ich zwei oder mehr Ports "gleichzeitig" auswerten?

    Danke im Voraus!

  5. #35
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Hallo Florian,

    hier wird der Eingang bestimmt:

    Code:
    cbi ADMUX, MUX0 
    cbi ADMUX, MUX1 
    cbi ADMUX, MUX2
    mit cbi schreibst du einen Null, mit sbi eine Eins. Da du 2 ^ 3 Kombinationen hast, kannst du jeden der 8 Analogeingänge einlesen.

    Wenn du mehrere einlesen willst, musst du nach dem ersten die Einstellungen des AD Mux ändern, dann wieder lesen, dann wieder ändern, ...

    Da es nur einen AD wandler gibt, der mit einem Analog Multiplexer ausgestattet ist, kannst du nicht alle Werte auf einmal einlesen ...

    Grüße
    Flite

  6. #36
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hi Flite!
    Danke für Deine Hilfe!
    Ich dachte bisher immer, dass nur die C-Control einen gemultiplexten AD-Wandler hätte und deshalb so langsam wäre.
    Warum ist das beim AVR auch so, warum ist der aber nicht so langsam?
    Naja, danke nochmals!
    Ich hoffe, ich habe bald mein erstes Projekt mit den AD's fertig! *freu*

  7. #37
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hi @ all!
    Ich habe da ein kleines Problem!
    Ich habe schon einiges jetzt ausprobiert und es hat auch alles funktioniert, aber ich weiß nicht, wie man mehrere Werte nacheinander einlesen kann!
    Ich verstehe leider die Erklärung von Flite nicht! :
    Wenn du mehrere einlesen willst, musst du nach dem ersten die Einstellungen des AD Mux ändern, dann wieder lesen, dann wieder ändern, ...
    Kann mir das jemand (natürlich auch Flite) nochmal erklären, vielleicht an dem praktischen Beispiel das hier die ganze Zeit verwendet wird?

    Danke nochmals!

  8. #38
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.01.2004
    Alter
    40
    Beiträge
    255
    Hallo Florian,

    hier ein (hoffentlich) funktionierender Code für den Adwandler.

    Er liest die AD Ports 0 - 2 ein und schreibt die Werte je in ein eigenes Register. Der Code ist nicht optimiert (Speicherplatz / RAM) damit er übersichtlicher bleibt ...

    Hier der Code:
    Code:
    .include "4433def.inc" 
    .def temp = r16 
    .def ad_value = r17 
    .def ad_value0 = r18
    .def ad_value1 = r19
    .def ad_value2 = r20
    .def count = r21
    
    .org 0x000 
    rjmp init    ; Initialisierung / RESET 
    reti         ; IRQ0 
    reti         ; IRQ1 
    reti         ; Timer1 Capture 
    reti         ; Timer1 Compare 
    reti         ; Timer1 Overflow 
    reti         ; Timer0 Overflow 
    reti         ; SPI Complete 
    reti         ; UART Rx 
    reti         ; UART Data empty 
    reti         ; UART Tx 
    rjmp adc_int   ; ADC Conversion Complete 
    reti         ; EEPROM ready 
    reti         ; Analog Comparator 
    
    
    ; ################################ 
    ; Initialisierung 
    ; ################################ 
    
    init: 
    ; ################################ 
    ; Ports initialisieren (alle PINS INPUT - interne Pullups aktiviert) 
    ; ################################ 
    
    ldi temp, 0x00 
    out DDRB, temp 
    
    ldi temp, 0xFF 
    out PORTB, temp 
    
    ldi temp, 0x00 
    out DDRC, temp 
    
    ldi temp, 0xFF 
    out PORTC, temp 
    
    ldi temp, 0x00 
    out DDRD, temp 
    
    ldi temp, 0xFF 
    out PORTD, temp 
    
    ; ################################ 
    ; Stack initialisieren 
    ; ################################ 
    
    ldi temp, RAMEND 
    out SP, temp 
    
    ; ################################ 
    ; ADC initialisieren 
    ; ################################ 
    
    ; Multiplexer setzen - PC0 ist analoger Eingang 
    cbi ADMUX, MUX0 
    cbi ADMUX, MUX1 
    cbi ADMUX, MUX2 
    
    ; ADC Interrupt anschalten 
    sbi ADCSR, ADIE 
    
    ; Prescaler auf 16 setzen 
    cbi ADCSR, ADPS0 
    cbi ADCSR, ADPS1 
    sbi ADCSR, ADPS2 
    
    ; AD Converter anschalten 
    sbi ADCSR, ADEN 
    
    ; global Interrupts aktivieren 
    sei 
    
    ; Erste Wandlung auslösen 
    sbi ADCSR, ADSC 
    
    ; ################################ 
    ; Hauptprogramm 
    ; ################################ 
    
    ldi count, 0x00
    
    main: 
    ; Hier könnte nun der ad_value umgerechnet werden und über 
    ; UART oder LCD ausgegeben werden 
    rjmp main 
    
    
    ; ################################ 
    ; ADC Interrupt 
    ; ################################ 
    
    adc_int: 
    
    ; gewandelte Werte einlesen 
    in ad_value, ADCL 
    in temp, ADCH 
    
    ; zweimal nach rechts rotieren (um die beiden LSB 
    ; in das Low Register zu kriegen) -> 8 bit Wandlung 
    ror temp 
    ror ad_value 
    ror temp 
    ror ad_value 
    
    ; Count abfragen
      cpi count, 0x00
      breq count_0
      cpi count, 0x01
      breq count_1
      cpi count, 0x02
      breq count_2
    
    
    count_0:
    ; wenn Count = 0: count auf 1 setzen; ad_value in ad_value0 schreiben; mux auf 001 einstellen
    ldi count, 0x01
    mov	ad_value0, ad_value
    sbi ADMUX, MUX0 
    cbi ADMUX, MUX1 
    cbi ADMUX, MUX2 
    rjmp end
    
    count_1:
    ; wenn Count = 1: count auf 2 setzen; ad_value in ad_value1 schreiben; mux auf 010 einstellen
    ldi count, 0x02
    mov	ad_value1, ad_value
    cbi ADMUX, MUX0 
    sbi ADMUX, MUX1 
    cbi ADMUX, MUX2 
    rjmp end
    
    count_2:
    ; wenn Count = 2; count auf 0 setzen; ad_value in ad_value2 schreiben; mux auf 000 einstellen
    ldi count, 0x00
    mov	ad_value2, ad_value
    cbi ADMUX, MUX0 
    cbi ADMUX, MUX1 
    cbi ADMUX, MUX2 
    rjmp end
    
    end:
    ; neue Wandlung starten 
    sbi ADCSR, ADSC 
    
    reti
    Hoffe ich konnte helfen.

    Viele Grüße
    Flite

  9. #39
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    36
    Beiträge
    2.624
    Hi Flite!
    Also, ich habe die neuen GP2D12 endlich bekommen, sie sind angekommen! *juhuuuuuuuuuuu*
    Ich habe sie jetzt nach dem Datenblatt angeschlossen, an Pin 3 Vcc, 5 V und an Pin 2 GND, GND!
    Dann habe ich Pin 1 Vo an den ADC PC0 angeschlossen und mit bewährtem Code ausgewertet.
    Diese Sensoren werden 100%ig funktionieren (denke ich zumindest), aber irgendwie bekomme ich kein vernünftiges Signal!
    Die LED-Anzeige zeigt keine/kaum Veränderung!
    Sie steht bei 01101011!
    Wenn ich meine Hand bei etwa 10 cm halte leuchtet die Anzeige so auf, 11101011! Nur Bit 0 leuchtet heller!
    Aber auch nur bei 10cm!
    Sonst ändert sich nichts!
    Woran kann das liegen?
    Der Code funktioniert ansonsten perfekt!

    Kannst Du, oder wer anderes helfen?
    Normalerweise soll der Sensor zwischen 0,4 und 2,8 V ausgeben!
    Wenn ich jetzt Vo an mein Multimeter anschliße und dessen 2. Stecker an GND, dann stimmen die Werte!
    Kann es sein, dass der Messbereich 5 V à 8bit zu groß bzw. zu klein ist?
    Ich habe mal was von einem eingebauten Vref von 2,56 V gehört!
    Wie kann ich den einschalten???

    Ich bin jetzt eine Woche im Urlaub (ich nehme meinen Bot und die Sharps mit), aber ich werde versuchen alle paar Tage mich an den PC im Computerraum zu setzen und online zu kommen!

    Danke für Deine/Eure Hilfe!

  10. #40

    Re: AD-Wandler

    Hi @all,

    bei einigen µC kann man auch das Bit "ADLAR" setzen welches dann das Ergebnis "Links" ausrichtet.

    Vorteil man spart das 2x nach Rechtsgeschiebe
    einfach nur ADCH auslesen statt ADCL & ADCH

    bsp alt. (ohne ADLAR):

    in xl, ADCL
    in xh, ADCH

    ror xh
    ror xl
    ror xh
    ror xl

    mov r16, xl

    bsp neu (mit ADLAR):

    in r16, ADCH

    Gruß Dennis

    P.S: Was ich leider auch noch nicht so richtig weis,
    wie rechnet man dann mit den ganzen ergebnissen vernünftig...

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

12V Akku bauen