Ich habe mir einen Arduino( also ein ATMEGA328P) gekauft und er
funktioniert wunderbar mit der Arduino Entwicklungsumgebung also ist der
Controller nicht kaputt. Nur jetzt habe ich das Problem, dass ich mein
eigenes Programm geschrieben habe und mittels des Avr Labs über ISP rauf
gespielt habe und der Controller aber keine Daten sendet. Eigentlich
sollte er mit seinem Analog-Digitalkonverter 3 Ports auslesen und dann
per Uart die Werte ausgeben.
Hier ist der Code( die ADC.h habe ich deswegen gemacht weil der Compiler
sonst warnings wegen impliziter Funktionsdefinitionen ausgibt):
Accelerometer_MEGA328P:
1 | #include <avr/io.h>
|
2 | #include "avr/interrupt.h"
|
3 | #include "uart.h"
|
4 | #include "ADC.h"
|
5 |
|
6 | uint16_t acx, acy, acz;
|
7 | char Buffer[16];
|
8 |
|
9 | void int_to_char(uint16_t u,char* tBuffer)
|
10 | {
|
11 | int i = 0;
|
12 | int j;
|
13 | char tmp;
|
14 | // die einzelnen Stellen der Zahl berechnen
|
15 | do {
|
16 | tBuffer[i++] = '0' + u % 10; // = String "0" (=48) + Rest von u/10
|
17 | u = u/10;
|
18 | } while( u > 0 );
|
19 | // den String in sich spiegeln (d.h. Reihenfolge umkehren)
|
20 | for( j = 0; j < i / 2; ++j ) {
|
21 | tmp = tBuffer[j];
|
22 | tBuffer[j] = tBuffer[i-j-1];
|
23 | tBuffer[i-j-1] = tmp;
|
24 | }
|
25 | tBuffer[i] = '\0';
|
26 | }
|
27 |
|
28 | void sendAcceleration(void)
|
29 | {
|
30 | uart_puts("\n");
|
31 | int_to_char(acx, Buffer);
|
32 | uart_puts( Buffer );
|
33 | int_to_char(acy, Buffer);
|
34 | uart_puts( Buffer );
|
35 | int_to_char(acz, Buffer);
|
36 | uart_puts( Buffer );
|
37 | uart_puts("\n");
|
38 | }
|
39 |
|
40 | int main (void)
|
41 | {
|
42 | uart_init(9600);
|
43 | adc_init();
|
44 | while(1)
|
45 | {
|
46 | sendAcceleration();
|
47 | }
|
48 | return 0;
|
49 | }
|
ADC.c:
1 | #include <avr/io.h>
|
2 | #include <inttypes.h>
|
3 | #include "ADC.h"
|
4 |
|
5 |
|
6 | void adc_init(void) {
|
7 |
|
8 | uint16_t result;
|
9 |
|
10 | ADMUX = (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
|
11 | ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler (clock/8)
|
12 | ADCSRA |= (1<<ADEN); // ADC aktivieren
|
13 |
|
14 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
15 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
16 |
|
17 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
18 | while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
|
19 | /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
|
20 | Wandlung nicht übernommen. */
|
21 | result = ADCW;
|
22 | /*
|
23 |
|
24 | ADCSRA |= (1<<ADFR); //Freerunning mode
|
25 | ADCSRA |= (1<<ADIE); //Interrupt enable
|
26 | ADMUX |= (1<<ADLAR); //says how the result is saved
|
27 |
|
28 | */
|
29 | }
|
30 |
|
31 | /* ADC Einzelmessung */
|
32 | uint16_t adc_read( uint8_t channel )
|
33 | {
|
34 | // Kanal waehlen, ohne andere Bits zu beeinflußen
|
35 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
|
36 | ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
|
37 | while (ADCSRA & (1<<ADSC) ) // auf Abschluss der Konvertierung warten
|
38 | ;
|
39 | return ADCW; // ADC auslesen und zurückgeben
|
40 | }
|
41 |
|
42 | /* ADC Mehrfachmessung mit Mittelwertbbildung */
|
43 | uint16_t adc_read_avg( uint8_t channel, uint8_t average )
|
44 | {
|
45 | uint32_t result = 0;
|
46 |
|
47 | for (uint8_t i = 0; i < average; ++i )
|
48 | result += adc_read( channel );
|
49 |
|
50 | return (uint16_t)( result / average );
|
51 | }
|
ADC.h:
1 | extern void adc_init();
|
2 | extern uint16_t adc_read( uint8_t channel );
|
3 | extern uint16_t adc_read_avg( uint8_t channel, uint8_t average );
|
und noch die aktuelle Uart Bibliothek von Peter Fleury
Ich suche jetzt schon ewig nach dem Fehler.