reworked part of the code
[my-code/atmel.git] / beginners / season_junior.asm
index 94ba21c..703b29f 100644 (file)
 
 ; at90s2313
 ; setup:
-; vcc card --- vcc cam
-; rst card --- rst cam --- atmel t0 (pd4)
-; clk card --- clk cam --- atmel t1 (pd5)
+; vcc card --- atmel vcc
+; vcc cam  --- 
+; rst cam  --- atmel int0 (pd2)
+; rst card --- atmel (pd4)
+; clk card -\ 
+;            -  atmel t1 (pd5)
+; clk cam  -/
 ; gnd card --- gnd cam --- atmel gnd
-; i/o card --- atmel int0 (pd2)
+; i/o card --- atmel icp (pd6)
 ; i/o cam  --- atmel int1 (pd3)
 
-include "../include/2313def.inc"
-
+.include "../include/2313def.inc"
 
+; functions by now:
 ;
-; interrupt vectors:
+; stupid mode only by now. just see what cam/card do and redirect
+; this to card/cam.
+;
+; next implementation:
+; 
+; try to read one byte of card/cam communication and output via uart.
+; output time information in some way.
 ;
+; future:
+;
+; buffer/parse whole strings and decide whether to send to card or not.
+
+; #######
+; defines
+; #######
+
+; baudrate = clock freq / etu
+; std smartcard etu: 372
+; other smartcards: 625
+.define clock 8000000
+.define clk_h 4000000
+.define etu 625
+.define etu_h 312
+.define baudrate 5 ; UBRR value for 76800 bits/s (8mhz clock)
+
+; names for registers
+.define tmp r16
+.define bitcount r17
+.define tmp1 r18
+.define tmp2 r19
+.define byte r20
+.define overflow_counter r21
+.define counter_l r22
+.define counter_h r23
+.define state r24
+.define state_m r25
+.define mode r26
+.define counter_l_tmp r27
+.define counter_h_tmp r28
+.define one r1
+.define zero r0
+
+; state
+.define LOW (1<<0)
+.define LOW_F 1
+.define HIGH (1<<1)
+.define HIGH_F 2
+; mode
+.define STUPID (1<<0) ; forward cam <-> card communication
+.define STUPID_F 1
+.define COOL (1<<1) ; send time (clocks) & state via uart
+.define COOL_F 2
+.define ELITE (1<<2) ; create bytes, maybe even whole command arrays
+.define ELITE_F 3
+.define GODLIKE (1<<3) ; filter and mask for commands to card - send rejected via uart only
+.define GODLIKE_F 4
+.define INCREDIBLE_HACK (1<<4) ; destroy all your hardware
+.define INCREDIBLE_HACK_F 5 
+
+; but there is only stupid and cool mode right now %)
+
+
+; #############
+; programm code
+; #############
+
+; ------------------
+; interrupt vectors:
+; ------------------
 
 ; reset
 rjmp INIT
 
 ; int0
-rjmp REC_CARD
+rjmp RST_CAM
 
 ; int1
 rjmp REC_CAM
 
 ; timer/counter capt 1
-reti
+rjmp REC_CARD
 
 ; timer/counter compare
 reti
 
 ; timer/counter overflow 1
-rjmp T1_OVERFLOW
+rjmp CLK_OVERFLOW
 
 ; timer/counter overflow 0
 reti
@@ -45,7 +116,7 @@ reti
 reti
 
 ; uart data register empty
-reti
+rjmp UART_OUT
 
 ; uart tx complete
 reti
@@ -53,41 +124,216 @@ reti
 ; analog comparator
 reti
 
-;
+; ------------
 ; init routine
-;
+; ------------
 
 INIT:
 
 ; set stackpointer
-ldi r16,low(RAMEND)
-out SPL,r16
+ldi tmp,low(RAMEND)
+out SPL,tmp
 
 ; enable interrupts int0,int1
-ldi r16,((1<<INT0)|(1<<INT1))
-out GIMSK,r16
+ldi tmp,((1<<INT0)|(1<<INT1))
+out GIMSK,tmp
 ; int0/1 setup
-ldi r16,((1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10))
-out MCUCR,r16
-sbis PORTD,PORTD2
-cbi MCUCR,ISC00
-sbis PORTD,PORTD3
-cbi MCUCR,ISC10
+ldi tmp,((1<<ISC01)|(0<<ISC00)|(1<<ISC11)|(0<<ISC10))
+out MCUCR,tmp
+
+; enable t/c overflow interrupt and icp
+ldi tmp,((1<<TOIE1)|(1<<TICIE1))
+out TIMSK,tmp
+; setup t/c and icp
+ldi tmp,((1<<CS12)|(1<<CS11)|(1<<CS10)|(1<<ICNC1)|(0<<ICES1))
+out TCCR1B,tmp
 
-; enable t/c overflow interrupt
-sbi TIMSK,TOIE1
-; setup t/c
-ldi r16,((1<<CS12)|(1<<CS11)|(1<<CS10))
-out TCCR1B,r16
+; configure uart - interrupt enabled when i/o
+ldi tmp,baudrate
+out UBRR,tmp
+sbi UCR,TXEN
+
+; init registers
+ldi bitcounter,0 
+ldi byte,0
+ldi overflow_counter,0
+ldi tmp1,0
+ldi tmp2,0 
+ldi counter_l,0
+ldi counter_h,0
+ldi state,HIGH ; .. as waiting for falling edge of start bit
+ldi state_m,0x03
+ldi mode,(STUPID|COOL)
+ldi counter_l_tmp,0
+ldi counter_h_tmp,0
+ldi tmp,1
+mov one,tmp
+ldi tmp,0
+mov zero,tmp
 
 ; enable interrupts (global)
 sei
 
-;
+; jump to mainloop
+rjmp MAIN
+
+; ------------
+; main routine
+; ------------
+
+MAIN:
+
+; loop and wait for interrupts
+rjmp MAIN
+
+; ----------------
 ; rec_card routine
-;
+; ----------------
 
 REC_CARD:
 
-; get port status
-in .... continue here .. :)
+; save counter
+in counter_l,ICR1L
+in counter_h,ICR1H
+
+; toggle state
+eor state,state_m
+
+; toggle icp sense
+rcall TOGGLE_ICP_SENSE
+
+; fwd to cam if in stupid mode
+sbrc mode,STUPID_F
+rcall FWD_TO_CAM
+
+; calculate delta clocks if in stupid mode
+sbrc mode,COOL_F
+rcall CALC_DELTA_CLOCK ; -> calc delta, store to counter_l_tmp, counter_h_tmp
+
+; send time and state via uart
+sbrc mode,COOL_F
+rcall SEND_TO_UART ; -> prepare date & enable uart dre interrupt (sbi UCR,UDRIE)
+
+; return
+reti
+
+; ------------------------
+; toggle_icp_sense routine
+; ------------------------
+
+TOGGLE_ICP_SENSE:
+
+; toggle according to state
+cbi TCCR1B,ICES1
+sbrs state,HIGH
+sbi TCCR1B,ICES1
+
+; return 
+ret
+
+; ------------------
+; fwd_to_cam routine
+; ------------------
+
+; output state on port to cam
+mov tmp,state
+andi tmp,HIGH
+lsl tmp ; as we have to set pd3 (dirty, shorter way?)
+sbi DDRD,DDD3
+out PORTD,tmp ; <- hunz: low or high if pd3 bit is set ?
+
+; return
+ret
+
+
+; zzZZzZzZZZ .... hier gehts weiter !!!
+
+;
+; rec_cam routines
+;
+
+REC_CAM:
+
+; decide what to do
+sbic PORTD,PD3
+rjmp REC_CAM_HIGH
+rjmp REC_CAM_LOW
+
+REC_CAM_HIGH:
+
+; output high on port to card
+sbi PORTD,PD6
+
+; toggle int1 sense
+in r16,MCUCR
+cbr r16,ISC10
+out MCUCR,r16
+
+reti
+
+REC_CAM_LOW:
+
+; output low on port to card
+cbi PORTD,PD6
+
+; toggle int 1 sense
+in r16,MCUCR
+sbr r16,ISC10
+out MCUCR,r16
+
+reti
+
+;
+; t1_overflow routine
+;
+
+T1_OVERFLOW:
+
+add r22,r1 ; inc counter overflow register
+
+reti
+
+;
+; rst_cam routine
+;
+
+RST_CAM:
+
+; decide what to do
+sbic PORTD,PD2
+rjmp RST_CAM_HIGH
+rjmp RST_CAM_LOW
+
+RST_CAM_HIGH:
+
+; output high on rst port to card
+sbi PORTD,PD4
+
+; toggle int0 sense
+in r16,MCUCR
+cbr r16,ISC00
+out MCUCR,r16
+
+reti
+
+RST_CAM_LOW:
+
+; output low on rst port to cam
+cbi PORTD,PD4
+
+; toggle int0 sense
+in r16,MCUCR
+sbr r16,ISC00
+out MCUCR,r16
+
+reti
+
+;
+; uart_out routines
+;
+
+UART_OUT:
+
+;
+; hier weiter ...
+;