1 | /*
|
2 | * Cocktailmaschine_Mainboard.c
|
3 | *
|
4 | * Created: 26.04.2012 20:35:27
|
5 | * Author: Andreas F.
|
6 |
|
7 | Cocktailmachine Firmware
|
8 | Copyright (C) 2012 Andreas F.
|
9 |
|
10 | This program is free software: you can redistribute it and/or modify
|
11 | it under the terms of the GNU General Public License as published by
|
12 | the Free Software Foundation, either version 3 of the License, or
|
13 | (at your option) any later version.
|
14 |
|
15 | This program is distributed in the hope that it will be useful,
|
16 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
18 | GNU General Public License for more details.
|
19 |
|
20 | You should have received a copy of the GNU General Public License
|
21 | along with this program. If not, see <http://www.gnu.org/licenses/>.
|
22 | */
|
23 |
|
24 | /*-----------------Einstellungen------------------*/
|
25 |
|
26 | #ifndef F_CPU
|
27 | #warning "F_CPU war nicht definiert. Wird jetzt definiert"
|
28 | #define F_CPU 16000000UL
|
29 | #endif
|
30 |
|
31 | /*-------------------Includes---------------------*/
|
32 |
|
33 | #include <avr/io.h>
|
34 | #include <util/delay.h>
|
35 |
|
36 | /*------------Defines für Motor-Pins--------------*/
|
37 |
|
38 | /*Motor 1*/
|
39 | #define en1 PA0
|
40 | #define dir1 PA1
|
41 | #define clk1 PA2
|
42 | #define m1_port PORTA
|
43 |
|
44 | /*Motor 2*/
|
45 | #define en2 PB0
|
46 | #define dir2 PB1
|
47 | #define clk2 PB2
|
48 | #define m2_port PORTB
|
49 |
|
50 | /*Motor 3*/
|
51 | #define en3 PC2
|
52 | #define dir3 PC3
|
53 | #define clk3 PC4
|
54 | #define m3_port PORTC
|
55 |
|
56 | /*Motor 4*/
|
57 | #define en4 PC5
|
58 | #define dir4 PC6
|
59 | #define clk4 PC7
|
60 | #define m4_port PORTC
|
61 |
|
62 | /*------------Defines für Pollin-Board------------*/
|
63 |
|
64 | /*SPI-Bus*/
|
65 | #define MOSI_pin PB5
|
66 | #define MISO_pin PB6
|
67 | #define SCK_pin PB7
|
68 |
|
69 | /*I²C-Bus*/
|
70 | #define SCL_pin PC0
|
71 | #define SDA_pin PC1
|
72 |
|
73 | /*RS232*/
|
74 | #define RXD_pin PD0
|
75 | #define TCD_pin PD1
|
76 |
|
77 | /*LEDs und Taster*/
|
78 | #define Taster1 PD2
|
79 | #define Taster2 PD3
|
80 | #define Taster3 PD4
|
81 | #define LED1 PD5
|
82 | #define LED2 PD6
|
83 | #define Summer PD7
|
84 |
|
85 | /*------------------Konstanten--------------------*/
|
86 |
|
87 | #define BAUDRATE 9600UL
|
88 | #define TIME 500
|
89 |
|
90 | /*------------------------------------------------*/
|
91 |
|
92 | void beep ()
|
93 | {
|
94 | for (int i=0;i<100;i++)
|
95 | {
|
96 | PORTD |= (1<<Summer);
|
97 | _delay_us(500);
|
98 | PORTD &= ~(1<<Summer);
|
99 | _delay_us(500);
|
100 | }
|
101 |
|
102 | for (int i=0;i<100;i++)
|
103 | {
|
104 | PORTD |= (1<<Summer);
|
105 | _delay_us(270);
|
106 | PORTD &= ~(1<<Summer);
|
107 | _delay_us(270);
|
108 | }
|
109 | }
|
110 |
|
111 | void motor1_run(int dir, int steps)
|
112 | {
|
113 | //Enable Bit setzen
|
114 | m1_port |= (1<<en1);
|
115 |
|
116 | //Direction Bit
|
117 | if (dir == 1) m1_port |= (1<<dir1);
|
118 | else m1_port &= ~(1<<dir1);
|
119 |
|
120 | //CLOCK senden
|
121 | for (steps;steps>0;steps--)
|
122 | {
|
123 | m1_port &= ~(1<<clk1);
|
124 | _delay_ms(100);
|
125 | m1_port |= (1<<clk1);
|
126 | _delay_ms(100);
|
127 | }
|
128 | //Enable Bit löschen
|
129 | m1_port &= (1<<en1);
|
130 |
|
131 | }
|
132 |
|
133 | void motor2_run(int dir, int steps)
|
134 | {
|
135 | //Enable Bit setzen
|
136 | m2_port |= (1<<en2);
|
137 |
|
138 | //Direction Bit
|
139 | if (dir == 1) m2_port |= (1<<dir2);
|
140 | else m2_port &= ~(1<<dir2);
|
141 |
|
142 | //CLOCK senden
|
143 | for (steps;steps>0;steps--)
|
144 | {
|
145 | m2_port &= ~(1<<clk2);
|
146 | _delay_ms(100);
|
147 | m2_port |= (1<<clk2);
|
148 | _delay_ms(100);
|
149 | }
|
150 | //Enable Bit löschen
|
151 | m2_port &= (1<<en2);
|
152 |
|
153 | }
|
154 |
|
155 | void motor3_run(int dir, int steps)
|
156 | {
|
157 | //Enable Bit setzen
|
158 | m3_port |= (1<<en3);
|
159 |
|
160 | //Direction Bit
|
161 | if (dir == 1) m3_port |= (1<<dir3);
|
162 | else m3_port &= ~(1<<dir3);
|
163 |
|
164 | //CLOCK senden
|
165 | for (steps;steps>0;steps--)
|
166 | {
|
167 | m3_port &= ~(1<<clk3);
|
168 | _delay_ms(100);
|
169 | m3_port |= (1<<clk3);
|
170 | _delay_ms(100);
|
171 | }
|
172 | //Enable Bit löschen
|
173 | m3_port &= (1<<en3);
|
174 |
|
175 | }
|
176 |
|
177 | void motor4_run(int dir, int steps)
|
178 | {
|
179 | //Enable Bit setzen
|
180 | m4_port |= (1<<en4);
|
181 |
|
182 | //Direction Bit
|
183 | if (dir == 1) m4_port |= (1<<dir4);
|
184 | else m4_port &= ~(1<<dir4);
|
185 |
|
186 | //CLOCK senden
|
187 | for (steps;steps>0;steps--)
|
188 | {
|
189 | m4_port &= ~(1<<clk4);
|
190 | _delay_ms(100);
|
191 | m4_port |= (1<<clk4);
|
192 | _delay_ms(100);
|
193 | }
|
194 | //Enable Bit löschen
|
195 | m4_port &= (1<<en4);
|
196 |
|
197 | }
|
198 |
|
199 | void wodka_lemon()
|
200 | {
|
201 | motor1_run(0,100);
|
202 | motor2_run(0,500);
|
203 | }
|
204 |
|
205 |
|
206 | int main(void)
|
207 | {
|
208 | /*----------------Initialisierung-----------------*/
|
209 | /*Ports konfigurieren 1=Ausgang 0=Eingang*/
|
210 |
|
211 | DDRA = 0b00000111; //MOSI, MISO, SCK, SCL, SDA, RXD und TXD ???
|
212 | DDRB = 0b00000111;
|
213 | DDRC = 0b11111100;
|
214 | DDRD = 0b11100010;
|
215 |
|
216 | /*Grundzustand Ports
|
217 | CLK Signale werden standardmäßig auf HIGH gesetzt (CLOCK von L297 Active Low)*/
|
218 | PORTA = 0b00000100;
|
219 | PORTB = 0b00000100;
|
220 | PORTC = 0b10010000;
|
221 | PORTD = 0b00000000;
|
222 |
|
223 | /*-----------------Hauptprogramm------------------*/
|
224 |
|
225 | beep();
|
226 |
|
227 | while(1)
|
228 | {
|
229 | PORTD &= ~(1<<LED1);
|
230 | PORTD |= (1<<LED2);
|
231 | _delay_ms(TIME);
|
232 |
|
233 | PORTD &= ~(1<<LED2);
|
234 | PORTD |= (1<<LED1);
|
235 | _delay_ms(TIME);
|
236 | }
|
237 |
|
238 | return 0;
|
239 | }
|