Atmega2560, ADC Wert auslesen und versenden

OP #2835884
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
}
#2835904
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."
OP #2835915
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.
#2835920
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.
OP #2836462
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
}

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