Hallo Leute,
ich versuche gerade über den den PC0 Per internen ADC die spannung
einzulesen die an diesem liegt und das ganze über Uart an den PC zu
senden:
Mein Code sieht wie folgt aus
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #define F_CPU 4000000
|
4 | #include <util/delay.h>
|
5 | #define BAUD 9600
|
6 | #define UBRR_VAL F_CPU/16/BAUD-1
|
7 |
|
8 |
|
9 | volatile uint16_t result;
|
10 | volatile uint16_t wert;
|
11 | uint8_t i;
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | void delay_ms(int delay) {
|
17 | int i;
|
18 | for (i=0;i<=delay;i++) {
|
19 | _delay_ms(1);
|
20 | }
|
21 | }
|
22 |
|
23 | void init_uart(unsigned int ubrr) {
|
24 | UBRRH = (unsigned char)(ubrr>>8);
|
25 | UBRRL = (unsigned char)(ubrr);
|
26 | UCSRB |= (1<<RXEN);
|
27 | UCSRB |= (1<<TXEN);
|
28 | UCSRB |= (1<<RXCIE);
|
29 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
|
30 | }
|
31 |
|
32 | void send_char(unsigned char data) {
|
33 | while (!(UCSRA & (1<<UDRE)));
|
34 | UDR = data;
|
35 | }
|
36 |
|
37 | void send_string(char *data) {
|
38 | while (*data) {
|
39 | send_char(*data);
|
40 | data++;
|
41 | }
|
42 | }
|
43 |
|
44 | volatile uint16_t adc(uint8_t mux)
|
45 | {
|
46 |
|
47 | ADMUX = mux;
|
48 | ADMUX |= (0<<REFS1) | (1<<REFS0); // AVcc nutzen
|
49 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler setzen auf 8 und ADC aktivieren
|
50 |
|
51 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
52 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
53 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
54 | while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
|
55 | result = ADCW; // ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten Wandlung nicht übernommen.
|
56 |
|
57 | /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
|
58 | result = 0;
|
59 | for( i=0; i<4; i++ )
|
60 | {
|
61 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
62 | while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
|
63 | result += ADCW; // Wandlungsergebnisse aufaddieren
|
64 | }
|
65 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
|
66 |
|
67 | result /= 4; // Summe durch vier teilen = arithm. Mittelwert
|
68 |
|
69 | }
|
70 |
|
71 |
|
72 |
|
73 | int main(void) {
|
74 | init_uart(UBRR_VAL);
|
75 |
|
76 |
|
77 | wert = adc(0);
|
78 |
|
79 | send_string("Wert: ");
|
80 | send_string(wert);
|
81 |
|
82 |
|
83 | }
|
Das Problem ist nun das ich im Terminal keinen Zahlenwert angzeigt
bekomme sondern "Wert: " und daruaf folgen dann irgendwelche kryptische
zeichen. An der Baudrate kann es ja schonmal nicht liegen.
Hat jemand eine Ahnung woran es liegen könnte?
Vielen Dank,
Max