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
|