Sehr geehrtes Forum,
ich habe folgendes Problem:
1. Ich möchte gerne bei meinem Atmega88PA bei Kanal ADC0 eine Spannung
messen. Ich habe des Weiteren eine LED an Port D0.
2. Ich lasse eine LED an und ausschalten (so oft, dass man die LED damit
dimmen kann). Die Zeit, in welcher die LED an ist, ist von der, in
welcher die LED aus ist, verschieden. Eine Schaltperiode soll 20ms
dauern, 1 bis 2 ms davon darf die LED an sein, im anderen Teil aus.
3. Die gemessene Spannung soll für eine Varianz zwischen 1 und 2 ms
sorgen, das heißt z.B. dass bei einer gemessenen Spannung von 2,5 V mit
Referenz Spannung von 5V 1,5ms, bei einer gemessenen Spannung von 0 V
nur 1 ms, und bei einer gemessenen Spannung von 5V 2 ms gewartet wird.
4. Ich habe hier diesen Code in C (ich habe voher immer in Assembler
programmiert) und weiß nicht, warum das ganze nicht funktioniert
1 | #define F_CPU 1000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main (void)
|
7 | {
|
8 | DDRD = (1<<0);
|
9 | PORTD |= (0<<0);
|
10 |
|
11 | ADCSRA |= (0<<0); // Taktgeschwindigkeit
|
12 | ADCSRA |= (0<<1);
|
13 | ADCSRA |= (1<<2);
|
14 | ADCSRA |= (0<<3); // Interrupt
|
15 | // ADCSRA |= (1<<4); Wenn Umwandlung erfolgt
|
16 | ADCSRA |= (0<<6); // Free Run AUS
|
17 | ADCSRA |= (1<<7); // Einschalten
|
18 |
|
19 | ADMUX |= (1<<0); // Kanal einstellung
|
20 | ADMUX |= (0<<1);
|
21 | ADMUX |= (0<<2);
|
22 | ADMUX |= (0<<3);
|
23 | ADMUX |= (0<<4);
|
24 |
|
25 | ADMUX |= (0<<5); // Egal
|
26 |
|
27 | ADMUX |= (1<<6); // Referenzspannungseinstellungen
|
28 | ADMUX |= (0<<7);
|
29 |
|
30 | ADCSRA |= (1<<5); // Start Conversion
|
31 |
|
32 | while( 1 )
|
33 | {
|
34 | PORTD ^= (1<<0); // anschalten
|
35 |
|
36 | // Warten bis Messung abgeschlossen
|
37 | while((ADCSRA & 4))
|
38 | ;
|
39 | uint16_t t = ADCH;
|
40 | t *= 2;
|
41 | t *= 2;
|
42 | t *= 2;
|
43 | t *= 2;
|
44 | t *= 2;
|
45 | t *= 2;
|
46 | t *= 2;
|
47 | t *= 2;
|
48 |
|
49 | uint16_t y = 1000;
|
50 | y += t;
|
51 | y /= 2;
|
52 | uint16_t b = 0;
|
53 | while(b<y)
|
54 | b++;
|
55 |
|
56 | ADCSRA |= (1<<5); // Start Conversion
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | PORTD ^= (1<<0); // ausschalten
|
62 | // Rest Warten
|
63 | uint16_t z = 20000-y;
|
64 | z/=2;
|
65 | uint16_t a = 0;
|
66 | while(a<z)
|
67 | a++;
|
68 |
|
69 | }
|
70 |
|
71 | return 0;
|
72 | }
|
5. Ich denke es liegt daran, dass ich den Kanal nicht richtig gewählt
habe, aber es gibt nirgends, auch nicht im Datenblatt des Atmega eine
wirkliche Tabelle, in der man sehen kann wie man die Bits 0 bis 4 von
ADMUX einzustellen hat, um den ADC0 anzusteuern.
6. Ich habe den Mikrocontroller nicht getaktet oder einen Quarz
drangeschlossen, dementsprechend müsste er also die Frequenz 1 MHz
haben.
7. Bitte habt etwas Rücksicht, bin totaler Anfänger.
Danke für eure Antworten,
m.f.G. Developer_X