1 | 1 //Progamm Regler_04.c
|
2 | 2 //
|
3 | 3 //INT0 = Impulse Master (ca. 25 Hz)
|
4 | 4 //INT1 = Impulse Antrieb
|
5 | 5 //Zeitmessung/Impulse mit Timer0
|
6 | 6 //AVR ATMega8 mit 11,0592 MHz-Quarz
|
7 | 7
|
8 | 8 //************************************************************************
|
9 | 9 #define F_CPU 11059200L
|
10 | 10 #include <avr/io.h>
|
11 | 11 #include <stdio.h>
|
12 | 12 #include <avr/interrupt.h>
|
13 | 13 #include <util/delay.h>
|
14 | 14
|
15 | 15 #undef putchar
|
16 | 16 #define putchar my_putchar
|
17 | 17 #undef puts
|
18 | 18 #define puts my_puts
|
19 | 19
|
20 | 20 #define bauddivider (unsigned int)(35) //9600 Baud=71 , 19200 Baud =35
|
21 | 21 volatile int abstand = 0;
|
22 | 22 volatile int start = 0;
|
23 | 23 volatile int ueb0 = 0; //Überlaufzähler Zähler0
|
24 | 24 volatile int soll_abstand = 200; //Differenz INT0 und INT1
|
25 | 25 volatile int topwert = 1658; //Zählerendwert, 1658 ergibt ca. 3333 Hz
|
26 | 26 //ICR1=(Takt/(2*Teiler)/Sollfrequenz)-1
|
27 | 27 //************************************************************************
|
28 | 28 void softstart(int max_topwert)
|
29 | 29 {
|
30 | 30 int z;
|
31 | 31 for(z=6000; z>=max_topwert; z--){ ICR1 = z;_delay_ms(0.2);} //Softstart für Schrittmotor
|
32 | 32 }
|
33 | 33 //************************************************************************
|
34 | 34 void putchar( char c )
|
35 | 35 {
|
36 | 36 while( (UCSRA & 1<<UDRE) == 0 );
|
37 | 37 UDR = c;
|
38 | 38 }
|
39 | 39
|
40 | 40 void puts( char *s )
|
41 | 41 {
|
42 | 42 while( *s )
|
43 | 43 putchar( *s++ );
|
44 | 44 }
|
45 | 45 //************************************************************************
|
46 | 46 void ser_ausgabe(int v0) //Ausgabe auf serielle Schnittstelle
|
47 | 47 {
|
48 | 48 char fs[20];
|
49 | 49 //sprintf(fs,"T0 %5d\r\n",v0);
|
50 | 50 sprintf(fs," %5d\\",v0);
|
51 | 51 puts(fs);
|
52 | 52 }
|
53 | 53 //************************************************************************
|
54 | 54 ISR (TIMER0_OVF_vect) //Timer0-Überlaufzähler
|
55 | 55 {
|
56 | 56 ueb0++;
|
57 | 57 }
|
58 | 58 //************************************************************************
|
59 | 59 ISR(INT0_vect) // Zeitmessung Timer0
|
60 | 60 {
|
61 | 61 abstand=0;
|
62 | 62 ueb0=0;
|
63 | 63 TCNT0=0;
|
64 | 64 TCCR0 |= (1<<CS01) | (1<<CS00); //Timer0 starten 64-Teiler
|
65 | 65 PORTD |= (1<<PD7);
|
66 | 66 GIFR |= (1<<INTF0)|(1<<INTF1); //INT-Flags löschen
|
67 | 67 GICR &= ~(1<<INT0); //INT0 disabled
|
68 | 68 GICR |= (1<<INT1); //INT1 enabled
|
69 | 69 //GICR &= ~(1<<INT0); //INT0 disabled
|
70 | 70 }
|
71 | 71 //************************************************************************
|
72 | 72 ISR(INT1_vect)
|
73 | 73 {
|
74 | 74 TCCR0=0; //Timer0 stoppen
|
75 | D:\Filmprojektor\AVRStudio_62\Regler_04\Regler_04.c 2
|
76 | 75 PORTD &= ~(1<<PD7);
|
77 | 76 abstand=(ueb0*256)+TCNT0;
|
78 | 77 GIFR |= (1<<INTF0)|(1<<INTF1); //INT-Flags löschen
|
79 | 78 GICR &= ~(1<<INT1); //INT1 disabled
|
80 | 79 }
|
81 | 80 //************************************************************************
|
82 | 81 int main(void)
|
83 | 82 {
|
84 | 83 DDRD |= (1<<PD7); //Prüfausgang Zählzeit
|
85 | 84 DDRB = (1<<PB1); //OC1A auf Ausgang
|
86 | 85 DDRB &= ~(1<<PB0) & ~(1<<PB2); //PB0 und PB2 auf Eingang
|
87 | 86 PORTB = (1<<PB0) | (1<<PB2); //Pullup Ein an PB0 und PB2
|
88 | 87 TCCR1A = (1<<COM1A0); //OC1A PWM aus
|
89 | 88 TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10); //
|
90 | 89 DDRD &= ~(1<<PD2) & ~(1<<PD3); //Int0 und Int1 auf Eingang
|
91 | 90 PORTD &= ~(1<<PD2); //Kein Pullup
|
92 | 91 PORTD = (1<<PD3); //Pullup
|
93 | 92 MCUCR |= (1<<ISC01) | (1<<ISC11); //Int0 und Int1 auf fallende Flanke
|
94 | 93 MCUCR &= ~(1<<ISC00) & ~(1<<ISC10);
|
95 | 94 TIMSK |= (1<<TOIE0); //Overflow Timer0 erlauben
|
96 | 95 GIFR |= (1<<INTF0)|(1<<INTF1); //INT-Flags löschen
|
97 | 96 GICR &= ~(1<<INT0); //INT0 disabled
|
98 | 97 GICR &= ~(1<<INT1); //INT1 disabled
|
99 | 98 SREG |= (1<<SREG_I); //Globalen Interrupt freigeben
|
100 | 99 UBRRL = bauddivider; //set baud rate
|
101 | 100 UCSRA = 0; //no U2X, MPCM
|
102 | 101 UCSRC = 1<<URSEL^1<<UCSZ1^1<<UCSZ0; //8 Bit
|
103 | 102 UCSRB = 1<<RXEN^1<<TXEN; //enable RX, TX
|
104 | 103
|
105 | 104 while(1)
|
106 | 105 {
|
107 | 106 //ser_ausgabe(100);
|
108 | 107 if (!start)
|
109 | 108 {
|
110 | 109 if (!(PINB & (1<<PINB0)))
|
111 | 110 {
|
112 | 111 ICR1=6000;
|
113 | 112 }
|
114 | 113 else
|
115 | 114 {
|
116 | 115 ICR1=0;
|
117 | 116 }
|
118 | 117 }
|
119 | 118 if (!(PINB & (1<<PINB2)))
|
120 | 119 {
|
121 | 120 start=1;
|
122 | 121 softstart(topwert);
|
123 | 122 }
|
124 | 123 if (start)
|
125 | 124 {
|
126 | 125 //_delay_ms(10);
|
127 | 126 if(abstand>(soll_abstand+2)) topwert--;
|
128 | 127 if(abstand<(soll_abstand-2)) topwert++;
|
129 | 128 if(topwert>1661) topwert=1661;
|
130 | 129 if(topwert<1655) topwert=1655;
|
131 | 130 ICR1=topwert;
|
132 | 131 //_delay_ms(200);
|
133 | 132 //ser_ausgabe(abstand);
|
134 | 133 _delay_ms(10);
|
135 | 134 //ser_ausgabe(ueb0);
|
136 | 135 GIFR |= (1<<INTF0)|(1<<INTF1); //INT-Flags löschen
|
137 | 136 GICR |= (1<<INT0); //INT0 enabled
|
138 | 137 }
|
139 | 138 }
|
140 | 139 }
|
141 | 140 //******Ende Programm Regler_04.c******************************
|
142 | 141
|