Forum: Mikrocontroller und Digitale Elektronik Suche SW üfr RS232 Ausgabe des ADC-Wertes


von Rudi (Gast)


Lesenswert?

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

von akw (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

> Ist Idiotensicher.

Die Foren auf dieser WebSite beweisen das Gegenteil :-)

von Björn W. (bwieck)


Lesenswert?

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
Noch kein Account? Hier anmelden.