AD - Wandlung

OP #2123534
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
}
Gast #2123633
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren