1 | /*******************************************************************
|
2 | *
|
3 | * Chip type : ATmega32
|
4 | * Clock frequency : 14,745600 MHz
|
5 | * lfuse e1 = 1110 0001 -> 0e = 0000 1110
|
6 | * hfuse 99 = 1001 1001 -> d9 = 1101 1001
|
7 | * avrdude -p atmega32 -P /dev/ttyS0 -b 115200 -c avr910 -U lfuse:w:0x0e:m
|
8 | * avrdude -p atmega32 -P /dev/ttyS0 -b 115200 -c avr910 -U hfuse:w:0xd9:m
|
9 | *
|
10 | * test.c
|
11 | *
|
12 | * To do:
|
13 | *
|
14 | ********************************************************************/
|
15 |
|
16 |
|
17 | #include "hardwaredef.h"
|
18 |
|
19 | #include <avr/io.h>
|
20 | #include <avr/interrupt.h>
|
21 | #include <inttypes.h>
|
22 | #include <stdlib.h>
|
23 | #include <util/delay.h>
|
24 | #include "test.h"
|
25 |
|
26 | char sCommandString[BUFFER_LENGHT];
|
27 | char sOutString[BUFFER_LENGHT];
|
28 |
|
29 | int8_t execute (const char *text);
|
30 |
|
31 | int16_t lCommandPar1;
|
32 | int16_t lCommandPar2;
|
33 |
|
34 | // Status and Error Flags
|
35 | volatile int8_t iUartFlags;
|
36 | volatile char sInBuffer[BUFFER_LENGHT];
|
37 | volatile uint8_t iBufferPtr;
|
38 |
|
39 | void InitPorts(void) {
|
40 | // port inputs
|
41 | DDRA &= ~( (1<<SLID_ENC_1) | (1<<SLID_ENC_2) | (1<<SLID_REF) | (1<<TURN_H_END) );
|
42 | // DDRB &= ~( (1<<PB6) );
|
43 | DDRC &= ~( (1<<VERT_REF) | (1<<VERT_H_END) | (1<<TURN_REF) | (1<<SDA) | (1<<SCL) );
|
44 | DDRD &= ~( (1<<VERT_ENC_1) | (1<<VERT_ENC_2) | (1<<TURN_ENC_1) | (1<<TURN_ENC_2));
|
45 | // port outputs
|
46 | DDRA |= (1 << GRIP) | (1 << RESERVE0) | (1 << RESERVE1);
|
47 | DDRB |= (1 << SLID_3A) | (1 << SLID_4A) | (1 << TURN_1A) | (1 << TURN_PWM) | (1 << TURN_2A) | (1 << LASER);
|
48 | DDRC |= (1 << VERT_DIRECTION) | (1 << VERT_STOP);
|
49 | DDRD |= (1 << VERT_PWM) | (1 << SLID_PWM);
|
50 | // activate pullup resistors
|
51 | PORTA |= ((1<<SLID_ENC_1) | (1<<SLID_ENC_2) | (1<<SLID_REF) | (1<<GRIP));
|
52 | PORTC |= ((1<<SDA) | (1<<SCL));
|
53 | }
|
54 |
|
55 | // ------------------------------------------------------------ IRQ
|
56 | ISR(__vector_default) { UsartPuts ("Undefined IRQ"); }
|
57 |
|
58 |
|
59 | // ------------------------------------------------------------ USART
|
60 |
|
61 | void InitUsart(void) {
|
62 | UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8); // set baud rate
|
63 | UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
|
64 | UCSRB = (1 << RXEN) | (1 << TXEN) ; // enable receiver and transmitter
|
65 | UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (1 << UPM1); // asynchronous 8N1, even Parity
|
66 | do UDR; while (UCSRA & (1 << RXC)); // flush receiver
|
67 | }
|
68 |
|
69 |
|
70 | char GetCommand (int16_t *lPar1, int16_t *lPar2, char *sComm) {
|
71 | //int8_t iRecStrPtr;
|
72 | int8_t iTmpBufferPtr;
|
73 |
|
74 | iTmpBufferPtr = 0;
|
75 |
|
76 | if (iUartFlags & FLAG_COMM_COMP ) { // Jetzt parsen bis EOS
|
77 |
|
78 | // UsartPuts ("\n\nHier solls nicht hin\n");
|
79 | // iRecStrPtr = 0;
|
80 | // while ((sInBuffer[iTmpBufferPtr] != 0x00) && (sInBuffer[iTmpBufferPtr] != 0x20)) { // Command, max. String Länge aus ISR gesichert
|
81 | // sComm[iRecStrPtr++] = sInBuffer[iTmpBufferPtr++];
|
82 | // }
|
83 | // sComm[iRecStrPtr++] = 0x00;
|
84 |
|
85 | return 1;
|
86 | } else {
|
87 | return 0;
|
88 | }
|
89 |
|
90 | }
|
91 |
|
92 | void UsartPutc(char c) {
|
93 | int temp_Statusreg;
|
94 | temp_Statusreg = SREG;
|
95 | while(!(UCSRA & (1 << UDRE))); // wait until UDR ready
|
96 | UDR = c; // send character
|
97 | SREG = temp_Statusreg;
|
98 | }
|
99 |
|
100 | void UsartPuts (char *s) { // loop until *s != NULL
|
101 | while (*s) {
|
102 | UsartPutc(*s);
|
103 | s++;
|
104 | }
|
105 | }
|
106 |
|
107 | void PrintByteBinaer(char byte) {
|
108 | uint8_t iPos;
|
109 | for (iPos=1; iPos<=8; iPos++) {
|
110 | if (byte & 0x80)
|
111 | UsartPutc(0x31);
|
112 | else
|
113 | UsartPutc(0x30);
|
114 | byte = byte << 1;
|
115 | if (!(iPos & 0x03)) UsartPutc(0x20);
|
116 | }
|
117 | UsartPuts("\n");
|
118 | }
|
119 |
|
120 | // ------------------------------------------------------------ Mainloop
|
121 |
|
122 |
|
123 | int main(void) {
|
124 |
|
125 | InitUsart();
|
126 | InitPorts();
|
127 |
|
128 |
|
129 | // send init string
|
130 | UsartPuts ("\n\nVersion 1.00 Andys Testprogramm\n");
|
131 |
|
132 | if (MCUCSR & (1<<BORF)) // Brown-Out Reset
|
133 | UsartPuts("Brown-Out Reset");
|
134 | else if (MCUCSR & (1<<PORF)) // Power-On Reset
|
135 | UsartPuts("Power-On Reset");
|
136 | else if (MCUCSR & (1<<JTRF)) // JTAG Reset
|
137 | UsartPuts("JTAG Reset");
|
138 | else if (MCUCSR & (1<<EXTRF)) // External Reset
|
139 | UsartPuts("External Reset");
|
140 | else if (MCUCSR & (1<<WDRF)) // Watchdog Reset
|
141 | UsartPuts("Watchdog Reset");
|
142 | else
|
143 | UsartPuts("Manual Jump");
|
144 | UsartPuts ("\nMCUCSR: ");
|
145 | PrintByteBinaer(MCUCSR);
|
146 | MCUCSR &= 0xE0; // Clear Reset-Status
|
147 | UsartPuts ("\n");
|
148 |
|
149 | sei(); // set global interrupts
|
150 |
|
151 | UsartPuts ("\n\nReady\n");
|
152 |
|
153 | while (1) {
|
154 | if (GetCommand(&lCommandPar1, &lCommandPar2, sCommandString) !=0) {
|
155 | UsartPuts("\n");
|
156 | UsartPuts (sCommandString);
|
157 | UsartPuts (" ");
|
158 | UsartPuts (ltoa(lCommandPar1, sOutString, 10));
|
159 | UsartPuts (" ");
|
160 | UsartPuts (ltoa(lCommandPar2, sOutString, 10));
|
161 | UsartPuts (" -> ");
|
162 | UsartPuts("\n>>");
|
163 | }
|
164 | }
|
165 | return 0;
|
166 | }
|