1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include "seriel.h"
|
4 | #include <stdio.h>
|
5 | #include <avr/interrupt.h>
|
6 | static int uart_putchar(char c, FILE *stream);
|
7 | static int uart_getchar(FILE *stream);
|
8 | static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);
|
9 | static FILE mystdin = FDEV_SETUP_STREAM(NULL, uart_getchar,_FDEV_SETUP_READ);
|
10 |
|
11 | //Interrupts:
|
12 | volatile unsigned int counterUmdrehung = 0;
|
13 | volatile unsigned int umdrehungProSekunde = 0;
|
14 | volatile uint8_t flagUmdrehung = 0;
|
15 | volatile uint8_t flagUmdrehung2 = 0;
|
16 | //volatile unsigned int counterMillisekunden = 0;
|
17 |
|
18 | ISR(INT0_vect){
|
19 | counterUmdrehung ++; //Eine Umdrehung wurde registriert
|
20 | flagUmdrehung2 = 1;
|
21 | }
|
22 |
|
23 | int ms2int(int regelgroesse){
|
24 | //Momentan nicht verwendet
|
25 | float m = -5.0495;
|
26 | float b = 324.53;
|
27 | float result = regelgroesse * m + b;// g(x) = m*x+b m=-2.164, b=414
|
28 | if (result > 255.0) {
|
29 | result = 255.0;
|
30 | }
|
31 | if (result < 0.0) {
|
32 | result = 0.0;
|
33 | }
|
34 | return (int)result;
|
35 | }
|
36 |
|
37 |
|
38 | volatile uint8_t flagUmdrehung3 = 0;
|
39 | volatile unsigned int counterUmdrehung3 = 0;
|
40 | ISR(INT1_vect){
|
41 | //Externer Interrupt 2
|
42 | counterUmdrehung3 ++; //Eine Umdrehung wurde registriert
|
43 | flagUmdrehung3 = 1;
|
44 | }
|
45 |
|
46 | int timerStarten(){
|
47 | // Timer0 konfigurieren
|
48 | TIMSK |= (1<<TOIE0); // den Overflow Interrupt des Timers freigeben
|
49 | TCNT0 = 40; //40 bei Prescaler = 8 und swTeiler = 8
|
50 | TCCR0 = (1<<CS01);// Vorteiler 8, jetzt zählt der Timer bereits
|
51 | return 0;
|
52 | }
|
53 |
|
54 | //Überlauf Timer0 8-Bit
|
55 | volatile unsigned int counterUeberlaeufe = 0;
|
56 | volatile unsigned int millisekunden = 0;
|
57 | volatile unsigned int sekunden = 0;
|
58 | volatile unsigned int counterMillisekunden = 0;
|
59 |
|
60 | ISR( TIMER0_OVF_vect ) // Overflow Interrupt Vector Timer0
|
61 | {
|
62 | static uint8_t swTeiler = 0;
|
63 |
|
64 | swTeiler++;
|
65 | if( swTeiler == 8 ) {
|
66 | swTeiler = 0;
|
67 | millisekunden++;
|
68 | counterMillisekunden++;
|
69 | if (millisekunden == 1000){
|
70 | counterUeberlaeufe++;
|
71 | millisekunden = 0;
|
72 | sekunden++;
|
73 | }
|
74 | }
|
75 | }
|
76 |
|
77 | //Überlauf Timer2 8-Bit
|
78 | volatile unsigned int counterUeberlaeufe2 = 0;
|
79 | volatile unsigned int millisekunden2 = 0;
|
80 | volatile unsigned int sekunden2 = 0;
|
81 | volatile unsigned int counterMillisekunden2 = 0;
|
82 | ISR( TIMER2_OVF_vect ) { // Overflow Interrupt Vector Timer2
|
83 |
|
84 | static uint8_t swTeiler2 = 0;
|
85 |
|
86 | swTeiler2++;
|
87 | if( swTeiler2 == 8 ) {
|
88 | swTeiler2 = 0;
|
89 | millisekunden2++;
|
90 | counterMillisekunden2++;
|
91 | if (millisekunden2 == 1000){
|
92 | counterUeberlaeufe2++;
|
93 | millisekunden2 = 0;
|
94 | sekunden2++;
|
95 | }
|
96 | }
|
97 | }
|
98 |
|
99 |
|
100 | void ADC_init(void){
|
101 | ADCSRA |= (1<<ADEN);//ADC aktivieren
|
102 | ADCSRA |= (1<<ADPS2);//Teilungsfaktor auf 64 stellen
|
103 | ADCSRA |= (1<<ADPS1);
|
104 | }
|
105 |
|
106 | uint16_t ADC_read(uint8_t kanal){
|
107 | ADMUX = kanal;//Kanal des Multiplexers wählen
|
108 | ADCSRA |= (1<<ADSC);//Messung starten
|
109 | while(bit_is_set(ADCSRA,ADSC));
|
110 | return ADCW;
|
111 | }
|
112 |
|
113 |
|
114 | int main(void){
|
115 |
|
116 | da();
|
117 | int i ,j,a=0;
|
118 | int sollwert;
|
119 | int messsignal;
|
120 | int regelgroesse;
|
121 | int Te;
|
122 | int Kr;
|
123 | int Tn;
|
124 | int Tv;
|
125 | int error;
|
126 |
|
127 | USART_Init(16);
|
128 |
|
129 | stdout = &mystdout;
|
130 | stdin = &mystdin; // Anschluss der low-level Routinen????
|
131 |
|
132 | printf("P-Regler gestartet");
|
133 | TCCR1B |= (1<<CS12);
|
134 | TCCR1A |= (1<<WGM10);
|
135 | TCCR1B |= (1<<WGM12);
|
136 | TCCR1A |= (1<<COM1A1) | (1<<COM1B1);
|
137 | OCR1A = 0;
|
138 | DDRD |= (1<<PD4) | (1<< PD5);
|
139 | #define MotorLinks OCR1A
|
140 | //MotorLinks = 255;
|
141 | counterMillisekunden = 0;
|
142 | counterUmdrehung = 0;
|
143 | int zeit = 0;
|
144 | DDRD &= ~(1<<2); //PD2 als Eingang
|
145 | PORTD|= (1<<2); //Pullup aktivieren
|
146 | GICR|=(1<<INT0); //INT0 (INTNULL) enable im General Interupt Control Register
|
147 | MCUCR|=(1<<ISC01)|(1<<ISC00); //Steigende Flanke löst aus
|
148 | sei();
|
149 | sollwert = 30;
|
150 | //sollwert = ms2int(15);
|
151 | //if (MotorLinks == 0 && sollwert > 0) {
|
152 | // MotorLinks = ms2int(sollwert);
|
153 | //}
|
154 | MotorLinks = 255/5; //Motor benötigt Initialgeschwindigkeit um Istgeschwindigkeit messen zu können
|
155 | int ealt = 0;
|
156 | while(1){
|
157 | if (flagUmdrehung2 == 1) {
|
158 | flagUmdrehung2 = 0;
|
159 | TIMSK |= (1<<TOIE0);
|
160 | TCNT0 = 40;
|
161 | TCCR0 = (1<<CS01);
|
162 | messsignal =counterMillisekunden;
|
163 | printf("%d\n",counterMillisekunden);
|
164 | counterMillisekunden = 0;
|
165 | MotorLinks = MotorLinks + messsignal - sollwert;
|
166 | }
|
167 |
|
168 | }
|
169 | }
|
170 |
|
171 | static int uart_putchar(char c, FILE *stream)
|
172 | {
|
173 |
|
174 | if (c == '\n')
|
175 | uart_putchar('\r', stream);
|
176 | loop_until_bit_is_set(UCSRA, UDRE);
|
177 | UDR = c;
|
178 | return 0;
|
179 | }
|
180 |
|
181 | static int uart_getchar(FILE *stream)
|
182 |
|
183 | {
|
184 | char c;
|
185 | loop_until_bit_is_set(UCSRA, RXC);
|
186 | c = UDR;
|
187 | uart_putchar(c, stdout);
|
188 |
|
189 | if (c == '\r')
|
190 | return '\n';
|
191 |
|
192 | return(c);
|
193 | }
|