ADC_Kanal0: push r16 ldi r16, 0x20 out ADMUX, r16 pop r16 ret ADC_Kanal1: push r16 ldi r16, 0x21 out ADMUX, r16 pop r16 ret ADC_Kanal2: push r16 ldi r16, 0x22 out ADMUX, r16 pop r16 ret DisableADC: cbi ADMUX, ADEN ret EnableADC: sbi ADMUX, ADEN ret EndADC: nop ret StartADC: sbi ADCSRA, ADSC ;Starte ADC Zwischen1: sbis ADCSRA, ADSC ;Warte bis Messung fertig ist ret rjmp Zwischen1 PRESCALEReq128: sbi ADCSRA, ADPS0 sbi ADCSRA, ADPS1 sbi ADCSRA, ADPS2 ret Read_EEPROM: sbic EECR,EEWE ;prüfe ob ein vorheriger Schreibzugriff ;beendet ist rjmp Read_EEPROM ;nein, nochmal prüfen out EEARH, ZH ;Adresse laden out EEARL, ZL sbi EECR, EERE ;Lesevorgang aktivieren ret Write_EEPROM: push r17 sbic EECR, EEWE ; prüfe ob der letzte Schreibvorgang beendet ist rjmp Write_EEPROM ; wenn nein, nochmal prüfen out EEARH, ZH ; Adresse schreiben out EEARL, ZL ; out EEDR,r25 ; Daten schreiben in r17,SREG ; SREG sichern cli ; Interrupts sperren, die nächsten sbi EECR,EEMWE ; Schreiben vorbereiten sbi EECR,EEWE ; Und los ! out SREG, r17 ; SREG wieder herstellen pop r17 ret Wait1: push r16 push r17 push r18 ldi r16, 255 ldi r17, 255 ldi r18, 50 Wr: dec r16 brne Wr dec r17 brne Wr dec r18 brne Wr pop r18 pop r17 pop r16 ret Wait3: push r16 push r17 push r18 ldi r16, 255 ldi r17, 255 ldi r18, 130 Wr12: dec r16 brne Wr12 dec r17 brne Wr12 dec r18 brne Wr12 pop r18 pop r17 pop r16 ret ;Division################################################################ Division: .def Ergebnis = r30 .def Rest = r31 push r16 push r17 push r18 mov r16, r30 ; Dividend(r30 und r31 sind am Anfang Parameter für Divisor und divident) mov r17, r31 ; Divisor clr r30 clr r31 ; Division r16 : r17 ldi r18, 8 ; 8 Bit Division clr Rest ; Register für die Zwischenergebnisse / Rest clr Ergebnis ; Ergebnis divloop: lsl r16 ; Zwischenergebnis mal 2 nehmen und das rol Rest ; nächste Bit des Dividenden anhängen lsl Ergebnis ; das Ergebnis auf jeden Fall mal 2 nehmen,das hängt effektiv eine 0 an das Ergebnis an. ; Sollte das nächste Ergebnis-Bit 1 sein, dann wird diese 0 in Folge durch eine 1 ausgetauscht cp Rest, r17 ; ist der Divisor größer? brlo div_zero ; wenn nein, dann bleibt die 0 sbr Ergebnis, 1 ; wenn ja, dann jetzt die 0 durch eine 1 austauschen ... sub Rest, r17 ; ... und den Divisor abziehen div_zero: dec r18 ; das Ganze 8 mal wiederholen brne divloop; dividiere solange, bis ganze 8 Bit fertig ; in Ergebnis (r30) steht das Ergebnis der Division ; in Rest (r31) steht der bei der Division entstehende Rest pop r18 pop r17 pop r16 ret ; 4 Takte ;########################################################################