Forum: Mikrocontroller und Digitale Elektronik AD - Wandlung


von Hüsameddin N. (hsameddin_n)


Lesenswert?

Hallo Leute,
ich habe ein Programm geschrieben mitdem man an einem Eingang AD - 
Wandeln konnte. Jetzt habe ich das Programm umgeschrieben sodass es nun 
für 2 Eingänge möglich sein sollte. Jedoch funktioniert die methode 
nicht mitder ich das gemacht habe.... was müsste ich wie ändern damit es 
geht. Es sollen immer 2 Messignale vom ADC0 und 2 Messignale vom ADC1 an 
die serielle Schnittstelle gesendet werden.

Danke LG Thomas
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#define FOSC 12000000UL  //12MHz Taktfrequenz
4
#define BAUD 9600UL    //9600 Baud
5
#define MYUBRR (FOSC/(16*BAUD))-1
6
7
/* ADC initialisieren */
8
void ADC_Init(void) {
9
uint16_t result;
10
ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
11
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
12
ADCSRA |= (1<<ADEN); // ADC aktivieren
13
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
14
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
15
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
16
while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
17
/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
18
Wandlung nicht übernommen. */
19
result = ADCW;
20
}
21
22
23
while (1)
24
{
25
/***************************************************************************************************************/
26
27
for(i=0;i<=2;i++)
28
{
29
/* ADC Einzelmessung */
30
31
uint16_t ADC_Read( uint8_t channel )
32
{
33
// Kanal waehlen, ohne andere Bits zu beeinflußen
34
35
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);  //Channel ADC0
36
37
38
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
39
while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten
40
;
41
return ADCW; // ADC auslesen und zurückgeben
42
}
43
44
void USART_Transmit( unsigned char data )
45
{
46
  while (!(UCSRA &(1<<UDRE)))
47
    ;
48
49
  UDR = data;
50
}
51
52
void USART_Transmit_String( char* s )
53
{
54
  while( *s != '\0' ) 
55
  {
56
    USART_Transmit( *s );
57
    ++s;
58
  }
59
}
60
61
int main (void)
62
{
63
64
 UBRRH=(unsigned char)(MYUBRR>>8); //4 höheren Bits des UBRR
65
 UBRRL=(unsigned char) MYUBRR; //4 niedere Bits des UBRR
66
67
 UCSRB=(1<<RXEN)|(1<<TXEN); //Empfangen und Senden ermöglichen
68
 UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //UCSRC Register wählen und via Z1 und Z0 8bit als Ergebnisslänge zum Einlesen festlegen
69
70
ADC_Init();
71
72
73
char Werte[10];
74
75
while(1)
76
{
77
78
int i = ADC_Read(0);
79
80
    itoa( i, Werte, 10 );
81
    USART_Transmit_String( Werte );
82
    USART_Transmit( ' ' );
83
84
}
85
}
86
}
87
88
/******************************************************************************************************************/
89
90
for(b=0;i<=2;i++)
91
{
92
/* ADC Einzelmessung */
93
94
uint16_t ADC_Read( uint8_t channel )
95
{
96
// Kanal waehlen, ohne andere Bits zu beeinflußen
97
98
ADMUX = 1;        //Channel ADC1
99
100
101
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
102
while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten
103
;
104
return ADCW; // ADC auslesen und zurückgeben
105
}
106
107
void USART_Transmit( unsigned char data )
108
{
109
  while (!(UCSRA &(1<<UDRE)))
110
    ;
111
112
  UDR = data;
113
}
114
115
void USART_Transmit_String( char* s )
116
{
117
  while( *s != '\0' ) 
118
  {
119
    USART_Transmit( *s );
120
    ++s;
121
  }
122
}
123
124
int main (void)
125
{
126
127
 UBRRH=(unsigned char)(MYUBRR>>8); //4 höheren Bits des UBRR
128
 UBRRL=(unsigned char) MYUBRR; //4 niedere Bits des UBRR
129
130
 UCSRB=(1<<RXEN)|(1<<TXEN); //Empfangen und Senden ermöglichen
131
 UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //UCSRC Register wählen und via Z1 und Z0 8bit als Ergebnisslänge zum Einlesen festlegen
132
133
ADC_Init();
134
135
136
char Werte[10];
137
138
while(1)
139
{
140
141
int i = ADC_Read(0);
142
143
    itoa( i, Werte, 10 );
144
    USART_Transmit_String( Werte );
145
    USART_Transmit( ' ' );
146
147
}
148
}
149
}
150
151
152
}

von spess53 (Gast)


Lesenswert?

Hi

>// Kanal waehlen, ohne andere Bits zu beeinflußen

>ADMUX = 1;        //Channel ADC1

Wirklich?

MfG Spess

von Helfer (Gast)


Angehängte Dateien:

Lesenswert?

Oje, das ist ja ein wilder Mix in deinem Sourcecode. 
Funktionsdefinitionen doppelt und mitten in Anweisungsblöcken. Da ist 
ein C-Kurs in die Hose gegangen :(

von Helfer (Gast)


Lesenswert?

Anm.:

>  UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //UCSRC Register wählen ...

Das sollte man nicht mit |= machen, sondern mit der direkten Zuweisung 
=, wenn UCSRC und UBRR am gleichen Speicherplatz liegen und URSEL 
entscheidet, auf welches Spezialregister zugegriffen wird.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#UART_initialisieren

>       itoa( adc_wert, Werte, 10 );

Hier ist utoa sinnvoller.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.