Forum: Mikrocontroller und Digitale Elektronik Microcontroller sendet keine Daten


von Alex (Gast)


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.

von Klugscheißer (Gast)


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?

von Alex (Gast)


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.

von Klugscheißer (Gast)


Lesenswert?

Naja manchmal sieht man den Wald vor lauter Bäume nicht ... ;)!

von Lehrmann M. (ubimbo)


Lesenswert?

Klugscheißer schrieb:
> Naja manchmal sieht man den Wald vor lauter Bäume nicht ... ;)!

Du bist ja ein kluger ....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.