Forum: Mikrocontroller und Digitale Elektronik Atmega2560, ADC Wert auslesen und versenden


von GS (chromosoma)


Lesenswert?

Abend. Im Moment versuche ich den ADC Wert an ADCO auszulesen und via 
USART an PC  zu versenden. Das versenden von Daten per USART 
funktioniert, aber ich habe noch Promleme mit ADC.
Irgendwie funktioniert es nicht. Hier ist meine Code
Die SerialMonitor bekommt immer  <NULL>
 zugesendet.

Wasmache ich falsch?:)
1
#include <avr/io.h>
2
#define F_CPU 16000000
3
#define USART_BAUDRATE 9600
4
#define BAUD_PRESCALE (F_CPU / 16 / USART_BAUDRATE )
5
6
int main (void)
7
{
8
  int Res;
9
  DDRF = 0<<PF0;
10
  PORTF=1<<PF0;
11
 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescaler to 128 - 125KHz sample rate @ 16MHz
12
13
 ADMUX |= (1<< REFS0);
14
  // Set ADC reference to AVCC
15
 ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading
16
17
 // No MUX values needed to be changed to use ADC0
18
19
20
 ADCSRA |= (1 << ADEN);  // Enable ADC
21
 ADCSRA |= (1 << ADSC);  // Start A2D Conversions
22
  UCSR0B |= (1 << RXEN0) | (1 << TXEN0);   // Turn on the transmission and reception circuitry
23
  UCSR0C |= (0<<UMSEL00)|(1 << UCSZ00) | (1 << UCSZ01); // Use 8-bit character sizes
24
25
   // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
26
  UBRR0 = BAUD_PRESCALE; 
27
  for (;;) // Loop forever
28
  {
29
    Res = ADCL;
30
      
31
      UDR0= Res;
32
    
33
    
34
  
35
   }   
36
}

von troll (Gast)


Lesenswert?

Vielleicht solltest du vorm Auslesen von ADCL darauf warten das die 
Conversion abgeschlossen ist?

von Stefan E. (sternst)


Lesenswert?


von Eumel (Gast)


Lesenswert?

Stefan, vielleicht ist deine Nähe noch ne Stelle als Blockwart frei. 
Schau doch mal nach.

von Stefan E. (sternst)


Lesenswert?

Eumel schrieb:
> Stefan, vielleicht ist deine Nähe noch ne Stelle als Blockwart frei.
> Schau doch mal nach.

Es geht darum, die hilfsbereiten Menschen hier davor zu bewahren, ihre 
Zeit damit zu verschwenden etwas zu schreiben, was dort längst 
abgehandelt wurde.

von GS (chromosoma)


Lesenswert?

troll schrieb:
> Vielleicht solltest du vorm Auslesen von ADCL darauf warten das die
> Conversion abgeschlossen ist?


hm..vielleicht:)




To Stefan.
Ja, CrossPosting erhöht die Wahrscheinlichkeit einer Lösung:)

von Stefan E. (sternst)


Lesenswert?

Anton R. schrieb:
> Ja, CrossPosting erhöht die Wahrscheinlichkeit einer Lösung:)

Cross-Posting ist eine große Respektlosigkeit gegenüber jenen, von denen 
du dir Hilfe erwartest. Du sagst mit einem Cross-Posting nämlich nichts 
anderes, als:
"Ist mir doch egal, ob ihr möglicherweise eure Zeit mit Antworten 
verschwendet, die anderswo längst gegeben wurden. Mir ist nur wichtig, 
dass ich möglichst schnell eine Lösung bekomme."

von GS (chromosoma)


Lesenswert?

Mensch, beruhige dich.
Die Lösung wurde noch nicht gefunden, und falls es eine Lösung geben 
wird, werde ich  auch hier/bei AVRfreaks bescheid sagen.
Und ja, je mehr Menschen  an mein Problem arbeiten, desto schneller wird 
es gelöst, aber ich zwinge ja keinen mir zu helfen, alles freiwillig 
hier.

von Thomas E. (thomase)


Lesenswert?

Anton R. schrieb:
> Die Lösung wurde noch nicht gefunden,
Nicht?
Die steht doch da:
troll schrieb:
> Vielleicht solltest du vorm Auslesen von ADCL darauf warten das die
> Conversion abgeschlossen ist?
ergänzen könnte man noch:...und der UART fertig ist.

Oder was erwartest du von so einem Scheiß:
Anton R. schrieb:
> for (;;) // Loop forever
>
>   {
>     Res = ADCL;
>       UDR0= Res;
>    }

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Anton R. schrieb:

> Ja, CrossPosting erhöht die Wahrscheinlichkeit einer Lösung:)

Ohne respektlos sein zu wollen, aber die Lösung liegt eher darin, zu 
lernen. Wenn ich mir ansehen, welcher Müll auf AVR-Freaks geschrieben 
wurde, dann kann ich nur auf das AVR-GCC-Tutorial verweisen. Und 
zwar sowohl beim Thema UART als auch beim Thema ADC.

von GS (chromosoma)


Lesenswert?

Okey.
nach einigen tutorials und beispielen sieht meine Code jetzt so aus.
Aber es funktioniert trotzdem nicht, wo ist den das problem...?
1
 #include <avr/io.h>
2
#include <util/delay.h>
3
#define F_CPU 16000000
4
#define USART_BAUDRATE 115200
5
#define BAUD_PRESCALE (F_CPU / 16 / USART_BAUDRATE )
6
uint8_t ReadADC(){
7
      
8
      ADCSRA|= (1<<ADSC);
9
10
      //Wait for conversion to complete
11
      while (!(ADCSRA & (1<<ADIF)));
12
13
      // Clear bit ADIF
14
      ADCSRA|= (1<<ADIF);
15
16
      return (ADCH);
17
   }   
18
   void USARTWriteChar(unsigned char data)
19
   {
20
      // Wait until the transmitter is ready
21
      while(!(UCSR0A &(1<<UDRE0)))
22
      {
23
         // Do nothing
24
      }
25
26
      // Write data to USART buffer
27
      UDR0= data;
28
   }
29
int main (void)
30
{
31
   
32
33
unsigned char data;
34
35
   DDRE = 1<<PE4;
36
   DDRF = 0<<PF0;
37
   
38
 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescaler to 128 - 125KHz sample rate @ 16MHz
39
40
 ADMUX |= (1<< REFS0);
41
  // Set ADC reference to AVCC
42
 ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading
43
44
 // No MUX values needed to be changed to use ADC0
45
ADCSRA |=1<<ADATE;
46
 ADCSRA |= (1 << ADEN);  // Enable ADC
47
   UCSR0B |= (1 << RXEN0) | (1 << TXEN0);   // Turn on the transmission and reception circuitry
48
   UCSR0C |= (0<<UMSEL00)|(1 << UCSZ00) | (1 << UCSZ01); // Use 8-bit character sizes
49
// Load upper 8-bits of the baud rate value into the high byte of the UBRR register
50
   UBRR0 = BAUD_PRESCALE;
51
   for (;;){
52
53
54
55
data = ReadADC();
56
57
USARTWriteChar(data);
58
}
59
}

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.