hallo, suche ein kleines asm programm, das einen am adc angeschlossenen poti ausliest. habe hier nur was in C gefunden, was mir leider nichts bringt. danke, Sterili
- Datenblatt lesen, es gibt Unterschiede zwischen den AVR-Typen, - ADMUX setzen (Eingang wählen), - je nach AVR-Typ (siehe Datenblatt) ADC einschalten (anfangs am besten im Free-RUN-Modus), - ADCL auslesen, ADCH auslesen, - Werte verarbeiten... MfG, Heinz
Jep, gib mal ein paar mehr Infos, was Du genau vor hast. Je nach Anwendung kann es angenehmer sein, die Werte direkt auszulesen oder "nebenbei" in einer Interrupt-Routine. Letzteres bevorzuge ich.
okay, sorry, also ein bisschen klarer... möchte ganz ganz einfach nur die möglichst einfachste art und weise sehen, wie man einen linearen poti(4,7 k-ohm) der sagen wir mal an Port C angeschlossen ist ausliest. das ganze in asm, und lieber noch nicht mit interrupts, weil so weit bin ich noch nicht ;)...also ganz einfache loopschleife würde mir genügen. dank, und gruß, Michi
ich habe ein programm gefunden auf mc-project.de, dass glaub ich das macht was ich meine, ist leider blos in c..weiß da jemand ein assembler equivalent? #include <avr/io.h> int main (void) { int x = 0; ADCSRA = _BV(ADEN) | _BV(ADPS2); //Aktivierung des ADC, festlegen eines Prescalers von 32 --> 4Mhz/32=125kHz //Starten einer einzelnen Konvertierung //Start einer Wandlung for (;;) { ADMUX = _BV(MUX2); //Aktivierung des Pins PC5 (ADC5), an ihm soll die zu messende Spannung liegen ADCSRA |= _BV(ADSC); //Start einer Konvertierung while (ADCSRA & _BV(ADSC)) {} //warte, bis ADSC gelöscht wird --> Ende der Konvertierung x = ADC; } }
Der 8515 hat doch gar keinen AD-Wandler. Weder der Classik noch der Mega. Am Port C liegt der Adressbus A8 bis A15. Michael
Hehe, das kann dann natürlich nicht funktionieren ;)... wenn ich sagen wir eine ATmega16 in mein stk500 einsetze, den ich auch zuhause rumliegen habe, müsste es aber besser ausschauen (hab mich gerade informiert;)... weiß denn da jemand einen passenden einfachen "hallo welt" asm code? danke
Hallo Steril versuchs mal hiermit: http://www.elektronik-projekt.de/content/download/wie%20sag%20ichs%20meinem%20avr.pdf das steht auch was über ADC drinnen. Ist zwar für den 4433 aber ich mein mal das da kein so groser unterschied ist. mfg Max
so, hier der sourcecode für das ganze... poti an port a, leds an port b... + lookuptable für eine auf und abgehende 8-led leiste .include "m16def.inc" .def temp = r16 .def hibyte = r17 .def lobyte = r18 .def temp2 = r19 .def tabpos = r30 RESET: ;Z-Pointer ldi ZL, LOW(daten*2) ; Lo-Byte der Adresse in Z-Pointer ldi ZH, HIGH(daten*2) ; Hi-Byte der Adresse in Z-Pointer ldi R16, 0xFF out DDRB, R16 ; Port B als Ausgang konfiguriert ldi R16, 0x00 out DDRD, R16 ; Port D als Eingang konfiguriert ldi temp, 0xff out PORTB, temp ldi temp, 0 ; Kanal 0 des ADC aktiviert out ADMUX, temp ;Bits setzen ldi temp, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7 out ADCSR, temp loop: sbi ADCSR, ADIF ;(setze ADIF Bit im ADCSR Register) Wait1: sbis ADCSR, ADIF ;(Überspring nächsten Befehl wenn ADIF immer noch 1 ist) rjmp wait1 sbi ADCSR, ADIF ;(wenn ADIF-Bit weg dann nochmal: setze ADIF Bit im ADCSR Register) Wait2: sbis ADCSR, ADIF rjmp wait2 in lobyte, ADCL in hibyte, ADCH ;Wert nach 2x rechts rollen, um 8 bit wert zu erhalten statt 10 bit ror hibyte ror lobyte ror hibyte ror lobyte ; lobyte wert durch 32 (2 hoch 5) dividieren, ; um einen wert von 0 - 7 zu kriegen. ; erreicht man durch 5 mal linksschieben lsr lobyte lsr lobyte lsr lobyte lsr lobyte lsr lobyte mov temp2, lobyte ; diese schleife erhöht den zpointer solange, ; bis er an dem wert des lobyte angekommen ist. schleife: cpi temp2, 0 ;if temp=0 breq schleifeE: ;then goto schleifenEnde dec temp2 ;schleifenzähler -1 inc tabpos ;position erhöhen inc tabpos ;x2 !keine ahnung warum! rjmp schleife ;next schleifeE: lpm ; durch Z-Pointer adressiertes Byte nach R0 lesen mov temp, R0 ; nach temp kopieren com temp ; dieses invertieren out PORTB, temp ;und schlussendlich nach Port B rausgeben ldi ZL, LOW (daten*2) ; Z-Pointer Zurücksetzen ldi ZH, HIGH(daten*2) rjmp loop daten: .db 0b00000001 .db 0b00000011 .db 0b00000111 .db 0b00001111 .db 0b00011111 .db 0b00111111 .db 0b01111111 .db 0b11111111
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.