Forum: Mikrocontroller und Digitale Elektronik Probleme mit Analogwert Umrechnung


von Andre H. (andre01)


Lesenswert?

Hallo zusammen,
ich versuche gerade einige Analogwerte auf ein 2*16 LCD zubekommen. Das 
Tutorial habe ich mir zur Festkommaarithmetik angeschaut,
einige Sachen auch daraus verwendet.

Um stehe ich vor dem Problem das da irgendetwas nicht so mit der ganzen 
Rechnerei paßt.
Wenn ich die Umrechnung des Analoagwertes im main aufrufe und den adc 
Wert übergebe kommt der auch richtig an. Das Rechnen in der Funktion ist 
auch richtig. Das ergebnis habe ich mir auch schon aus der Funktion 
heraus anzeigen lassen. Nur der Return Wert "ergbnis" ist vollständiger 
murks. Wenn ich den dann auch durch den my_itoa schicke und als string 
über my_print_LCD auf das Display bringen will kommt nur Schrott an.

Wenn ich dem char direkt einen Wert zuweise dann geht die Anzeige?!?

Weiß jemand vielleicht warum dem so ist?

Verwende die LCD lib von P.Fleury und das ganz läuft auf einem ATMega8.



Ich habe den Code mal etwas bereinigt reingestellt.
1
// Include
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
#include <ADC_4MW.c>
7
#include "lcd.h"
8
#include <stdint.h>
9
10
// Var
11
int adc;
12
long adc_;
13
char adc__[11];
14
15
//Umrechnung
16
uint32_t umrech (uint16_t zahl)
17
{
18
  int k = 15;
19
  //test_(k);            //debug
20
  uint32_t ergebnis = 0;
21
  //test_(zahl);            //debug
22
  ergebnis = zahl * (long)k;
23
  //test__(ergebnis);
24
  //adc_ = ergebnis;
25
  return ergebnis;
26
}
27
28
29
int main (void)
30
{
31
  DDRB = (1<<DDB1); //3
32
  
33
  start();    //i.o
34
  pwm_timer();//i.o
35
  while(1)
36
  {
37
  
38
  //_delay_ms(500);
39
  adc =  ReadADC(1);                // Kanal 1 Wandeln
40
  umrech(adc);
41
  my_uitoa(umrech,adc__);
42
  lcd_gotoxy(5,1);
43
  my_print_LCD(adc__,3,5,1);
44
  _delay_ms(500);
45
  
46
    //Pulsweitenmodulation
47
    OCR1A = adc; // PB1
48
  
49
50
  
51
  }
52
  
53
  return(0);
54
55
56
    
57
}
58
void my_itoa(int32_t zahl, char* string) {
59
  uint8_t i;
60
 
61
  string[11]='\0';                  // String Terminator
62
  if( zahl < 0 ) {                  // ist die Zahl negativ?
63
    string[0] = '-';              
64
    zahl = -zahl;
65
  }
66
  else string[0] = ' ';             // Zahl ist positiv
67
 
68
  for(i=10; i>=1; i--) {
69
    string[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
70
    zahl /= 10;
71
  }
72
}
73
74
void my_print_LCD(char* string, uint8_t start, uint8_t komma, uint8_t frac) {
75
 
76
  uint8_t i;            // Zähler
77
  uint8_t flag=0;       // Merker für führende Nullen
78
 
79
  // Vorzeichen ausgeben  
80
  if (string[0]=='-') lcd_data('-'); else lcd_data(' ');
81
 
82
  // Vorkommastellen ohne führende Nullen ausgeben
83
  for(i=start; i<komma; i++) {
84
    if (flag==1 || string[i]!='0') {
85
      lcd_data(string[i]);
86
      flag = 1;
87
    }
88
    else lcd_data(' ');         // Leerzeichen
89
  }
90
 
91
  lcd_data(',');                // Komma ausgeben
92
 
93
  // Nachkommastellen ausgeben
94
  for(; i<(komma+frac); i++) lcd_data(string[i]);
95
 
96
}

von Matthias L. (Gast)


Lesenswert?

1
  my_uitoa(umrech,adc__);


Diese Zeile übergibt der Funktion my_uitoa die Varaiblen umrech und 
adc__.

Die Varaible umrech gibt es aber nicht!  Das ist eine Funktion!
Um eine Fkt, bzw. einen Fkt-aufruf draus zu machen, musst du umrech(..) 
schreiben.

Und in der Zeile darüber:
1
  umrech(adc);
Rechnest du zwar was aus, allerdings verwirfst du das Ergebnis, da nicht 
dasteht, wo das hinsoll:
1
variable=  umrech(adc);


Übringens solltest du dich auf eine Art Varaiblendekl. halten. Mal long, 
mal int, mal uint32_t...

von Edi R. (edi_r)


Lesenswert?

Du schreibst:

char adc__[11];

Damit reservierst Du 11 Bytes, die Du mit adc__[0] bis adc__[10] 
adressieren kannst. In "my_itoa" schreibst Du aber:

  string[11]='\0';

Folglich solltest Du ein Byte mehr reservieren:

char adc__[12];

von Andre H. (andre01)


Lesenswert?

OH man... manchmal ist man einfach zu doof und sieht den Wald vor lauter 
Bäumen nicht....

danke lippy. Das mit dem Sichern des Variableninhaltes das war es...
so einen ähnlichen aufruf mache ich ja auch eine zeile drüber schon.
danke auch an edi.

Gruß André

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.