mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Analogwert Umrechnung


Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht 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.

// Include

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <ADC_4MW.c>
#include "lcd.h"
#include <stdint.h>

// Var
int adc;
long adc_;
char adc__[11];

//Umrechnung
uint32_t umrech (uint16_t zahl)
{
  int k = 15;
  //test_(k);            //debug
  uint32_t ergebnis = 0;
  //test_(zahl);            //debug
  ergebnis = zahl * (long)k;
  //test__(ergebnis);
  //adc_ = ergebnis;
  return ergebnis;
}


int main (void)
{
  DDRB = (1<<DDB1); //3
  
  start();    //i.o
  pwm_timer();//i.o
  while(1)
  {
  
  //_delay_ms(500);
  adc =  ReadADC(1);                // Kanal 1 Wandeln
  umrech(adc);
  my_uitoa(umrech,adc__);
  lcd_gotoxy(5,1);
  my_print_LCD(adc__,3,5,1);
  _delay_ms(500);
  
    //Pulsweitenmodulation
    OCR1A = adc; // PB1
  

  
  }
  
  return(0);


    
}
void my_itoa(int32_t zahl, char* string) {
  uint8_t i;
 
  string[11]='\0';                  // String Terminator
  if( zahl < 0 ) {                  // ist die Zahl negativ?
    string[0] = '-';              
    zahl = -zahl;
  }
  else string[0] = ' ';             // Zahl ist positiv
 
  for(i=10; i>=1; i--) {
    string[i]=(zahl % 10) +'0';     // Modulo rechnen, dann den ASCII-Code von '0' addieren
    zahl /= 10;
  }
}

void my_print_LCD(char* string, uint8_t start, uint8_t komma, uint8_t frac) {
 
  uint8_t i;            // Zähler
  uint8_t flag=0;       // Merker für führende Nullen
 
  // Vorzeichen ausgeben  
  if (string[0]=='-') lcd_data('-'); else lcd_data(' ');
 
  // Vorkommastellen ohne führende Nullen ausgeben
  for(i=start; i<komma; i++) {
    if (flag==1 || string[i]!='0') {
      lcd_data(string[i]);
      flag = 1;
    }
    else lcd_data(' ');         // Leerzeichen
  }
 
  lcd_data(',');                // Komma ausgeben
 
  // Nachkommastellen ausgeben
  for(; i<(komma+frac); i++) lcd_data(string[i]);
 
}

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  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:
  umrech(adc);
Rechnest du zwar was aus, allerdings verwirfst du das Ergebnis, da nicht 
dasteht, wo das hinsoll:
variable=  umrech(adc);


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

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht 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];

Autor: Andre H. (andre01)
Datum:

Bewertung
0 lesenswert
nicht 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é

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.