.include "m8def.inc" .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 ; hier geht das Programm los ldi temp1, LOW(RAMEND) ; Stackpointer initialisieren out SPL, temp1 ldi temp1, HIGH(RAMEND) out SPH, temp1 ;LCD Initalisierung rcall lcd_init rcall lcd_clear ; ADC initialisieren: Single Conversion, Vorteiler 128 ldi temp1, (1< nächsten Wert einlesen ; Aus den 256 Werten den Mittelwert berechnen ; Mathematisch eine Division durch 256 ; Da aber 2^8 = 256 ist ist da einfach durch das weglassen des niederwertigsten Bytes ; erreicht werden ; ; 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 ; Division durch mehrfache Subtraktion ldi ztausend, '0'-1 ; Ziffernzähler direkt als ASCII Code Z_ztausend: inc ztausend subi adlow, low(10000) ; -10,000 sbci adhigh, high(10000) ; 16 Bit brcc Z_ztausend subi adlow, low(-10000) ; nach Unterlauf wieder einmal addieren sbci adhigh, high(-10000); +10,000 ldi tausend, '0'-1 ; Ziffernzähler direkt als ASCII Code Z_tausend: inc tausend subi adlow, low(1000) ; -1,000 sbci adhigh, high(1000) ; 16 Bit brcc Z_tausend subi adlow, low(-1000) ; nach Unterlauf wieder einmal addieren sbci adhigh, high(-1000) ; +1,000 ldi hundert, '0'-1 ; Ziffernzähler direkt als ASCII Code Z_hundert: inc hundert subi adlow, low(100) ; -100 sbci adhigh, high(100) ; 16 Bit brcc Z_hundert subi adlow, low(-100) ; nach Unterlauf wieder einmal addieren sbci adhigh, high(-100) ; +100 ldi zehner, '0'-1 ; Ziffernzähler direkt als ASCII Code Z_zehner: inc zehner subi adlow, low(10) ; -10 sbci adhigh, high(10) ; 16 Bit brcc Z_zehner subi adlow, low(-10) ; nach Unterlauf wieder einmal addieren sbci adhigh, high(-10) ; +10 subi adlow, -'0' ; adlow enthält die Einer, Umwandlung in ASCII ;an LCD Senden mov zeichen, ztausend ; Zehntausender Stelle rcall lcd_data mov zeichen, tausend ; Tausender Stelle ausgeben rcall lcd_data mov zeichen, hundert ; Hunderter Stelle ausgeben rcall lcd_data mov zeichen, zehner ; Zehner Stelle ausgeben rcall lcd_data mov zeichen, adlow ; Einer Stelle ausgeben rcall lcd_data ldi zeichen, 13 ; CR, Carrige Return (Wagenrücklauf) rcall lcd_data ldi zeichen, 10 ; LF, Line Feed (Neue Zeile) rcall lcd_data rjmp Main lcd_data: push temp2 mov temp2, temp1 ; "Sicherungskopie" für ; die Übertragung des 2.Nibbles swap temp1 ; Vertauschen andi temp1, 0b00001111 ; oberes Nibble auf Null setzen sbr temp1, 1<