.include "m8def.inc" .def temp = r16 .def Low_Byte = r17 .def High_Byte = r18 .def Sollwert = r19 .def Overflow_Zaehler = r20 .def Puls_Pause = r21 .org 0x0000 rjmp Initalisieren ; Reset Handler .org OVF0addr rjmp timer0_overflow ; Timer Overflow Handler ;--------------------------------------------------------------------------------------------------------------------------------------------------------- Initalisieren: ldi temp, LOW(RAMEND) ; Stackpointer initialisieren out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi Sollwert, 0b00110000 ; Sollwertregister Vorladen clr Puls_Pause ; Leert das Puls/Pause Register clr Overflow_Zaehler ; Leert den Overflow Zähler ldi temp, 0b00000010 ; PortB Pin1 auf Ausgang (Frequenz) out DDRB, temp ; schreiben ldi temp, 0b00000100 ; PortC Pin2 auf Ausgang (Spannung) out DDRC, temp ; schreiben ldi temp, 0b00000001 ; CS00 setzen: Teiler 1 (Overflowfrequenz = 15625 Hz) out TCCR0, temp ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow out TIMSK, temp sei ; Globales Interrupt Flag setzten ldi temp, 0b01100000 ; A/D Wandler initialisieren -> Internre Referenz Vcc; Ergebniss rechtsbündig; Kanal 0 (PC0) out ADMUX, temp ; schreiben ;--------------------------------------------------------------------------------------------------------------------------------------------------------- ldi temp, 0b11000101 ; ADC ein, starten, Taktteiler = 32 ( 4MHz/32 = 125kHz) out ADCSRA, temp ; schreiben Messung: sbic ADCSRA, ADSC ; Wenn Wandlung beendet (Daten bereit), wird nicht wieder... rjmp Messung ; ... zur "Messungs"-Schleife gesprungen. Einlesen: in Low_Byte, ADCL ; Ergebniss Low-Byte ins Low-Byte Register in High_Byte, ADCH ; Ergebniss High-Byte ins High-Byte Register Vergleichen: cp High_Byte, Sollwert ; Vergleicht Sollwert und das High-Byte der Messung brlo Laden ; Wenn Sollwert noch nicht erreicht wird zu "Laden" gesprungen, ansonsten Nicht_Laden: ; Wird´der Zwischenkreis nicht geladen, also... cbi PortC, 2 ; ...der Spannungsregler zurückgesetzt, ... sbi ADCSRA, ADSC ; ...eine neue Messung gestartet und... rjmp Messung ; ...wieder in die Messschleife gesprungen. Laden: ; Wenn der Sollwert noch nicht erreicht wurde wird der Zwischenkreis geladen: sbi PortC, 2 ; Der Spannungsregler wird gesetzt, ... sbi ADCSRA, ADSC ; ...eine neue Messung gestartet... rjmp Messung ; ...und wieder in die Messschleife gesprungen. ;--------------------------------------------------------------------------------------------------------------------------------------------------------- timer0_overflow: ; Timer 0 Overflow Handler com Puls_Pause ; Invertiert das Puls/Pause Register sbrs Puls_Pause, 0 ; Überspringt wenn Bit0 im Puls/Pause Register gesetzt ist. cbi PortB, 1 ; Setzt PortB Pin1 zurück. sbrc Puls_Pause, 0 ; Überspringt wenn Bit0 im Puls/Pause Register nicht gesetzt ist. sbi PortB, 1 ; Setzt PortB Pin1. reti ; Springt zurück