Hi Flite!
Cooooooooooooooooooool!
Juuuuuuuuuuhuuuuuuuuuu! ;-)
*supermegafreu* :lol:
Ich will mit meinem AVR den GP2D12 und den ADXL 202JE auswerten! :-)
Damit möchte ich mein JuFo-Projekt machen! :-)
Druckbare Version
Hi Flite!
Cooooooooooooooooooool!
Juuuuuuuuuuhuuuuuuuuuu! ;-)
*supermegafreu* :lol:
Ich will mit meinem AVR den GP2D12 und den ADXL 202JE auswerten! :-)
Damit möchte ich mein JuFo-Projekt machen! :-)
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
So!
Jetzt funktionierts!
Danke an Flite nochmal! :-)
Wens interessiert, ein Video:
http://www.cer-online.de/video/video.avi
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!
Hallo Florian,
hier wird der Eingang bestimmt:
mit cbi schreibst du einen Null, mit sbi eine Eins. Da du 2 ^ 3 Kombinationen hast, kannst du jeden der 8 Analogeingänge einlesen.Code:cbi ADMUX, MUX0
cbi ADMUX, MUX1
cbi ADMUX, MUX2
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
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*
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! :
Kann mir das jemand (natürlich auch Flite) nochmal erklären, vielleicht an dem praktischen Beispiel das hier die ganze Zeit verwendet wird?Zitat:
Wenn du mehrere einlesen willst, musst du nach dem ersten die Einstellungen des AD Mux ändern, dann wieder lesen, dann wieder ändern, ...
Danke nochmals! :-)
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:
Hoffe ich konnte helfen.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
Viele Grüße
Flite
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!
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...