Hallo, Ich bin wie so viele ein Newby, bin auf der Suche einer Software, die mir (so simpel wie das auch klingt) einen ADC eines ATMega16 (ist auf STK500 montiert) auf einRS232 (1N8,9600)gibt. Ich scheitere ein bisschen, da Tutorials mir immer nur Bruchstücken geben, uns mit der GCC dann mit intresanten Fehlermeldungen das Leben versauert. eventuell hat da jemand was in C, das man mal probieren könnte. Wäre euch sehr Dankbar. Rudi
Auch wenn mir viele dafür jetzt den Kopf abreißen werden: Benutz wenn du schnell das Programm brauchst einfach Bascom o.ä. Ist Idiotensicher. Sieht dann in etwa nur so aus do x = getadc(0) send x loop Geht für Anfäger echt fix und ohne viele Probleme. gruß
> Ist Idiotensicher.
Die Foren auf dieser WebSite beweisen das Gegenteil :-)
Untenstehendes sollte das tun was du wolltest...
Das hättest du auch trotz newbietums dir auch selber zusammensuchen
können.
Das ganze Konstrukt besteht eigentlich nur aus Codeteilen die hier in
den Foren schonmal veröffentlicht wurden...
Grüße
Björn
.include "m16def.inc" ;Definitionen für AtMega16
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def temp4 = r19
.def adlow = r20
.def adhigh = r21
.def temp5 = r22
.def temp6 = r23
.def temp7 = r24
.def temp8 = r25
.equ quartz = 3686400 ;für Standard STK500
.equ baud = 9600 ;Baudrate
;UART Initalisierung
sbi UCSRB, TXEN ; enable transmit
ldi temp1, quartz / (baud * 16) - 1
out UBRRL, temp1 ; BAUD Rate
; ADC initialisieren mit "Free Run" und Vorteiler 128
ldi temp1, 0 ; Kanal 0
out ADMUX, temp1
ldi temp1, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR)) + 7
out ADCSR, temp1
Main:
; neuen ADC-Wert lesen (Schleife - 256 mal)
SER_SCHLEIFE:
sbi ADCSRA, ADIF ; logisch "1" lscht ADIF flag !
SER_SCHLEIFE_w:
sbis ADCSR, ADIF ; warten bis ADIF flag gesetzt
rjmp SER_SCHLEIFE_w
; ADC einlesen:
in adlow, ADCL ; immer zuerst LOW Byte lesen
in adhigh, ADCH ; danach das mittlerweile gesperrte High Byte
; alle 256 ADC-Werte addieren
add temp2,adlow ; addieren
adc temp3,adhigh ; addieren über Carry
adc temp4,temp1 ; addieren über Carry
dec temp5 ; Schleifenzhler MINUS 1
brne SER_SCHLEIFE ; ==> SCHLEIFE
; MITTELWERT-BERECHNUNG (Prüfung der "Kommastelle" temp2)
cpi temp2,128 ; "Kommastelle" kleiner als 128 ?
brlo SER_MITTELWERT_w ; ist kleiner ==> Sprung
; Aufrunden
ldi adlow,1 ; =1
add temp3,adlow ; addieren von 1
adc temp4,temp1 ; addieren ber Carry
SER_MITTELWERT_w:
; Ergebnis nach adlow und adhigh kopieren
mov adlow,temp3
mov adhigh,temp4
;in ASCII umwandeln
ldi temp5, -1 + '0'
_a6ser: inc temp5
subi adlow, low(10000) ;-10,000
sbci adhigh, high(10000)
brcc _a6ser
ldi temp6, 10 + '0'
_a7ser: dec temp6
subi adlow, low(-1000) ;+1000
sbci adhigh, high(-1000)
brcs _a7ser
ldi temp7, -1 + '0'
_a8ser: inc temp7
subi adlow, low(100) ;-100
sbci adhigh, high(100)
brcc _a8ser
ldi temp8, 10 + '0'
_a9ser: dec temp8
subi adlow, -10 ;+10
brcs _a9ser
subi adlow,-'0'
;an UART Senden
mov temp1, temp5
rcall transmit
mov temp1, temp6
rcall transmit
mov temp1, temp7
rcall transmit
mov temp1, temp8
rcall transmit
mov temp1, adlow
rcall transmit
ldi temp1,13 ;CR
rcall transmit
ldi temp1,10 ;LF
rcall transmit
rjmp Main
transmit:
sbis UCSRA,UDRE ; Warten, bis UDR bereit ist
rjmp transmit
out UDR, temp1
ret
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.