1 | // Port A: PA0..PA3 BCD Einer
|
2 | // Port A: PA4..PA7 BCD Zehner
|
3 | // Port C: PC4..PC7 BCD Hunderter
|
4 | // Port D: PD2 Start-LS, PD3 Stopp-LS
|
5 |
|
6 | #include <avr/io.h> // Deklarationen
|
7 | #include <avr/interrupt.h> // für Interrupt
|
8 | #define TAKT 15872000 // 15.872 MHz: 256 = 62000:62 = 1000 Hz = 1 ms
|
9 | unsigned int volatile sek=0, msek=0; // globale Word-Variable
|
10 | unsigned char volatile izaehl=1, fehl=0; // globale Byte-Variable
|
11 | float m_Strecke_d=99; // MESSSTRCKE IN CM
|
12 | ISR (TIMER0_OVF_vect) // Timer0 Überlauf
|
13 | {
|
14 | izaehl++;if(izaehl > 62) // Interruptzähler
|
15 |
|
16 | {
|
17 | izaehl = 1; msek++;
|
18 | if(msek >= 1000) { msek=0; sek++; } // Zähler erhöhen
|
19 | if(sek >= 3) fehl = 1; // Überlauf-Fehlermarke setzen
|
20 | }
|
21 | }
|
22 |
|
23 | void main(void)
|
24 | {
|
25 | unsigned char auskmhh, auskmhl;
|
26 | unsigned int time=0;
|
27 | int kmh;
|
28 | DDRA = 0xff; // Port A sind Ausgänge
|
29 | DDRC = 0xf0; // Port C PD4..PD7 sind Ausgänge
|
30 | TIMSK |= 1 << TOIE0; // Timer0 Interrupt frei
|
31 | TCNT0 = 0; // Timer0 löschen
|
32 | PORTC = 0b00110000; // Anzeige "---"
|
33 | PORTA = 0b00110011;
|
34 | while (PIND & (1 << PIND2)); // warte auf erste fallende Flanke PD2
|
35 | while (1) // Arbeitsschleife
|
36 | {
|
37 | TCCR0 = 1 << CS00; sei(); // Timer0 start Teiler=1 Interrupt frei
|
38 | PORTA = 0b00000000; PORTC = 0b00000000; // Anzeige " " während der Messung
|
39 | while(PIND & (1 << PIND3)); // wartet auf fallende Flanke PD3
|
40 | TCCR0 = 0; cli(); // Timer0 stopp Interrupt sperren
|
41 | time = (sek*1000) + (msek); // Berechnung der Zeit in ms
|
42 | kmh= (m_Strecke_d/time)*360; // Berechnung der Geschwindigkeit
|
43 | auskmhh = ((kmh/100) << 4) ; // KM/H Hunderter in BCD
|
44 | auskmhl = (((kmh%100)/10)<<4) | (kmh%10); // KM/H Zehner und Einer in BCD
|
45 | TCNT0 = 0; izaehl = 1; msek = 0; sek = 0;
|
46 | while (PIND & (1 << PIND2)) // warte auf fallende Flanke
|
47 | {
|
48 | if (fehl ==1) { PORTA = 0b01000100; PORTC = 0b01010000;} // Fehlermarke "E r r"
|
49 | if (fehl ==0)
|
50 | {
|
51 | if (kmh>=255)
|
52 | {
|
53 | PORTC=0b01010000;
|
54 | PORTA=0b01000100;
|
55 | }
|
56 | if (kmh>=100)
|
57 | {
|
58 | PORTC=~auskmhh;
|
59 | PORTA=~auskmhl;
|
60 | }
|
61 | if (kmh<=99)
|
62 | {
|
63 | PORTC = 0b00000000;
|
64 | PORTA = ~auskmhl;
|
65 | }
|
66 | }
|
67 | } // Ende while wartet auf fallende Flanke
|
68 | fehl = 0;
|
69 | } // Ende while Arbeitsschleife
|
70 | } // Ende main
|