1 | #define F_CPU 16000000UL // Angabe der Quarzfrequenz
|
2 | #include <avr/io.h> // Einbindung Datei Ausgänge
|
3 | #include <avr/interrupt.h>
|
4 | #include <stdint.h>
|
5 |
|
6 | #include <stdbool.h>
|
7 | #include <avr/pgmspace.h>
|
8 | #include "main.h" // Aufruf „main“
|
9 | #include "i2clcd.h"
|
10 | #include "i2cmaster.h"
|
11 | #include <util/delay.h>
|
12 |
|
13 | volatile int16_t loop; // Globale Variable warten
|
14 | volatile int16_t tcount; // Globale Variable warten
|
15 |
|
16 | void timer1_init() // Timer 1 16 Bit konfigurieren
|
17 | {
|
18 | TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10); // Einstellung CTC Modus, Prescaler 64
|
19 | TCNT1=0; // Initialisiert Timer
|
20 | OCR1A=6250; // 50ms = 20Hz 12499 6250=40HZ
|
21 | TIMSK1|=(1<<OCIE1A); // Interrupt erlauben
|
22 | sei();
|
23 | }
|
24 |
|
25 | ISR (TIMER1_COMPA_vect) // ISR
|
26 | {
|
27 | PORTA ^= (1<<PA0); // Toggeln PA0 für Motor mit 1ms
|
28 | tcount ++;
|
29 | }
|
30 |
|
31 | void start_text_1 (void)
|
32 | {
|
33 | lcd_command(LCD_CLEAR); // LCD-Anzeige löschen
|
34 | _delay_ms(2); // warte 2ms
|
35 | lcd_printlc(1,1," ATB Board1 mit "); // Zeile 1
|
36 | lcd_printlc(2,1," dem L6208 "); // Zeile 2
|
37 | lcd_printlc(3,1," Zeit Frequenz"); // Zeile 3
|
38 | lcd_printlc(4,1,"1 25 ms 40 Hz "); // zeile 4
|
39 | }
|
40 |
|
41 | int main(void)
|
42 | {
|
43 | i2c_init(); // Starte I2C Bus
|
44 | lcd_init(); // Starte I2CLCD
|
45 | lcd_light(0); // 0=Licht an, 1=Licht aus
|
46 | // Display Befehle
|
47 | lcd_command(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF);
|
48 | // Display ON/OFF / Cursor ON/OFF / Blinken ON/OFF
|
49 |
|
50 | start_text_1(); // Text 1 anzeigen // Text 2 anzeigen
|
51 | _delay_ms(2);
|
52 |
|
53 | tcount = 0; // setzt tcount auf 0
|
54 | timer1_init(); // Initiert Timer (erster Aufruf)
|
55 |
|
56 | DDRA |= (1<<PA0); // PA 0 auf Ausgang - Clock
|
57 | DDRA |= (1<<PA1); // PA 1 auf Ausgang - CW/CCW, links rechts Lauf
|
58 | DDRA |= (1<<PA2); // PA 2 auf Ausgang - EN - Ein
|
59 |
|
60 | DDRC |= (1<<PC6);
|
61 |
|
62 | PORTA |= (1<<PA1); // CW - Schaltet Drehrichtung auf links
|
63 | PORTA |= (1<<PA2); // EN - Motor Einschalten bei 5V
|
64 |
|
65 | while(1) // Beginn Programmschleife while
|
66 | {
|
67 | if(tcount == 400) // Angabe Zeit
|
68 | {
|
69 | loop++;
|
70 | PORTC ^= (1<<PC6); // toggelt PC6
|
71 | tcount = 0;
|
72 | }
|
73 | if (loop==1) // Anzeige 2
|
74 | {
|
75 | OCR1A = 3749; // 15 ms =66,6 Hz
|
76 | _delay_ms(2);
|
77 | lcd_printlc(4,1,"2 15 ms 66,6 Hz"); // zeile 4
|
78 | _delay_ms(2);
|
79 | }
|
80 | if (loop==2) // Anzeige 3
|
81 | {
|
82 | OCR1A = 1249; // 5 ms = 200 Hz
|
83 | _delay_ms(20);
|
84 | lcd_printlc(4,1,"3 5 ms 200 Hz "); // zeile 4
|
85 | _delay_ms(20);
|
86 | }
|
87 | if (loop==6) // Anzeige 4
|
88 | {
|
89 | OCR1A = 249; // 1 ms = 1000 Hz
|
90 | _delay_ms(20);
|
91 | lcd_printlc(4,1,"4 1 ms 1000 Hz"); // zeile 4
|
92 | _delay_ms(20);
|
93 | }
|
94 | if (loop==10) // Anzeige 5
|
95 | {
|
96 | OCR1A = 124; // 0,5 ms = 2000 Hz
|
97 | _delay_ms(20);
|
98 | lcd_printlc(4,1,"5 0,5 ms 2000 Hz"); // zeile 4
|
99 | _delay_ms(20);
|
100 | }
|
101 | if (loop==18)
|
102 | {
|
103 | OCR1A = 249; // 1 ms = 1000 Hz
|
104 | lcd_printlc(4,1,"6 1 ms 1000 Hz "); // zeile 4
|
105 | _delay_ms(2);
|
106 | }
|
107 | if (loop==28)
|
108 | {
|
109 | OCR1A = 1249; // 5 ms = 200 Hz
|
110 | lcd_printlc(4,1,"8 5 ms 200 Hz "); // zeile 4
|
111 | }
|
112 | if (loop==40)
|
113 | {
|
114 | OCR1A = 3749; // 15 ms = 66,6 Hz
|
115 | lcd_printlc(4,1,"9 15 ms 66,6 Hz "); // zeile 4
|
116 | _delay_ms(2);
|
117 | }
|
118 | if (loop==45)
|
119 | {
|
120 | loop=0;
|
121 | }
|
122 | } // ende while
|
123 | } // ende main
|