.include "m128def.inc" .equ clock = 14745600 ; .equ BAUD1 = 9600 .equ UBRRVAL = CLOCK/(BAUD1*16)-1 .def temp1 = r16 ; allgemeines temp Register, zur krufristigen Verwendung .def temp2 = r17 ; Register für 24 Bit Addition, Lowest Byte .def temp3 = r18 ; Register für 24 Bit Addition, Middle Byte .def temp4 = r19 ; Register für 24 Bit Addition, Highest Byte .def adlow = r20 ; Ergebnis vom ADC / Mittelwert der 256 Messungen .def adhigh = r21 ; Ergebnis vom ADC / Mittelwert der 256 Messungen .def messungen = r22 ; Schleifenzähler für die Messungen .def ztausend = r23 ; Zehntausenderstelle des ADC Wertes .def tausend = r24 ; Tausenderstelle des ADC Wertes .def hundert = r25 ; Hunderterstelle des ADC Wertes .def zehner = r26 ; Zehnerstelle des ADC Wertes .def zeichen = r27 ; Zeichen zur Ausgabe auf den UART .def buffer = r28 ;rs232 ldi temp1, LOW(RAMEND) ; Stackpointer initialisieren out SPL, temp1 ldi temp1, HIGH(RAMEND) out SPH, temp1 ;UART Initalisierung ; Baudrate einstellen ldi temp1, LOW(UBRRVAL) sts UBRR1L, temp1 ldi temp1, HIGH(UBRRVAL) sts UBRR1H, temp1 ; TX1 aktivieren ldi temp1, (1< nächsten Wert einlesen ; Aus den 256 Werten den Mittelwert berechnen ; Bei 256 Werten ist das ganz einfach: Das niederwertigste Byte ; (im Register temp2) fällt einfach weg ; ; allerdings wird der Wert noch gerundet cpi temp2,128 ; "Kommastelle" kleiner als 128 ? brlo no_round ; ist kleiner ==> Sprung ; Aufrunden subi temp3, low(-1) ; addieren von 1 sbci temp4, high(-1) ; addieren des Carry no_round: ; Ergebnis nach adlow und adhigh kopieren ; damit die temp Register frei werden mov adlow, temp3 mov adhigh, temp4 ;in ASCII umwandeln outp: ldi ztausend, -1 + '0' _a6ser: inc ztausend subi adlow, low(10000) ; -10,000 sbci adhigh, high(10000) brcc _a6ser ldi tausend, 10 + '0' _a7ser: dec tausend subi adlow, low(-1000) ; +1000 sbci adhigh, high(-1000) brcs _a7ser ldi hundert, -1 + '0' _a8ser: inc hundert subi adlow, low(100) ; -100 sbci adhigh, high(100) brcc _a8ser ldi zehner, 10 + '0' _a9ser: dec zehner subi adlow, -10 ; +10 brcs _a9ser subi adlow,-'0' ;an UART Senden mov zeichen, ztausend ; Zehntausender Stelle rcall transmit mov zeichen, tausend ; Tausender Stelle ausgeben rcall transmit mov zeichen, hundert ; Hunderter Stelle ausgeben rcall transmit mov zeichen, zehner ; Zehner Stelle ausgeben rcall transmit mov zeichen, adlow ; Einer Stelle ausgeben rcall transmit ldi zeichen, 13 ; CR rcall transmit ldi zeichen, 10 ; LF rcall transmit rjmp Main transmit: ; Wait for empty transmit buffer lds buffer, UCSR1A sbrs buffer, UDRE1 rjmp transmit sts UDR1, zeichen ret