1 | #ifdef F_CPU
|
2 | #undef F_CPU
|
3 | #define F_CPU 16000000UL
|
4 | #endif
|
5 |
|
6 | #include <avr/io.h>
|
7 | #include <inttypes.h>
|
8 | #include <util/delay.h>
|
9 | #include <stdint.h>
|
10 | #include <stdio.h>
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | // Diese Beispiel zeigt die Anwendung des ADC eines ATmega169
|
16 | // unter Verwendung der internen Referenzspannung von nominell 1,1V.
|
17 | // Zur Anpassung an andere AVR und/oder andere Referenzspannungen
|
18 | // siehe Erläuterungen in diesem Tutorial und im Datenblatt
|
19 |
|
20 | /* ADC initialisieren */
|
21 | void ADC_Init(void)
|
22 | {
|
23 | // die Versorgungsspannung AVcc als Referenz wählen:
|
24 | //ADMUX = (1<<REFS0);
|
25 | // oder interne Referenzspannung als Referenz für den ADC wählen:
|
26 | ADMUX = (1<<REFS1) | (1<<REFS0);
|
27 |
|
28 | // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
|
29 | // schon auf 0, also single conversion
|
30 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
|
31 | ADCSRA |= (1<<ADEN); // ADC aktivieren
|
32 |
|
33 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
|
34 | liest
|
35 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
|
36 | lassen" */
|
37 |
|
38 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
39 | while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten
|
40 | }
|
41 | /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
|
42 | Wandlung nicht übernommen. */
|
43 | (void) ADCW;
|
44 | }
|
45 |
|
46 | /* ADC Einzelmessung */
|
47 | uint16_t ADC_Read( uint8_t channel )
|
48 | {
|
49 | // Kanal waehlen, ohne andere Bits zu beeinflußen
|
50 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
|
51 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
52 | while (ADCSRA & (1<<ADSC) ) { // auf Abschluss der Konvertierung warten
|
53 | }
|
54 | return ADCW; // ADC auslesen und zurückgeben
|
55 | }
|
56 |
|
57 |
|
58 | void USART_Init( unsigned int baud )
|
59 | {
|
60 | /*Set baud rate*/
|
61 | UBRR0H = (unsigned char)(baud>>8);
|
62 | UBRR0L = (unsigned char)baud;
|
63 | /* Enable receiver and transmitter*/
|
64 | UCSR0B = (1<<RXEN0)|(1<<TXEN0);
|
65 | /* Set frame format: 8data, 2stop bit*/
|
66 | UCSR0C = (1<<USBS0)|(3<<UCSZ00);
|
67 | }
|
68 |
|
69 |
|
70 | void USART_Transmit( unsigned char data )
|
71 | {
|
72 | /* Wait for empty transmit buffer*/
|
73 | while
|
74 | ( !( UCSR0A & (1<<UDRE0)) );
|
75 | /* Put data into buffer, sends the data*/
|
76 | UDR0 = data;
|
77 | }
|
78 |
|
79 | void uart_puts( char *s )
|
80 | {
|
81 | /* while *s != '\0' so unequally "string-end characters (terminator)
|
82 | */
|
83 | while (*s)
|
84 | {
|
85 | USART_Transmit(*s);
|
86 |
|
87 | s++;
|
88 | }
|
89 | }
|
90 |
|
91 |
|
92 | void main(void)
|
93 | {
|
94 | USART_Init(0x6);
|
95 | char String[32] = {"Test "};
|
96 | long ADCWert;
|
97 | ADC_Init();
|
98 | //ADCWert = 123;
|
99 | while(1)
|
100 | {
|
101 | ADCWert = ADC_Read(0b01111);//Seite 249 Datenblatt Kanal 2,3
|
102 | //ADCWert = (ADCWert - ADCWert) + (ADCWert - 0.65) / 0.5825;
|
103 | //ADCWert = ((ADCWert * 582) / 1000);
|
104 | sprintf(String,"Waage2: %i g \n", ADCWert);
|
105 | uart_puts(String);
|
106 | //USART_Transmit(S);
|
107 | _delay_ms(100);
|
108 | }
|
109 |
|
110 | }
|