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
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?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...
Lesezeichen