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 | }
|