1 | /*****************************************************
|
2 | This program was produced by the
|
3 | CodeWizardAVR V1.25.1 Standard
|
4 | Automatic Program Generator
|
5 | © Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
|
6 | http://www.hpinfotech.com
|
7 |
|
8 | Chip type : ATmega8515L
|
9 | Program type : Application
|
10 | Clock frequency : 4,000000 MHz
|
11 | Memory model : Small
|
12 | External SRAM size : 0
|
13 | Data Stack size : 128
|
14 | *****************************************************/
|
15 |
|
16 | #include <mega8515.h>
|
17 | #include <stdio.h>
|
18 |
|
19 | // Initialisierung Senden & Empfangen über USART-Schnittstelle
|
20 | //------------------------------------------------------------------------
|
21 | #define RXB8 1
|
22 | #define TXB8 0
|
23 | #define UPE 2
|
24 | #define OVR 3
|
25 | #define FE 4
|
26 | #define UDRE 5
|
27 | #define RXC 7
|
28 |
|
29 | #define FRAMING_ERROR (1<<FE)
|
30 | #define PARITY_ERROR (1<<UPE)
|
31 | #define DATA_OVERRUN (1<<OVR)
|
32 | #define DATA_REGISTER_EMPTY (1<<UDRE)
|
33 | #define RX_COMPLETE (1<<RXC)
|
34 |
|
35 |
|
36 | // USART Receiver buffer
|
37 | #define RX_BUFFER_SIZE 8
|
38 | char rx_buffer[RX_BUFFER_SIZE];
|
39 |
|
40 | #if RX_BUFFER_SIZE<256
|
41 | unsigned char rx_wr_index,rx_rd_index,rx_counter;
|
42 | unsigned char notify=0x00;
|
43 | #else
|
44 | unsigned int rx_wr_index,rx_rd_index,rx_counter;
|
45 | #endif
|
46 |
|
47 | // This flag is set on USART Receiver buffer overflow
|
48 | bit rx_buffer_overflow;
|
49 |
|
50 | // USART Receiver interrupt service routine
|
51 | interrupt [USART_RXC] void usart_rx_isr(void)
|
52 | {
|
53 |
|
54 | char status,data;
|
55 | status=UCSRA;
|
56 | notify=status;
|
57 | data=UDR;
|
58 | if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
|
59 | {
|
60 | rx_buffer[rx_wr_index]=data;
|
61 |
|
62 | if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
|
63 | if (++rx_counter == RX_BUFFER_SIZE)
|
64 | {
|
65 | rx_counter=0;
|
66 | rx_buffer_overflow=1;
|
67 | };
|
68 | };
|
69 | }
|
70 |
|
71 | #ifndef _DEBUG_TERMINAL_IO_
|
72 | // Get a character from the USART Receiver buffer
|
73 | #define _ALTERNATE_GETCHAR_
|
74 | #pragma used+
|
75 |
|
76 |
|
77 |
|
78 | char getchar(void)
|
79 | {
|
80 | char data;
|
81 | while (rx_counter==0);
|
82 | data=rx_buffer[rx_rd_index];
|
83 | if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
|
84 | #asm("cli")
|
85 | --rx_counter;
|
86 | #asm("sei")
|
87 | return data;
|
88 | }
|
89 | #pragma used-
|
90 | #endif
|
91 |
|
92 |
|
93 |
|
94 | // USART Transmitter buffer
|
95 | #define TX_BUFFER_SIZE 8
|
96 | char tx_buffer[TX_BUFFER_SIZE];
|
97 |
|
98 | #if TX_BUFFER_SIZE<256
|
99 | unsigned char tx_wr_index,tx_rd_index,tx_counter;
|
100 | #else
|
101 | unsigned int tx_wr_index,tx_rd_index,tx_counter;
|
102 | #endif
|
103 |
|
104 |
|
105 |
|
106 |
|
107 | // USART Transmitter interrupt service routine
|
108 | interrupt [USART_TXC] void usart_tx_isr(void)
|
109 | {
|
110 | if (tx_counter)
|
111 | {
|
112 | --tx_counter;
|
113 | UDR=tx_buffer[tx_rd_index];
|
114 | if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
|
115 | };
|
116 | }
|
117 |
|
118 | #ifndef _DEBUG_TERMINAL_IO_
|
119 | // Write a character to the USART Transmitter buffer
|
120 | #define _ALTERNATE_PUTCHAR_
|
121 | #pragma used+
|
122 |
|
123 |
|
124 |
|
125 |
|
126 | void putchar(char c)
|
127 | {
|
128 | while (tx_counter == TX_BUFFER_SIZE);
|
129 | #asm("cli")
|
130 | if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
|
131 | {
|
132 | tx_buffer[tx_wr_index]=c;
|
133 | if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
|
134 | ++tx_counter;
|
135 | }
|
136 | else
|
137 | UDR=c;
|
138 | #asm("sei")
|
139 | }
|
140 | #pragma used-
|
141 | #endif
|
142 | //------------------------------------------------------------------------
|
143 |
|
144 |
|
145 | // Declare your global variables here
|
146 |
|
147 |
|
148 | void main(void)
|
149 | {
|
150 | // Declare your local variables here
|
151 | unsigned char taster=0xFF;
|
152 | unsigned char led=0xFF;
|
153 | unsigned char led_alt=0xFF;
|
154 |
|
155 |
|
156 | // Input/Output Ports initialization
|
157 | PORTA=0xFF;
|
158 | DDRA=0x00;
|
159 |
|
160 | PORTB=0xFF;
|
161 | DDRB=0xFF;
|
162 |
|
163 | // Timer/Counter 0 initialization
|
164 | TCCR0=0x00;
|
165 | TCNT0=0x00;
|
166 | OCR0=0x00;
|
167 |
|
168 | // Timer/Counter 1 initialization
|
169 | TCCR1A=0x00;
|
170 | TCCR1B=0x00;
|
171 | TCNT1H=0x00;
|
172 | TCNT1L=0x00;
|
173 | ICR1H=0x00;
|
174 | ICR1L=0x00;
|
175 | OCR1AH=0x00;
|
176 | OCR1AL=0x00;
|
177 | OCR1BH=0x00;
|
178 | OCR1BL=0x00;
|
179 |
|
180 | // External Interrupt(s) initialization
|
181 | MCUCR=0x00;
|
182 | EMCUCR=0x00;
|
183 |
|
184 | // Timer(s)/Counter(s) Interrupt(s) initialization
|
185 | TIMSK=0x00;
|
186 |
|
187 | // USART initialization
|
188 | // Communication Parameters: 8 Data, 1 Stop, No Parity
|
189 | // USART Receiver: On
|
190 | // USART Transmitter: On
|
191 | // USART Mode: Asynchronous
|
192 | // USART Baud rate: 9600
|
193 | UCSRA=0x00;
|
194 | UCSRB=0xD8;
|
195 | UCSRC=0x86;
|
196 | UBRRH=0x00;
|
197 | UBRRL=0x17;
|
198 |
|
199 | // Analog Comparator initialization
|
200 | ACSR=0x80;
|
201 |
|
202 | // Global enable interrupts
|
203 | #asm("sei")
|
204 |
|
205 |
|
206 | while (1)
|
207 | {
|
208 | // B: LED A: TASTER
|
209 |
|
210 | // solange notify kleiner 128: Board Modus
|
211 | // d.h. abfrage ob erstes Bit in UCSRA gesetzt ist (Daten empfangen)
|
212 | while (notify<0x80){
|
213 | // LED: wenn änderung zum vorigen schleifendurchlauf wird LED status an PC geschickt
|
214 | led=PINB;
|
215 | if (led_alt!=led){
|
216 | putchar(led);
|
217 | }
|
218 | led_alt=led;
|
219 |
|
220 | //Board mode
|
221 | PORTB=PINA;
|
222 | }
|
223 |
|
224 |
|
225 | // solange kein Taster gedrückt wird: PC Modus
|
226 | // hier kommt man nicht mehr raus! Idee: rauswurf durch tasterdruck am board...
|
227 | while (PINA==0xFF){
|
228 | // LED: wenn änderung zum vorigen schleifendurchlauf wird LED status an PC geschickt
|
229 | led=PINB;
|
230 | if (led_alt!=led){
|
231 | putchar(led);
|
232 | }
|
233 | led_alt=led;
|
234 |
|
235 | //PC Mode
|
236 | PORTB=getchar();
|
237 | }
|
238 |
|
239 | notify=0x00;
|
240 |
|
241 | };
|
242 | }
|