Code:
;+----------------------------------------------------------------------
;| Title : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion : ...
;| Schaltung:
;eingänge: gehäuse temp portC5
; verdampfer temp 1 portC1
; verdampfer temp 2 portC2
; verdampfer temp 3 portC3
; verdampfer temp 4 portC4
; pumpsignal portC0
; leistungswahl 1 portB4
; leistungswahl 2 portB5
; fluidmangel portB3
;Ausgänge: pumpen1-2 portB1
; pumpen3-4 portB2
; lüfter portB0
; pumpen bereit1-2 portD2
; pumpen bereit3-4 portD3
; heizung 1 portD4
; heizung 2 portD5
; heizung 3 portD6
; heizung 4 portD7
;
;blinkreg: bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
; "blinkbit" - - - - - - -
;
;heizreg: bit7 bit6 bit5 bit4 bit3 bit2
; - - - heizen m.4 heizen m.3 heizen m.2
;
;pumpreg: bit7 bit6 bit5 bit4 bit3
; pumpen möglich 4 1.pumpen möglich 4 p.m.3 1.p.m.3 p.m.2
;+----------------------------------------------------------------------
;| Prozessor : ATmega8
;| Takt : 3,6864 MHz
;| Sprache : Assembler
;| Datum : 30.06.2007
;| Version : 1.5
;| Autor : Ulrich Betz
;+----------------------------------------------------------------------
.include "AVR.H"
.equ blinkreg, 0x14 ;r20 als variable (register für blink
.equ heizreg, 0x15 ;r21 als variable (register für heizf
.equ pumpreg, 0x16 ;r22 als variable (register für pumpf
.equ lotemp, 0x17 ;r23 als variable (untere temperatur)
.equ midtemp, 0x18 ;r24 als variable (mitlere temperatur
.equ hitemp, 0x19 ;r25 als variable (obere temperatur)
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
rjmp ontimer ;10 TC0 Overflow
hystereseversuch.s, Seite 1 von 8
reti ;11 SPI, STC Serial Transfer Complet
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ;initialisiere stack
ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
;initialsiere I/O Register
ldi r16, 0b00000111 ;portB5,B4,B3 als eingang portB2,B1,
out DDRB, r16
ldi r16, 0b00111000 ;pull up für portB5,B4,B3, ausgänge
out PORTB, r16
ldi r16, 0b11111100 ;portD7,D6,D5,D4,D3,D2 als ausgang
out DDRD, r16
;initialisierung timer0
ldi r16, 0b00000101 ;maskiere timer0
out TCCR0, r16
ldi r16, 0b00000001 ;konfiguriere
out TIMSK, r16 ;interrupt auslösen
;initialisierung ADC
ldi r16, 0b00000001 ;ADC channel 1
out ADMUX, r16 ;portC1 ADC channel 1
ldi r16, 0b10000101 ;ADC ein und 115KHz taktrate
out ADCSRA, r16 ;single step
;initialisierung UART
sbi UCSRB, 3 ;TX aktivieren
ldi r16, 23
out UBRRL, r16 ;baudrate 9600 einstellen
;Temperatur Vergleichswerte (Schaltpunkte)
ldi lotemp, 140 ;unterer schaltpunkt
ldi midtemp, 180 ;mitlerer schaltpunkt
ldi hitemp, 240 ;oberer schaltpunkt
ldi pumpreg, 0
ldi heizreg, 0
ldi r18, 0
ldi r19, 0
sei
;------------------------------------------------------------------------
mainloop:
sbis PINB, 4 ;skip wenn LWahl-1 nicht gewählt B4=l
rjmp tempabfr12
cbi PORTD, 4 ;heizen 1 off
cbi PORTD, 5 ;heizen 2 off
cbi PORTB, 1 ;pumpen 1-2 off
cbi PORTD, 2 ;pumpen 1-2 led off
rjmp LWahl2
tempabfr12: rcall tempabfrage12 ;unterprogrammaufruf
sbis PINB, 3 ;skip wenn kein fluidmangel B3=logisc
rjmp pump12off
sbrs pumpreg, 0 ;skip wenn 1pumpen 1 möglich
rjmp pump12off
sbrs pumpreg, 1 ;skip wenn pumpen 1 möglich
hystereseversuch.s, Seite 2 von 8
rjmp pump12off
sbrs pumpreg, 2 ;skip wenn 1pumpen 2 möglich
rjmp pump12off
sbrs pumpreg, 3 ;skip wenn pumpen 2 möglich
rjmp pump12off
;rcall pump12
rjmp LWahl2
pump12off: cbi PORTD, 2 ;portD2 logisch 0 , "1-2 bereit led"
cbi PORTB, 1 ;pumpen 1-2 off
LWahl2: sbis PINB, 5 ;skip wenn LWahl-2 nicht gewählt B5=l
rjmp tempabfr34
cbi PORTD, 6 ;heizen 3 off
cbi PORTD, 7 ;heizen 4 off
cbi PORTB, 2 ;pumpen 3-4 off
cbi PORTD, 3 ;pumpen 3-4 led off
rjmp mainloop
tempabfr34: rcall tempabfrage34 ;unterprogrammaufruf
sbis PINB, 3 ;skip wenn kein fluidmangel B3=logisc
rjmp pump34off
sbrs pumpreg, 4 ;skip wenn 1pumpen 3 möglich
rjmp pump34off
sbrs pumpreg, 5 ;skip wenn pumpen 3 möglich
rjmp pump34off
sbrs pumpreg, 6 ;skip wenn 1pumpen 4 möglich
rjmp pump34off
sbrs pumpreg, 7 ;skip wenn pumpen 4 möglich
rjmp pump34off
;rcall pump34
rjmp mainloop
pump34off: cbi PORTD, 3 ;portD3 logisch 0 , "3-4 lereit led"
cbi PORTB, 2 ;pumpen 3-4 off
rjmp mainloop
;------------------------------------------------------------------------
tempabfrage12:
push r16
push r17
lds r16, 0x61 ;Twert1 aus sram laden
lds r17, 0x62 ;Twert2 aus sram laden
cp r16, hitemp
brlo heizenon
cbi PORTD, 4
rjmp ende1
heizenon: cp r16, midtemp
brsh ende1
sbi PORTD, 4
ende1: cp r17, hitemp
brlo heizenon2
cbi PORTD, 5
rjmp ende2
heizenon2: cp r17, midtemp
brsh ende2
sbi PORTD, 5
ende2: pop r16
pop r17
ret
;-------------------------------------------------------------------------
tempabfrage34:
push r16
push r17
lds r16, 0x63 ;Twert3 aus sram laden
lds r17, 0x64 ;Twert4 aus sram laden
hystereseversuch.s, Seite 3 von 8
cp r16, hitemp
brlo heizenon3
cbi PORTD, 6
rjmp ende3
heizenon3: cp r16, midtemp
brsh ende3
sbi PORTD, 6
ende3: cp r16, hitemp
brlo heizenon4
cbi PORTD, 7
rjmp ende4
heizenon4: cp r16, midtemp
brsh ende4
sbi PORTD, 7
ende4: pop r16
pop r17
ret
;----------------------------------------------------------------------------
;
;versuchstext
ontimer:
;Twert1 einlesen
wertelesen: push r16
push r20
ldi r20, 0
loop0: inc r20 ;zähler +1
ldi r16, 0b00000000 ;ADC channel 0
out ADMUX, r16 ;portC1 ADC channel 0
sbi ADCSRA, 6 ;starte nächste konvertierung
warten0: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
rjmp warten0
in r26, ADCL ;low-teil auslesen
in r27, ADCH ;high-teil auslesen
add r18, r26
adc r19, r27
cpi r20, 16 ;zähler =16?
brne loop0 ;wenn nicht dann geh zu loop0
;wert durch 16 teilen
clc ;carry flag löschen
ror r19 ;high byte durch zwei teilen, übertra
ror r18 ;carry links einschieben und durch zw
clc ;carry für nächste teilung löschen
ror r19
ror r18
clc
ror r19
ror r18
clc
ror r19
ror r18
clc
;.................... ;10 bit zu 8 bit auflösung, alle bits
asr r19 ;schiebe bit 0 des high-teils ins C-F
ror r18 ;schiebe alle bits nach rechts, C-Fla
hystereseversuch.s, Seite 4 von 8
asr r19 ;schiebe nächstes bit des high teils
ror r18 ;schiebe alle bits nach rechts, C-Fla
sts 0x60, r18 ;r18 in sram speichern
;werte senden
putChar0: sbis UCSRA, 5 ;bit 5 = UDR empty
rjmp putChar0 ;warten bis UDR bereit
out UDR, r18 ;senden
;werte senden ende
ldi r18, 0 ;werteregister lo-teil zurücksetzen
ldi r19, 0 ;werteregister hi-teil zurücksetzen
ldi r20, 0 ;zähler zurücksetzen
loop1: inc r20 ;zähler +1
ldi r16, 0b00000001 ;ADC channel 1
out ADMUX, r16 ;portC1 ADC channel 1
sbi ADCSRA, 6 ;starte nächste konvertierung
warten1: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
rjmp warten1
in r26, ADCL ;low-teil auslesen
in r27, ADCH ;high-teil auslesen
add r18, r26
adc r19, r27
cpi r20, 16 ;zähler =16?
brne loop1 ;wenn nicht dann geh zu loop0
;wert durch 16 teilen
clc ;carry flag löschen
ror r19 ;high byte durch zwei teilen, übertra
ror r18 ;carry links einschieben und durch zw
clc ;carry für nächste teilung löschen
ror r19
ror r18
clc
ror r19
ror r18
clc
ror r19
ror r18
clc
;.................... ;10 bit zu 8 bit auflösung, alle bits
asr r19 ;schiebe bit 0 des high-teils ins C-F
ror r18 ;schiebe alle bits nach rechts, C-Fla
asr r19 ;schiebe nächstes bit des high teils
ror r18 ;schiebe alle bits nach rechts, C-Fla
sts 0x61, r18 ;r18 in sram speichern
;werte senden
putChar1: sbis UCSRA, 5 ;bit 5 = UDR empty
rjmp putChar1 ;warten bis UDR bereit
out UDR, r18 ;senden
;werte senden ende
ldi r18, 0 ;werteregister lo-teil zurücksetzen
ldi r19, 0 ;werteregister hi-teil zurücksetzen
ldi r20, 0 ;zähler zurücksetzen
loop2: inc r20 ;zähler +1
ldi r16, 0b00000010 ;ADC channel 2
out ADMUX, r16 ;portC2 ADC channel 2
hystereseversuch.s, Seite 5 von 8
sbi ADCSRA, 6 ;starte nächste konvertierung
warten2: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
rjmp warten2
;Twert2 einlesen
in r26, ADCL ;low-teil auslesen
in r27, ADCH ;high-teil auslesen
add r18, r26
adc r19, r27
cpi r20, 16 ;zähler =16?
brne loop2 ;wenn nicht dann geh zu loop2
;wert durch 16 teilen
clc ;carry flag löschen
ror r19 ;high byte durch zwei teilen, übertra
ror r18 ;carry links einschieben und durch zw
clc ;carry für nächste teilung löschen
ror r19
ror r18
clc
ror r19
ror r18
clc
ror r19
ror r18
clc
;.................... ;10 bit zu 8 bit auflösung, alle bits
asr r19 ;schiebe bit 0 des high-teils ins C-F
ror r18 ;schiebe alle bits nach rechts, C-Fla
asr r19 ;schiebe nächstes bit des high teils
ror r18 ;schiebe alle bits nach rechts, C-Fla
sts 0x62, r18 ;r26 in sram speichern
;werte senden
putChar2: sbis UCSRA, 5 ;bit 5 = UDR empty
rjmp putChar2 ;warten bis UDR bereit
out UDR, r18 ;senden
;werte senden ende
ldi r18, 0 ;werteregister lo-teil zurücksetzen
ldi r19, 0 ;werteregister hi-teil zurücksetzen
ldi r20, 0 ;zähler zurücksetzen
loop3: inc r20 ;zähler +1
ldi r16, 0b00000011 ;ADC channel 3
out ADMUX, r16 ;portC3 ADC channel 3
sbi ADCSRA, 6 ;starte nächste konvertierung
warten3: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
rjmp warten3
;Twert3 einlesen
in r26, ADCL ;low-teil auslesen
in r27, ADCH ;high-teil auslesen
add r18, r26
adc r19, r27
cpi r20, 16 ;zähler =16?
brne loop3 ;wenn nicht dann geh zu loop2
;wert durch 16 teilen
clc ;carry flag löschen
ror r19 ;high byte durch zwei teilen, übertra
ror r18 ;carry links einschieben und durch zw
clc ;carry für nächste teilung löschen
ror r19
ror r18
hystereseversuch.s, Seite 6 von 8
clc
ror r19
ror r18
clc
ror r19
ror r18
clc
;.................... ;10 bit zu 8 bit auflösung, alle bits
asr r19 ;schiebe bit 0 des high-teils ins C-F
ror r18 ;schiebe alle bits nach rechts, C-Fla
asr r19 ;schiebe nächstes bit des high teils
ror r18 ;schiebe alle bits nach rechts, C-Fla
sts 0x63, r18 ;r26 in sram speichern
;werte senden
putChar3: sbis UCSRA, 5 ;bit 5 = UDR empty
rjmp putChar3 ;warten bis UDR bereit
out UDR, r18 ;senden
;werte senden ende
ldi r18, 0 ;werteregister lo-teil zurücksetzen
ldi r19, 0 ;werteregister hi-teil zurücksetzen
ldi r20, 0 ;zähler zurücksetzen
loop4: inc r20 ;zähler +1
ldi r16, 0b00000100 ;ADC channel 4
out ADMUX, r16 ;portC4 ADC channel 4
sbi ADCSRA, 6 ;starte nächste konvertierung
warten4: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
rjmp warten4
;Twert4 einlesen
in r26, ADCL ;low-teil auslesen
in r27, ADCH ;high-teil auslesen
add r18, r26
adc r19, r27
cpi r20, 16 ;zähler =16?
brne loop4 ;wenn nicht dann geh zu loop2
;wert durch 16 teilen
clc ;carry flag löschen
ror r19 ;high byte durch zwei teilen, übertra
ror r18 ;carry links einschieben und durch zw
clc ;carry für nächste teilung löschen
ror r19
ror r18
clc
ror r19
ror r18
clc
ror r19
ror r18
clc
;.................... ;10 bit zu 8 bit auflösung, alle bits
asr r19 ;schiebe bit 0 des high-teils ins C-F
ror r18 ;schiebe alle bits nach rechts, C-Fla
asr r19 ;schiebe nächstes bit des high teils
ror r18 ;schiebe alle bits nach rechts, C-Fla
sts 0x64, r18 ;r26 in sram speichern
;werte senden
putChar4: sbis UCSRA, 5 ;bit 5 = UDR empty
rjmp putChar4 ;warten bis UDR bereit
out UDR, r18 ;senden
hystereseversuch.s, Seite 7 von 8
;werte senden ende
ldi r18, 0 ;werteregister lo-teil zurücksetzen
ldi r19, 0 ;werteregister hi-teil zurücksetzen
ldi r20, 0 ;zähler zurücksetzen
ldi r16, 0b00000101 ;ADC channel 5
out ADMUX, r16 ;portC5 ADC channel 5
sbi ADCSRA, 6 ;starte nächste konvertierung
warten5: sbis ADCSRA, 4 ;skip wenn AD conversion abgeschlosse
rjmp warten5
;Twert5 einlesen
in r26, ADCL ;low-teil auslesen
in r27, ADCH ;high-teil auslesen
;.................... ;10 bit zu 8 bit auflösung, alle bits
asr r27 ;schiebe bit 0 des high-teils ins C-F
ror r26 ;schiebe alle bits nach rechts, C-Fla
asr r27 ;schiebe nächstes bit des high teils
ror r26 ;schiebe alle bits nach rechts, C-Fla
sts 0x65, r26 ;r26 in sram speichern
;werte senden
putChar5: sbis UCSRA, 5 ;bit 5 = UDR empty
rjmp putChar5 ;warten bis UDR bereit
out UDR, r26 ;senden
;werte senden ende
pop r16
pop r20
reti
hystereseversuch.s, Seite 8 von 8
Lesezeichen