PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Serviceleistung Suche Hilfe bei kleinem Projekt: ADC mit ATMEGA8 in Assembler



leoner
01.09.2012, 19:10
Hallo,

ich suche Unterstützung/Hilfe bei der Programmierung eines ATMEGA8. Genau geht es um die Programmierung
eines ADC Einganges am ATMEGA8.

Es gibt keine besonderen Anforderungen. Eingang 0 bis 5 V, Auflösung 8, besser 10 bit.
Es soll etwa 3 mal gemessen werden und dann der Mittelwert gebildet werden.
Der Meßzyklus soll aller 2 sec stattfinden. Alles zeitunkritisch.

Das Ergebnis wird dann mit einem Min-und Max Wert verglichen-und dann im Ergebnis des Vergleiches
Portpins gesetzt. (kann später besprochen werden).

Wer würde sich bereit erklären, mir dabei zu helfen. Ich habe schon mit Assembler programmiert, aber infolge
anderer Aufgaben konnte ich mich noch nicht in der ADC-Sache einarbeiten, außerdem wird die
Zeit knapp.

Über finanziellen Ausgleich etc. müssen wir dann reden.

Viele Grüße
leoner

Thomas E.
01.09.2012, 19:16
Warum muss es Assembler sein?

leoner
01.09.2012, 19:28
Hallo Thomas,

gute Frage.

nun, das Projekt ist bereits aufgebaut und im Einsatz (Test).

Ich habe es in Assembler geschrieben, so gut ich es eben konnte. Dabei habe ich die ADC-Sache testweise durch
einen Komparator hardewareseitig ersetzt. Das soll nun in der Finalvariante wegfallen.

Außerdem wäre es auch ein kleiner Lerneffekt für mich, schließlich kann es zu einem späteren Zeitpunkt zu Änderungen kommen,
die ich dann selbst erledigen könnte.

Ich weiß, in C dürfte es wesentlich besser zu programmieren sein.

Grüße
leoner

Thomas E.
01.09.2012, 19:43
Ich weiß, in C dürfte es wesentlich besser zu programmieren sein.
Bei Bascom hätt ich helfen können...

MagicWSmoke
01.09.2012, 21:10
Es sind 4 Messungen, da man dann keine Divisionsroutine benötigt, sondern nur zweimal rechts schieben muss.
Den Rest solltest Du selbst zusammenbringen.

.include "m8def.inc"

.equ chan = 0 ; adc-channel

.cseg
.org 0
rjmp start
reti

.org 0x13
start:
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, low(RAMEND)
out SPL, r16
rcall adc_init

mainloop:

rcall get_adc
; do something
rjmp mainloop

get_adc: ; returns averaged result out of 4 samples
clr r18 ; result in r18/r19
clr r19
ldi r17, 4 ; count of samples
in r16, ADMUX
andi r16, ~(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0)
ori r16, chan
out ADMUX, r16
get_sample:
sbi ADCSRA, ADSC ; start conversion
wait_adc:
sbic ADCSRA, ADSC
rjmp wait_adc ; wait for conversion ready
in r16, ADCL ; get result low byte
add r18, r16 ; add
in r16, ADCH ; get high byte
adc r19, r16 ; add with carry
dec r17 ; decrease sample counter
brne get_sample
lsr r19 ; shift result right = divide by 2
ror r18
lsr r19 ; same again, now divided by 4
ror r18
ret

adc_init:
ldi r16, (1<<ADEN)|(1<<ADPS2)|(1<<ADPS0) ; enable adc, adc-prescaler 32
out ADCSRA, r16
ldi r16, (1<<REFS0) ; ref is AVCC
out ADMUX, r16
ret

leoner
02.09.2012, 12:15
Hallo MagicWSmoke,

danke für den Code. Muss mich da aber erst mal reindenken. Aber die Ergebnisse im Reg. R18/19 müssen ja auch
ausgewertet werden. Das nächste Problem (für mich). Und in der knappen zur Verfügung stehenden Zeit wird das für mich
zu eng und letztendlich auch zu unsicher.

Also noch mal meine Bitte:

Wer kann dies programmieren? Genaue Details (Auswertung der Register etc.) müssen dann am besten per tel. Kontakt
ausgetauscht werden.

Grüße
leoner

MagicWSmoke
02.09.2012, 12:29
danke für den Code.
Bitte.

Aber die Ergebnisse im Reg. R18/19 müssen ja auch ausgewertet werden.
Macht man mit CPI/CPC.

Und in der knappen zur Verfügung stehenden Zeit wird das für mich zu eng
Die Hoffnung auf und Suche nach Jemanden der's Dir schreibt, wird Dich auch Zeit kosten.