ADC_Senden.c


1
#include <avr/io.h>
2
#include <avr/signal.h>
3
#include <avr/interrupt.h>
4
#define BAUD 9600L
5
#define F_CPU 12000000L
6
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)      
7
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //reale Baudrate
8
9
volatile uint16_t werte[256];
10
volatile uint8_t messen=0;      //Zählvariable für die Messungen
11
int x;
12
13
void usart_init(void)
14
{
15
    UCSRB = (1<<RXEN) |(1<<TXEN);              // UART RX/TX einschalten
16
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // Asynchron 8N1 
17
 
18
    UBRRH = UBRR_VAL >> 8;
19
    UBRRL = UBRR_VAL & 0xFF;
20
}
21
22
void timer_init(void)
23
{
24
  //Timer initialisieren
25
   TCCR1A = 0x00;
26
   TCCR1B = 0x0B;          //Prescaler 64, CTC-Mode
27
   OCR1A = 20000;          //Vergleiswert setzten
28
   TIMSK = (1<<OCIE1A);     //OC-Interrupt aktivieren
29
   
30
}
31
32
void senden(unsigned char *zeiger)
33
{
34
  while(*zeiger !=0)
35
  {
36
    loop_until_bit_is_set(UCSRA,UDRE); /* warten bis Senden moeglich */
37
    UDR = *zeiger;
38
    zeiger++;  
39
  }
40
}
41
42
int adc(void)
43
{
44
  ADCSR=0xC6;            // ADC Einstellen und Starten
45
    while (bit_is_set(ADCSR,6));    // Warten bis Umwandlung von PINC0 erfolgt ist.
46
    x=ADC;                          // Wert aus dem ADC holen
47
  return x;
48
}
49
50
ISR(TIMER1_COMPA_vect)
51
{
52
   if (messen<256)
53
   {
54
      messen++;
55
      werte[messen]=adc();
56
   }
57
}
58
59
void main(void)
60
{
61
  usart_init();
62
  timer_init();
63
  sei();
64
65
  while(1)
66
  {
67
    messen=0;
68
      while(messen<256);
69
      senden(werte);
70
  }
71
}