/*------------------------------------------------------------------------------------------------------------
* Tasterabfrage1.asm
*
* Created: 20.11.2014 20:40:51
* Author: Dieter
* Anschlußbelegung: Atmega 644P
*
* Pin 1 PB0 = A von CD4067 Pin 10 Pin 40 PA0 = LED 1.1 von Platine 45
* Pin 2 PB1 = B von CD4067 Pin 11 Pin 39 PA1 = LED 1.2 von Platine 45
* Pin 3 PB2 = C von CD4067 Pin 14 Pin 38 PA2 = LED 2.1 von Platine 46
* Pin 4 PB3 = D von CD4067 Pin 13 Pin 37 PA3 = LED 2.2 von Platine 46
* Pin 5 PB4 = Pin 36 PA4 = LED 3.1 von Platine 47
* Pin 6 MOSI Pin 35 PA5 = LED 3.2 von Platine 47
* Pin 7 MISO Pin 34 PA6 = LED 4.1 von Platine 48
* Pin 8 SCK Pin 33 PA7 = LED 4.2 von Platine 48
* Pin 9 RESET Pin 32 AREF (VCC)
* Pin 10 VCC Pin 31 AGND (GND)
* Pin 11 GND Pin 30 AVCC (VCC)
* Pin 12 Quarz Takt 20 MHz Pin 29 PC7 = Serial In von Platine 45
* Pin 13 Quarz Takt 20 MHz Pin 28 PC6 = Serial In von Platine 46
* Pin 14 PD0 = A13 von SRAM Pin 28 Pin 27 PC5 = Serial In von Platine 47
* Pin 15 PD1 = A14 von SRAM Pin 3 Pin 26 PC4 = Serial In von Platine 48
* Pin 16 PD2 = A15 von SRAM Pin 31 Pin 25 PC3 = CLK (gemeinsame Taktleitung aller Platinen)
* Pin 17 PD3 = A16 von SRAM Pin 2 Pin 24 PC2 = Tasterrückleitung von Platine 45
* Pin 18 PD4 = A17 von SRAM Pin 30 Pin 23 PC1 = Tasterrückleitung von Platine 46
* Pin 19 PD5 = A18 von SRAM Pin 1 Pin 22 PC0 = Tasterrückleitung von Platine 47
* Pin 20 PD6 = Pin 21 PD7 = Tasterrückleitung von Platine 48
*
* Die Tasterrückleitungen sind mit Pullup Widerständen auf 1 gezogen und werden auf 0 abgefragt
*
*-------------------------------------------------------------------------------------------------------------
*/
.INCLUDE <m644Pdef.inc> ;Controllertyp Atmega 644P
;---------------------------------------------------------------------------------------
;
; definieren der Register
;
;---------------------------------------------------------------------------------------
.def temp1 = r16 ; Register 1 für temporäre Aufgaben
.def temp2 = r17 ; Register 2 für temporäre Aufgaben
.def temp3 = r18 ; Register 3 für temporäre Aufgaben
.def temp4 = r19 ; Register 4 für temporäre Aufgaben
.def temp5 = r20 ; Register 5 für temporäre Aufgaben
;-----------------------------------------------------------------------------------------
;
; festlegen der Daten
;
;-----------------------------------------------------------------------------------------
.equ F_CPU = 20000000 ; Systemtakt in Hz (20MHz)
.equ TRANS = DDRA ;
.equ TRANS_AUS = PORTA ; PORT A für Transistoren der LEDs
.equ MULTI = DDRB ;
.equ MULTI_AUS = PORTB ; PORT B für CD4067 Multiplex
.equ SRAM = DDRD ;
.equ SRAM_AUS = PORTD ; PORT D für SRAM Adressen
.equ SCHIEBE_DDR = DDRC ;
.equ SCHIEBE_PORT = PORTC ; PORT C für Serial IN
.equ SCK = PC3 ; Takt PIN 8 von 74HC164
.equ SIN1 = PC4 ; Serial Eingang Pin 1 von 74HC164 Platine 48
.equ SIN2 = PC5 ; Serial Eingang Pin 1 von 74HC164 Platine 47
.equ SIN3 = PC6 ; Serial Eingang Pin 1 von 74HC164 Platine 46
.equ SIN4 = PC7 ; Serial Eingang Pin 1 von 74HC164 Platine 45
.equ TAST1 = PC2 ; Eingang von Tasterplatine 45
.equ TAST2 = PC1 ; Eingang von Tasterplatine 46
.equ TAST3 = PC0 ; Eingang von Tasterplatine 47
.equ TAST4 = PD7 ; Eingang von Tasterplatine 48
;-----------------------------------------------------------------------------------------------
;
; Initialisieren
;
;-----------------------------------------------------------------------------------------------
ldi temp1, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp1
ldi temp1, HIGH(RAMEND)
out SPH, temp1
;------------------------------------------------------------------------------------------------
;
; Die Port Pins auf Ausgang konfigurieren
;
;------------------------------------------------------------------------------------------------
ldi temp1, (1<<SCK) | (1<<SIN1) | (1<<SIN2) | (1<<SIN3) | (1<<SIN4) ; Wert 248 laden und
out SCHIEBE_DDR, temp1 ; an PORT C ausgeben. PC3 - PC7 Ausgang
ldi temp1, 255 ; Wert 255 laden und
out TRANS, temp1 ; an PORT A ausgeben. PA0 - PA7 Ausgang
ldi temp1, 0 ; Wert 0 laden und
out PORTA, temp1 ; an Portpins ausgeben zum sperren der Transistoren
ldi temp1, 63 ; Wert 63 laden und
out MULTI, temp1 ; an PORT B ausgeben. PB0 - PB4 Ausgang
ldi temp1, 127 ; Wert 127 laden und
out SRAM, temp1 ; an PORT D ausgeben. PD0 - PD6 Ausgang
;----------------------------------------------------------------------------
;
; Schleife muss 4 mal durchlaufen
;
;----------------------------------------------------------------------------
Schleife:
push temp3 ; Register 18 auf Stack sichern
ldi temp3, 4 ; Schleife muss 4 mal durchlaufen werden
rcall Sperr ; Aufruf zum sperren aller Taster
loop:
rjmp loop ; hier kommt das eigentliche Programm hin
;-------------------------------------------------------------------------------------------------
;
; nach dem sperren aller Taster eine 0 einschieben und Tasterpins abfragen
; eine 1 nachschieben und Tasterpins wieder abfragen bis alle Taster abgefragt wurden
; Bitmuster für die LEDs einschieben
; Transistoren freigeben für LEDs
;
;--------------------------------------------------------------------------------------------------
;------------------------------------------------------------------------------------------------
;
; Datenbyte ausgeben zum sperren aller Taster
;
;------------------------------------------------------------------------------------------------
Sperr:
ldi temp1, 255 ; Wert 255 laden
rcall Schiebe ; Aufruf von Schiebe:
;-----------------------------------------------------------------------------
;
; 8 Bits aus temp1 an das Schieberegister ausgeben
;
;------------------------------------------------------------------------------
Schiebe:
push temp2 ; Register 17 auf Stack sichern
ldi temp2, 8 ; 8 Bits müssen ausgegeben werden
Schiebe_1:
;-----------------------------------------------------------------------
;
; jeweils das höchstwertige Bit aus temp1 ins Carry-Flag schieben
; Je nach Zustand des Carry-Flags wird die Datenleitung entsprechend
; gesetzt oder gelöscht
;
;------------------------------------------------------------------------
rol temp1 ; MSB -> Carry
brcs Schiebe_One ; Carry gesetzt? -> weiter bei Schiebe_One
cbi SCHIEBE_PORT, SIN1 ; Eine 0 ausgeben
cbi SCHIEBE_PORT, SIN2 ; Eine 0 ausgeben
cbi SCHIEBE_PORT, SIN3 ; Eine 0 ausgeben
cbi SCHIEBE_PORT, SIN4 ; Eine 0 ausgeben
rjmp Schiebe_Clock ; und Sprung zur Clock Puls Generierung
Schiebe_One:
sbi SCHIEBE_PORT, SIN1 ; Eine 1 ausgeben
sbi SCHIEBE_PORT, SIN2 ; Eine 1 ausgeben
sbi SCHIEBE_PORT, SIN3 ; Eine 1 ausgeben
sbi SCHIEBE_PORT, SIN4 ; Eine 1 ausgeben
;--------------------------------------------------------
;
; einen Impuls an SCK zur Übernahme des Bits nachschieben
;
;---------------------------------------------------------
Schiebe_Clock:
sbi SCHIEBE_PORT, SCK ; Clock-Ausgang auf 1 ...
cbi SCHIEBE_PORT, SCK ; und wieder zurück auf 0
dec temp2 ; Anzahl der ausgegebenen Bits runterzählen
brne Schiebe_1 ; Wenn noch keine 8 Bits ausgegeben -> Schleife bilden
dec temp3 ; Anzahl der Durchläufe runterzählen
brne Sperr ; Wenn noch keine 4 Durchläufe -> Schleife bilden
pop temp2 ; Register 17 aus Stack zurückholen
pop temp3 ; Register 18 aus Stack zurückholen
ret ; Rücksprung nach loop: