Microcontroller sendet keine Daten

Gast #2239618
Lesenswert?

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.
Gast #2239627
Lesenswert?

Wo liest du denn den ADC aus? Soll es per Interrupt funktionieren? Wo 
ist deine ISR? Wo werden deine Interrupts initialisiert? ... bis jetzt 
müsstest du allenfalls "\n" auf dem comport bekommen...

kannst du in den debug-modus gehn und das programm schritt für schritt 
durchgehn?
Gast #2239644
Lesenswert?

ahh...bin ich blöd

ja danke ... manchmal sieht man den Wald vor lauter Bäumen nicht

Ursprünglich wollte ich per Timerinterrupt auslesen, hab mich dann aber 
umentschieden und vergessen das wieder einzubauen.
Werd das ändern wenn ich wieder zuhause bin.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren