rs232-2-spi.asm


1
; Was macht das Ding?
2
;
3
; Es werden die Daten der seriellen Schnittstelle mit 19200Baud (mit 18,432MHz Quarz) empfangen
4
; Wird eine '1' (0x31) empfangen, wird DATA auf high gelegt und ein Clock nach 200us mit steigender Flanke ausgegeben.
5
; Wird eine '0' (0x30) empfangen, wird DATA auf low gelegt und ein Clock nach 200us mit steigender Flanke ausgegeben.
6
; Vor dem ersten Zeichen wird CE auf high gelegt
7
; Wird ein CR (0x0D) empfangen, wird CE auf low gelegt.
8
; Andere Zeichen werden ignoriert. (0x??)
9
; Damit können Datenworte incl. Kommentaren einfach aus einer Textdatei per cut-copy-paste in das Terminalprogramm kopiert werden.
10
; (nur 0 und 1 sind in den Kommentaren tabu)
11
;
12
;
13
; Empfangen:  0x31                0x30              0x??           0x0D
14
;              |                   |                 |              |
15
;               _____________________________________________________
16
; CE   ________/                                                     \____________
17
;
18
;                     _____________       __________________________
19
; CL   ______________/             \_____/                          \_____________
20
;
21
;               ___________________
22
; DATA ________/                   \______________________________________________
23
;
24
;
25
; Die Datenwortlänge hängt von den gesendeten 1en und 0en ab, welche vor einem CR gesendet werden.
26
;
27
; 2016 jobstens.de
28
29
30
31
.include "m48def.inc"
32
33
.def tmp  = r16      ; allgemeines Register
34
35
; **************************************************************************
36
;  IRQ-Vector-Table
37
; **************************************************************************
38
39
.org 0x0000        ; Reset Handler
40
        rjmp    init
41
42
.org URXCaddr        ; USART Receive Complete Interrupt Vector Address
43
  rjmp  USART_receive
44
45
; **************************************************************************
46
;  INIT
47
; **************************************************************************
48
49
init:
50
  ; 1. Stackpointer initialisieren
51
52
    ldi  tmp, HIGH(RAMEND)
53
    out  SPH, tmp
54
    ldi  tmp, LOW(RAMEND)     
55
    out  SPL, tmp
56
57
58
  ; 2. Ports initialisieren
59
60
    SBI  DDRC, 0    ; Port C 0 Ausgang CE
61
    SBI  DDRC, 1    ; Port C 1 Ausgang CL
62
    SBI  DDRC, 2    ; Port C 2 Ausgang DATA
63
64
65
  ; 3. Initialisierung der seriellen Schnittstelle 8n1 19200
66
67
    ldi  tmp, 0    ; = ((XTAL-Hz/DIV8) / (8 * Bd))-1
68
    sts  UBRR0H, tmp
69
    ldi  tmp, 119
70
    sts  UBRR0L, tmp
71
72
    ldi  tmp, 0x06  ; Select Async USART, no Parity, 1 Stop, 8-Data bits
73
    sts  UCSR0C, tmp
74
75
    ldi  tmp, 0x98  ; Set Rx Complete IRQ Enable, Rx Enable, Tx enable
76
    sts  UCSR0B, tmp
77
78
    ldi  tmp, 0x42  ; Set Transmit-Flag & Double-Speed
79
    sts  UCSR0A, tmp
80
81
82
  ; 4. das war's
83
84
    sei      ; Alle Interupts mal an machen - 'ey, Interupt!'
85
86
87
loop:    rjmp  loop    ; death end
88
89
; **************************************************************************
90
;  IRQ - RS232
91
; **************************************************************************
92
93
USART_receive:
94
    LDS  tmp, UDR0    ; Empfangenes Byte
95
96
    CPI  tmp, 13      ; Wenn <CR>
97
    BREQ  transmission_end
98
    CPI  tmp, 0x30    ; Wenn "0"
99
    BREQ  transmit_zero
100
    CPI  tmp, 0x31    ; Wenn "1"
101
    BREQ  transmit_one
102
    ; Alle anderen: nichts tun
103
          RETI
104
105
transmission_end:
106
    CBI  PORTC, 1  ; CL = 0
107
    CBI  PORTC, 0  ; CE = 0
108
    RETI
109
110
transmit_zero:  SBI  PORTC, 0  ; CE = 1
111
    CBI  PORTC, 2  ; DATA = 0
112
    CBI  PORTC, 1  ; CL = 0
113
    CALL  WAIT_200us  ; wait 200us
114
    SBI  PORTC, 1  ; CL = 1
115
    RETI
116
117
transmit_one:  SBI  PORTC, 0  ; CE = 1
118
    SBI  PORTC, 2  ; DATA = 1
119
    CBI  PORTC, 1  ; CL = 0
120
    CALL  WAIT_200us  ; wait 200us
121
    SBI  PORTC, 1  ; CL = 1
122
    RETI
123
124
; **************************************************************************
125
;  Warten, Zeit verbraten
126
; **************************************************************************
127
128
WAIT_200us:  RCALL  WAIT_100us
129
WAIT_100us:  RCALL  WAIT_10us
130
WAIT_90us:  RCALL  WAIT_10us
131
WAIT_80us:  RCALL  WAIT_10us
132
WAIT_70us:  RCALL  WAIT_10us
133
WAIT_60us:  RCALL  WAIT_10us
134
WAIT_50us:  RCALL  WAIT_10us
135
WAIT_40us:  RCALL  WAIT_10us
136
WAIT_30us:  RCALL  WAIT_10us
137
WAIT_20us:  RCALL  WAIT_10us
138
WAIT_10us:  RCALL  WAIT_1us
139
WAIT_9us:  RCALL  WAIT_1us
140
WAIT_8us:  RCALL  WAIT_1us
141
WAIT_7us:  RCALL  WAIT_1us
142
WAIT_6us:  RCALL  WAIT_1us
143
WAIT_5us:  RCALL  WAIT_1us
144
WAIT_4us:  RCALL  WAIT_1us
145
WAIT_3us:  RCALL  WAIT_1us
146
WAIT_2us:  RCALL  WAIT_1us
147
WAIT_1us:  NOP
148
    NOP
149
    NOP
150
    NOP
151
    NOP
152
    NOP
153
    RET