; So, hier geht nun endlich das eigentliche Programm los. Na nicht ganz, erst sind noch allerhand Voreinstellungen nötig. .nolist .include "m8515def.inc" ; Einbinden des verwendeten Prozessors. .list ;.Equ Fq=3686400 ; QuarzFrequenz in Hertz. ; Die folgenden 4 Zeilen werden warscheinlich nie gebraucht. ;.Equ Baud=9600 ; BaudRate in Baud. ; Über ein Teminal-Programm könnte man auch textuelle Meldungen ausgeben. ;.Equ Baud=115200 ; BaudRate in Baud. ; Oder vielleicht ein neues Start-Signal auslösen... ;.Equ UbrrWert=(Fq/(16*Baud))-1 ; Ausrechnen des Ubrr-Wertes. ; Man kan es aber auch sein lassen, weil nicht wirklich nötig... ; Register-Definitionen: ; Verwendete Arbeits-Register definieren. .def sr16=r16 ; Universalregister. .def sr17=r17 ; Zähl-Register für Warte-Schleife. ; Irgentwie muß man ja die Schalt- und Prell-Zeit der Relays überbrücken. .def sr18=r18 ; Zähl-Register für Warte-Schleife. .def sr19=r19 ; Null-Register(fester Wert). ; Dient der Einsparung von sonst zusätzlich nötigen Programm-Schritten. .def sr20=r20 ; FF-Register(fester Wert). .def sr21=r21 ; Zusätzliches Ablage-Register. .def sr23=r23 ;-------------------------------------------------------------------------------------------------------------------------------- .CSEG .ORG $0030 ; Programm beginnt bei Adresse $0030. rjmp Init Init: ; Erst mal ordentliche Start-Werte festlegen. Diese Voreinstellungen sind für ein sauberes Funktionieren notwendig. Clr XL Clr XH Clr YL Clr YH Clr ZL Clr ZH ldi sr23, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, sr23 ldi sr23, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, sr23 ; Ldi ZL,Low(RamEnd) ; Out SPL,ZL ; Ldi ZH,High(RamEnd) ; Out SPH,ZH Ldi sr16,0x00 ; Eigentliches Arbeits-Register. Ldi sr19,0x00 ; Null-Register. Ldi sr20,0xFF ; FF-Register. ; ; Also, Port A und C muß komplett als Ausgänge definiert werden. out ddra,sr20 out ddrc,sr20 ; ; Für saubere Startwerte sind die einzelnen Pins auf Null zu setzen. out PortA,sr19 ; Zur Hex-Anzeige. out PortC,sr19 ; 8-Bit-Wandler-Ausgang zur PC-MessKarte hin. ; ; Tun wir mal für PortE noch was sinnvolles. out DdrE,sr20 out PortE,sr19 ;-------------------------------------------------------------------------------------------------------------------------------- ; ; Bei Port B und D wird es nun etwas komplexer, weil hier eine gemischte Datenrichtung gebraucht wird. ldi sr16,0b01111110 ; Laden des Bitmusters für Datenrichtung in's Universalregister. ; ; PinB0 wird Eingang und alle Anderen zu Augängen. out ddrb,sr16 ; Setzen der Datenrichtungen im PortB-Register. ; ; Desweiteren ist der Eingangs-Pin B0 und B7 mit dem internen PullUp-Widerstand zu verbinden. ldi sr16,0b10000001 ; Laden des Bitmusters für Augangs-Pegel auf Low und Eingänge mit PullUp. out PortB,sr16 ; Außer für PinB6, welcher den zweiten Multiplexer erst mal "tot legen" muß. Deshalb muß er auf High. ; ldi r16, 0xFF ; An allen Pins vom Port D die Pullup Widerstände ; out PORTD, r16 ; aktivieren. Dies geht deshalb durch eine Ausgabe ; nach PORTD, da ja der Port auf Eingang gestellt ist ; sbi PinB,0 ; Da nun die Multiplexer-Ausgänge erst über 2 Negatoren V4093 zu getrennten AVR-Pins geleitet werden, ; sbi PinB,7 ; können nun die internen PullUp-Widerstände aktiviert werden. ; ; Lieber nicht. Das könnte den Pegel der Optischen Koppler versauen. ldi sr16,0b11111111 ; Laden des Bitmusters für Datenrichtung in's Universalregister. ; ; PinD0 und D1 werden erst mal reserviert und sicherheitshalber auch zu Ausgängen. ; ; Also, PinD2...5 ist für A...D und PinD6 undD7 ist für /OutputEnable vorgesehen. out DdrD,sr16 ; Setzen der Datenrichtungen im PortD-Register. ;---------------------------------------------------------------------------------------------------------------------------- ldi sr16,0b10000100 ; Bitmuster für Ausgangs-Pegel auf Low und Eingangs-PullUp für Pin D2 und nun auch D7. out PortD,sr16 ; Setzen der Ausgangs-Pegel auf Low und aktivieren der Eingangs-PullUps. ;---------------------------------------------------------------------------------------------------------------------------- ; Hiermit sollten alle notwendigen Voreinstellungen für ein sauberes Arbeiten abgeschlossen sein. ;################################################################################################################################ jmp prog_start ; Springe nun zum eigentlichen Programm. ;################################################################################################################################ zyklus: ; ============================= ; Warteschleifen-Generator ; 3686400 Zyklen:Für 1 Sek. ; ----------------------------- ; warte 3686391 Zyklen: ldi sr17, $1B WGLOOP00: ldi sr18, $B9 WGLOOP11: ldi sr19, $F5 WGLOOP22: dec sr19 brne WGLOOP22 dec sr18 brne WGLOOP11 dec sr17 brne WGLOOP00 ; ----------------------------- ; warte 9 Zyklen: ldi sr17, $03 WGLOOP33: dec sr17 brne WGLOOP33 ; ============================= ret ;################################################################################################################################ prog_start: ;################################################################################################################################ ; Für 1.Komparator 0 0000 = (Eigentlich nichts nötig, da PinB1...4 schon per Voreinstellung schon auf Low sind.) ; Zur Sicherheit: cbi PortB,1 cbi PortB,2 cbi PortB,3 cbi PortB,4. ; ; Hex00 ; Vorher wird die Hex-Anzeige auf Hex00 gesetzt. sbi PortD,7 ; H-D7 ; Zweiter Relays-Dekoder Eingang /G /O /OE auf High. Das setzt alle Ausgänge auf Low. ; Probe wegen Schleife: sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; Hex0 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,3 cbi PortD,4 cbi PortD,5 cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 2.Komparator 1 0001 = sbi PortB,1 (Hier wird voraus gesetzt, das PinB 2,3 und 4 noch auf Low sind.) ; ; Hex10 ; Vorher wird die Hex-Anzeige auf Hex10 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; Hex1 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 3.Komparator 2 0010 = cbi PortB,1 sbi PortB,2 (PinB 3 und 4 bleiben weiter auf Low.) ; ; Hex20 ; Vorher wird die Hex-Anzeige auf Hex20 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; Hex2 ; Adressierung eines Ausgangs des Relays-Dekoders. sbi PortD,3 cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 4.Komparator 3 0011 = sbi PortB,1 (Pin B1 wieder auf High, B2 bleibt auf High und B3 und 4 auf Low.) ; ; Hex30 ; Vorher wird die Hex-Anzeige auf Hex30 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; Hex3 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 5.Komparator 4 0100 = cbi PortB,1 cbi PortB,2 sbi PortB,3 (B1 und 2 wieder aud Low, B3 auf High.) ; ; Hex40 ; Vorher wird die Hex-Anzeige auf Hex40 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; Hex4 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,3 sbi PortD,4 cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 6.Komparator 5 0101 = sbi PortB,1 ; ; Hex50 ; Vorher wird die Hex-Anzeige auf Hex50 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; Hex5 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 7.Komparator 6 0110 = cbi PortB,1 sbi PortB,2 ; ; Hex60 ; Vorher wird die Hex-Anzeige auf Hex60 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; Hex6 ; Adressierung eines Ausgangs des Relays-Dekoders. sbi PortD,3 cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 8.Komparator 7 0111 = sbi PortB,1 ; ; Hex70 ; Vorher wird die Hex-Anzeige auf Hex70 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; Hex7 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,6 ; L-D6 ; Erster Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 9.Komparator 8 1000 = cbi PortB,1 cbi PortB,2 cbi PortB,3 sbi PortB,4 ; ; Hex80 ; Vorher wird die Hex-Anzeige auf Hex80 gesetzt. sbi PortD,6 ; H-D6 ; Erster Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. ; sbi PortD,7 ; H-D7 ; Zweiter Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; Hex8 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,3 cbi PortD,4 sbi PortD,5 ; Dieser Anschluß wird im Moment nicht benutzt. Er könnte später für was Anderes dienen. cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 10.Komparator 9 1001 = sbi PortB,1 ; ; Hex90 ; Vorher wird die Hex-Anzeige auf Hex90 gesetzt. sbi PortD,7 ; H-D7 ; Zweier Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; Hex9 ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 11.Komparator 10 1010 = cbi PortB,1 sbi PortB,2 ; ; HexA0 ; Vorher wird die Hex-Anzeige auf HexA0 gesetzt. sbi PortD,7 ; H-D7 ; Zweier Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; HexA ; Adressierung eines Ausgangs des Relays-Dekoders. sbi PortD,3 cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 12.Komparator 11 1011 = sbi PortB,1 ; ; HexB0 ; Vorher wird die Hex-Anzeige auf HexB0 gesetzt. sbi PortD,7 ; H-D7 ; Zweier Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; HexB ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 13.Komparator 12 1100 = cbi PortB,1 cbi PortB,2 sbi PortB,3 ; ; HexC0 ; Vorher wird die Hex-Anzeige auf HexC0 gesetzt. sbi PortD,7 ; H-D7 ; Zweier Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; HexC ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,3 sbi PortD,4 cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 14.Komparator 13 1101 = sbi PortB,1 ; ; HexD0 ; Vorher wird die Hex-Anzeige auf HexD0 gesetzt. sbi PortD,7 ; H-D7 ; Zweiter Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; HexD ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Für 15.Komparator 14 1110 = cbi PortB,1 sbi PortB,2 ; ; HexE0 ; Vorher wird die Hex-Anzeige auf HexE0 gesetzt. sbi PortD,7 ; H-D7 ; Zweiter Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. cbi PortD,2 ; HexE ; Adressierung eines Ausgangs des Relays-Dekoders. sbi PortD,3 cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;-------------------------------------------------------------------------------------------------------------------------------- ; Kein Komparator mehr da: ; Wenn der 15.Komparator auch noch High zeigt, muß nun das sechzehnte Relays angeschaltet werden. ; ; HexF0 ; Vorher wird die Hex-Anzeige auf HexF0 gesetzt. sbi PortD,7 ; H-D7 ; Zweier Relays-Dekoder Eingang /G auf High. Das setzt alle Ausgänge auf Low. sbi PortD,2 ; HexF ; Adressierung eines Ausgangs des Relays-Dekoders. cbi PortD,7 ; L-D7 ; Zweiter Relays-Dekoder Eingang /G auf Low. Somit geht dessen adressierter Ausgang auf High. rcall zyklus ;################################################################################################################################ jmp prog_start