Hallo Leute, ich habe erst vor kurzem mit uC-Programmierung begonnen und bin praktisch noch ganz am Anfang. Zur Zeit versuche ich, ein Bisschen mit dem ADC herumzuspielen und je nach Spannungsbereich verschiedene LEDs schalten zu lassen. Allerdings blinken die LEDs bei mir immer nur und schalten nie auf 'Dauerlicht'. Ich bin dankbar fuer jeden Hinweis... Gruss, Pipesmoker
1 | #define F_CPU 4000000UL /* 4 MHz Interner Oszillator */ |
2 | #include <avr/io.h> |
3 | #include <inttypes.h> |
4 | #include <util/delay.h> |
5 | |
6 | /* Funktion fuer Verzoegerung um eine ms (4 Takte) */
|
7 | void delay_ms(uint16_t ms) { |
8 | while ( ms ) |
9 | {
|
10 | delay_ms(1); |
11 | ms--; |
12 | ms--; |
13 | ms--; |
14 | ms--; |
15 | }
|
16 | }
|
17 | |
18 | |
19 | /* ADC initialisieren */
|
20 | void ADC_Init(void) { |
21 | uint16_t result; |
22 | ADMUX = (1 << REFS1) | (1 << REFS0); //interne Referenzspannung nutzen |
23 | ADCSRA = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); //Frequenzvorteiler nutzen |
24 | ADCSRA |= (1 << ADEN); //ADC aktivieren |
25 | ADCSRA |= (1 << ADSC); //eine ADC-Probewandlung |
26 | while (ADCSRA & (1 << ADSC) ) {} //Auf Abschluss der Probewandlung warten |
27 | result = ADCW; |
28 | }
|
29 | |
30 | |
31 | /* Mehrfachmessung mit Mittelwert */
|
32 | uint16_t ADC_Read_Avg(uint8_t channel, uint8_t average) |
33 | {
|
34 | uint32_t result = 0; //Ergebnis initialisieren |
35 | |
36 | uint8_t i; |
37 | for (i=0; i < average; ++i) |
38 | {
|
39 | result += ADC_Read(channel); //average Messungen ausfuehren |
40 | }
|
41 | |
42 | return (uint16_t)(result / average); //Mittelwert bilden |
43 | }
|
44 | |
45 | |
46 | int main (void) |
47 | {
|
48 | uint16_t adcval; |
49 | ADC_Init(); //Initialisierungsfunktion mit Probemessung |
50 | |
51 | // 11 Ausgaenge definieren
|
52 | DDRB = 0xff; //alle PB-Pins als Ausgang definieren (=8 Stueck) |
53 | DDRC |= (1 << PC3) | (1 << PC4) | (1 << PC5); //Ausgang PC3, 4 und 5 |
54 | |
55 | DDRC &= ~((1 << PC6) | (1 << PC2) | (1 << PC1) | (1 << PC0)); |
56 | |
57 | while (1) //Endlosschleife |
58 | {
|
59 | |
60 | adcval = ADC_Read_Avg(0, 10); //Mehrfachmessung, Kanal 0, 10 Messungen |
61 | |
62 | if (adcval > 512) |
63 | {
|
64 | PORTC &= ~(1 << PC3); |
65 | |
66 | }
|
67 | |
68 | else if (adcval <= 512) |
69 | {
|
70 | PORTC &= ~(1 << PC5); |
71 | }
|
72 | |
73 | }
|
74 | }
|
Hoffe, ihr koennt mir weiterhelfen...