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.