Warum muss es Assembler sein?
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
Warum muss es Assembler sein?
Grüße
Thomas
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
Bei Bascom hätt ich helfen können...
Grüße
Thomas
Es sind 4 Messungen, da man dann keine Divisionsroutine benötigt, sondern nur zweimal rechts schieben muss.
Den Rest solltest Du selbst zusammenbringen.
Code:.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
Geändert von MagicWSmoke (01.09.2012 um 22:34 Uhr)
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
Bitte.
Macht man mit CPI/CPC.Aber die Ergebnisse im Reg. R18/19 müssen ja auch ausgewertet werden.
Die Hoffnung auf und Suche nach Jemanden der's Dir schreibt, wird Dich auch Zeit kosten.Und in der knappen zur Verfügung stehenden Zeit wird das für mich zu eng
Lesezeichen