;---------------------------------------------------------------------------- ; Definition der Arbeitsregister und Variablen ;---------------------------------------------------------------------------- .def SRAM_register = r18 ;.equ buffersize = 64 ;---------------------Unterprogramme zur Nutzung des SRAM--------------------- init_buffer: ldi XL, low(buffer) ; read-Pointer ldi XH, high(buffer) ldi YL, low(buffer) ; write-Pointer ldi YH, high(buffer) ret write_SRAM: push temp1 push temp2 push temp3 ; write_zeiger +1 movw temp2:temp1, YH:YL clz inc temp1 brbc 1, no_high_inc ; branches if zero flag cleared Überlauf? inc temp2 no_high_inc: cp temp1, XL ; (write_zeiger +1 == read_zeiger) cpc temp2, XH ; write_zeiger würde read_zeiger überholen breq no_reset_PointerY ; (write_zeiger+1 == max. Pufferadresse) && (read_zeiger == 0) cpi temp1, low(buffer+buffersize) ldi temp3, high(buffer+buffersize) cpc temp2, temp3 brne write_to_SRAM cpi XL, low(buffer) ; (read_zeiger == 0) ldi temp1, high(buffer) cpc XH, temp1 breq no_reset_PointerY write_to_SRAM: in temp1, UDR ; UART Daten lesen und in SRAM schreiben st Y+, temp1 cpi YL, low(buffer+buffersize) ; Startadresse d. Buffer + Länge d. Buffer ldi temp1, high(buffer+buffersize) ; vergleiche mit der maximalen SRAM Adresse cpc YH, temp1 brne no_reset_pointerY ; wenn ungleich, springen ldi YL, low(buffer) ; wenn gleich, Zeiger zurücksetzen ldi YH, high(buffer) no_reset_PointerY: pop temp3 pop temp2 pop temp1 ret read_SRAM: push temp1 cp YL, XL cpc YH, XH breq no_reset_pointerX ; Lese- auf Schreibezeiger --> Lesen nicht sinnvoll ; Lesezeiger nicht erhöhen ld SRAM_register, X+ cpi XL,low(buffer+buffersize) ; Startadresse d. Buffer + Länge d. Buffer ldi temp1,high(buffer+buffersize) ; vergleiche mit der maximalen SRAM Adresse cpc XH,temp1 brne no_reset_pointerX ; wenn ungleich, springen ldi XL,low(buffer) ; wenn gleich, Zeiger zurücksetzen ldi XH,high(buffer) no_reset_pointerX: pop temp1 ret