

; Verzweigung zum Bootloader
.org $0000
	rjmp  $03B0     

; Kalibrierprogramm
.org $0001			

; Counts fr 1/4800 s (=208,3 us) anzeigen
; Frequenz 4 MHz
; Timer /8 Zhlzykluszeit 2 us
; erwartet: 104 Zhlzyklen

	rjmp init

init:
        cbi	  UCSRB,4	;UCR=UCSRB=0x0B RXEN=Bit4 RX deaktivieren
	cbi	  UCSRB,3	;UCR=UCSRB=0x0B UDRE=Bit3 TX deaktivieren
        ldi r16, 255			; B als Ausgang
	out ddrb, r16
	out portb, r16
	cbi ddrd, rxd1			; PortD,0 auf Eingang
	cbi portd, rxd1			; low
	sbi ddrd, txd
	sbi portd, txd

anfang:
	ldi r16, 2
	out tccr0B, r16			;Timer init auf /8 (an)

	ldi osccalzaehler, 1				;OSCCAL auf 1; dann bis 150 steigern
	out osccal, osccalzaehler

osccalschleife:
	ldi r16, 150			; max osccal = 150
	cp osccalzaehler, r16
	breq Anfang

warteAufD0low:				; zu Beginn ist Eingang high
    sbic PinD, rxd1
	rjmp warteAufD0low
	ldi r16,0
	out TCNT0, r16

warteAufD0high:
	sbis PinD, rxd1
	rjmp warteAufD0high

warteAufD0low2:
        sbic PinD, rxd1
	rjmp warteAufD0low2

	IN param, TCNT0
	cpi param, sollzyklenzahl
	out portb, osccalzaehler
	brge ausgabe			; wenn param >= sollzyklenzahl, dann ausgabe
	inc osccalzaehler
	out osccal, osccalzaehler

; Pause von 3 ms damit die restlichen Bits von "U" verpuffen; reichen auch 2
	rcall warte1ms
	rcall warte1ms
	rcall warte1ms

	rjmp osccalschleife		;


ausgabe: ; ins eprom:

; Pause von 3 ms damit die restlichen Bits von "U" verpuffen; reichen auch 2
	rcall warte1ms
	rcall warte1ms
	rcall warte1ms

	ldi r16, 0
	out tccr0b, r16		; Timer aus

        out portb, osccalzaehler
	cbi portd, txd		; Signal an PC (Startbit), soll als "Puffer nicht leer" gedeutet werden
	rcall warte1ms
	sbi portd, txd

weprom:
        sbic eecr, eewe		; warte bis (alter) Schreibzugriff beendet
	rjmp weprom

	ldi epromadresse, 127		; letzte Epromadresse
	out eear, epromadresse

	out eedr, osccalzaehler		; OSCCAL ins Epromregister
	sbi eecr, eemwe		; Schreibzugriff starten
	sbi eecr, eewe		; Schreibvorgang

ende:
	rjmp  anfang		; evtl. weitere komplette Kalibrierung

 
