Gast
#106052
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
|
Anzeige
|
asm für poti am adc auslessen
Gast
#106052
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
Gast
#106053
- 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
Gast
#106054
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.
Gast
#106055
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
Gast
#106056
ach ja, und es handelt sich um einen 8515....
Gast
#106057
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;
}
}
Gast
#106058
Der 8515 hat doch gar keinen AD-Wandler. Weder der Classik noch der Mega. Am Port C liegt der Adressbus A8 bis A15. Michael
Gast
#106059
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
Gast
#106060
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
Gast
#106061
cooler link, danke...
Gast
#106062
und es funktioniert...sehr schön...
Gast
#106063
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
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|