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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.