1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdint.h>
|
4 | #include <lcd.h>
|
5 | /****************************************************************************************
|
6 | Name; Julian Schild
|
7 |
|
8 | C-Programm zur programmierung des µCs für die DA von Schild_Stangl (Simply_Off2009/10).
|
9 |
|
10 | *****************************************************************************************/
|
11 | //Globale Variablen
|
12 | volatile unsigned short int usiMinute=0;
|
13 |
|
14 | //Funktionsdeklaration (Prototypen)
|
15 |
|
16 | //ADC Init.
|
17 | void vinitADU_8Bit(unsigned short int);
|
18 | //Timer Init.
|
19 | void vinitTimer_16Bit();
|
20 |
|
21 | int igetADU_8Bit(unsigned short int);
|
22 |
|
23 | //******************************************************************************************
|
24 | void main (void)
|
25 | {//Variablen Definition
|
26 | char cPuffer[50];
|
27 | int iPuffer=0,iWait=0,iWait2=0;
|
28 |
|
29 | //Deklaration der PORTS --> "Richtung"
|
30 | DDRD = 0xff; //0xff --> Ausgang --> LCD
|
31 | DDRC = 0x00; //0x00 --> Eingang --> ADU
|
32 | DDRB = 0xff; // Ausgang für Testzwecke --> LEDs
|
33 | PORTB = 0x00;
|
34 |
|
35 |
|
36 | //Initialisierung des ADCs
|
37 | vinitADU_8Bit(0);
|
38 |
|
39 | //Initialisierung des Timers
|
40 | void vinitTimer_16Bit();
|
41 |
|
42 |
|
43 | /* Initialisiere Display, Cursor aus*/
|
44 | lcd_init(LCD_DISP_ON);
|
45 |
|
46 | /* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
|
47 | lcd_clrscr();
|
48 |
|
49 | /* String auf Display anzeigen */
|
50 | lcd_puts("Willkommen");
|
51 |
|
52 | //Warten, dass Wilkommen nicht gleich wieder weg ist
|
53 | for (iWait;iWait<1000;iWait++)
|
54 | {
|
55 | for (iWait2;iWait2<1000;iWait2++);
|
56 | iWait2=0;
|
57 | }
|
58 | iWait=0;
|
59 |
|
60 | while(1)
|
61 | {
|
62 | if (igetADU_8Bit(2)<5)
|
63 | {
|
64 | //TCCR1B |= ((1<<CS12)|(1<<CS10)); //Timer einschalten
|
65 | iPuffer=(40*igetADU_8Bit(0))/51*100;
|
66 | // Typ konvertierung für "lcd_puts"- Funktion
|
67 | itoa(iPuffer,cPuffer, 10); // (int Variable, char Variable, Basis (binär, dezimal, hex)
|
68 |
|
69 | //Ausgabe am LCD
|
70 | lcd_clrscr(); // LC-Display löschen und Kursor auf Pos. 1
|
71 | lcd_puts(cPuffer); // String am Display ausgeben
|
72 |
|
73 | }
|
74 |
|
75 | else if (igetADU_8Bit(2)>50)
|
76 | {
|
77 | //TCCR1B &= ~(0x03); //Timer ausschalten
|
78 | usiMinute=0; //Minuten Zähler zurücksetzen
|
79 |
|
80 | lcd_clrscr(); // LC-Display löschen und Kursor auf Pos. 1
|
81 | lcd_puts("Betrieb"); // String "Betrieb" am Display ausgeben
|
82 | }
|
83 | }
|
84 | }
|
85 |
|
86 |
|
87 | //////////////////////////////////////////////
|
88 | //Funktionen //
|
89 | //////////////////////////////////////////////
|
90 |
|
91 | void vinitADU_8Bit(unsigned short int usimux)
|
92 | {//Eigene Funktion zur ADU Initialisierung damit diese nicht ständig ausgeführt werden muss
|
93 | int iresult;
|
94 | ADMUX = usimux; // Kanal waehlen
|
95 | ADMUX |= 0x60; // AVCC als Referenzspannung nutzen und Ergebnis soll linksbündig sein (nur ADCH)
|
96 | ADCSRA |= 0x85; // Frequenzvorteiler
|
97 | // setzen auf 8 (1) und ADC aktivieren (1)
|
98 |
|
99 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
100 | also einen Wert und verwirft diesen, um den ADC "warmlaufen" zu lassen*/
|
101 |
|
102 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
103 |
|
104 | while(ADCSRA&(1<<ADSC))
|
105 | {
|
106 | // auf Abschluss der Konvertierung warten
|
107 | }
|
108 |
|
109 | iresult = ADCH; // ADCH muss einmal gelesen werden,
|
110 | // sonst wird Ergebnis der nächsten Wandlung
|
111 | // nicht übernommen.
|
112 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren
|
113 |
|
114 | iresult = 0;
|
115 | }
|
116 |
|
117 |
|
118 | int igetADU_8Bit(unsigned short int usimux)
|
119 | { int iresult;
|
120 |
|
121 | ADMUX &= 0xF0;
|
122 | ADMUX |= usimux; // Kanal waehlen
|
123 | ADCSRA |= 0x80; //ADC aktivieren (1)
|
124 |
|
125 |
|
126 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
127 | while ( ADCSRA & (1<<ADSC) )
|
128 | {
|
129 | // auf Abschluss der Konvertierung warten
|
130 | }
|
131 |
|
132 | iresult = ADCH; // Wandlungsergebnisse abholen
|
133 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
|
134 |
|
135 | return iresult;
|
136 | }
|
137 |
|
138 | //Timer Initialisierung
|
139 | void vinitTimer_16Bit()
|
140 | {
|
141 | TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10); // CTC + Prescaler 1024 --> CPU/1024
|
142 | // 8MHz/1024=7812,5Hz
|
143 | TIMSK |= (1<<TOIE0); // Overflow Interrupt erlauben
|
144 | sei(); // Interrupts erlauben
|
145 | }
|
146 |
|
147 | ISR(TIMER0_OVF_vect)
|
148 | {
|
149 | usiMinute++; //Merker inkrementieren
|
150 | PORTB = ~PORTB; //Kontrollausgabe ob Timer Überlauf kommt
|
151 | if(usiMinute>=8) //Nach 8 Überläufen ca. 1min
|
152 | {
|
153 | usiMinute=0; //Merker zurück setzen
|
154 | PORTB = ~0x01; //Abschalt Signal
|
155 | }
|
156 | }
|