Forum: Mikrocontroller und Digitale Elektronik Minus auf dem LCD widergeben mit Poti


von Alem K. (ademina)


Lesenswert?

Hallo zusammen

Ich will mit dem Poti Temperaturen simulieren können und bringe es ncht 
hin dass er bei unter 0 Minus ausgibt ( -1, -2, -3,) anstelle 524, 523 
etc.

Hier der Code abschnitt:





  GO_DONE = 1;                          // A/D-Prozess starten
    while (GO_DONE);                    // Warten bis A/D-Wandlung 
beendet ist
  AD_Wert = ADRESH;
  AD_Wert = AD_Wert ;

  lcd_goto(0x45);                        // Cursor auf . Zeile, . Spalte 
stellen
  lcd_int(AD_Wert,3,1);                  // Dezimal ausgeben

von NurEinGast (Gast)


Lesenswert?

Als Du die Funktion lcd_int geschrieben hast, hast Du darin doch sicher 
die Behandlung negativer Zahlen berücksichtigt. Sag uns doch mal wie Du 
das gemacht hast.
Vielleicht können wir das Problem ja darin finden.

von Patrick (Gast)


Lesenswert?

Öh... Wo soll man da anfangen?

Compiler? Version? µC?

Was hast Du schon probiert? - Das Einzige, was man mit diesem 
Codeschnipsel anfangen kann, ist, Dir dieses zu raten:
1
lcd_int(AD_Wert-525,3,1);

Da wir nicht wissen, welchen Wertebereich AD_Wert hat, von welchem Typ 
AD_Wert ist und wir lcd_int funktioniert (kann diese Funktion 
vorzeichenbehaftete Zahlen ausgeben?), können wir sonst nur herumraten.

von Alem K. (ademina)


Lesenswert?

Sorry

Hier alles was der ADC Wandler beinhaltet
1
unsigned int AD_Wert;              // RE0
2
3
4
void main()
5
{
6
7
  ANSEL  = 0b01100000;                // AN5 und AN6 als analoge Eingänge definieren
8
  ANSELH = 0;                          
9
  C1ON   = 0;              
10
  C2ON   = 0;
11
12
  TRISE  = 0x07;                       // alle Ports als Eingänge definieren
13
  ADCON1 = 0b00000000;                // Resultat linksbündig ausrichten
14
  ADCON1 = 0b00000000;                // Resultat linksbündig ausrichten
15
  
16
.....................................................................
17
18
    
19
    ADCON0 = 0b00010101;  
20
  __delay_us(1);
21
22
  GO_DONE = 1;                          // A/D-Prozess starten
23
    while (GO_DONE);                    // Warten bis A/D-Wandlung beendet ist
24
  AD_Wert = ADRESH;
25
  AD_Wert = AD_Wert/4 ;
26
27
  lcd_goto(0x45);                        // Cursor auf . Zeile, . Spalte stellen
28
  lcd_int(AD_Wert,3,1);                  // Dezimal ausgeben

von Alem K. (ademina)


Lesenswert?

Ist ein PIC16F887

Arbeite mit MPLAB

von fooo (Gast)


Lesenswert?

Alem Kiral schrieb:
> unsigned int AD_Wert;              // RE0

na, fällt dir was auf?

von Alem K. (ademina)


Lesenswert?

wenn ich unsigned rausnehme dann kann ich es nicht Kompilieren

von fooo (Gast)


Lesenswert?

hast du iwas im makefile verstellt?
schreib mal
1
signed int AD_werte

von fooo (Gast)


Lesenswert?

wass ist denn der Compiler-Fehler?

von Timmo H. (masterfx)


Lesenswert?

Möglicherweise erwartet "lcd_int" ein unsigned, das sollte man dann 
natürlich auch ändern.

von Alem K. (ademina)


Lesenswert?

Hier der Compiler fehler:


I-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.83
Copyright (C) 2011 Microchip Technology Inc.
(1273) Omniscient Code Generation ist in der Lite Version nicht 
verfügbar (warning)
Warning [1393] C:\Users\Adem\Schule\Mikrocontrollertechnik 2\eigene 
Übungen\Semesterarbeit\main.c; 104. möglicher hardware stack Überlauf 
erkannt, geschätzte Stack Tiefe: 13
Error   [1347] ; 0. kann 0x17 words (0x17 withtotal) für psect 
"text1876" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x15 words (0x15 withtotal) für psect 
"text1835" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x13 words (0x13 withtotal) für psect 
"inittext" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x11 words (0x11 withtotal) für psect 
"idataBANK3" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x11 words (0x11 withtotal) für psect 
"text1874" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x10 words (0x10 withtotal) für psect 
"text1855" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x10 words (0x10 withtotal) für psect 
"text1856" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x10 words (0x10 withtotal) für psect 
"text1858" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x10 words (0x10 withtotal) für psect 
"text1892" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0x10 words (0x10 withtotal) für psect 
"text1893" im segment "CODE" nicht finden (grösster ungenutzter 
zusammenhängender Bereich 0x8)
Error   [1347] ; 0. kann 0xE words (0xe withtotal) für psect "text1848" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)
Error   [1347] ; 0. kann 0xE words (0xe withtotal) für psect "text1895" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)
Error   [1347] ; 0. kann 0xD words (0xd withtotal) für psect "text1833" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)
Error   [1347] ; 0. kann 0xC words (0xc withtotal) für psect "text1832" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)
Error   [1347] ; 0. kann 0xC words (0xc withtotal) für psect "text1888" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)
Error   [1347] ; 0. kann 0xB words (0xb withtotal) für psect "text1872" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)
Error   [1347] ; 0. kann 0xA words (0xa withtotal) für psect "text1871" 
im segment "CODE" nicht finden (grösster ungenutzter zusammenhängender 
Bereich 0x8)

********** Build failed! **********

von Alem K. (ademina)


Lesenswert?

Timmo H. schrieb:
> Möglicherweise erwartet "lcd_int" ein unsigned, das sollte man dann
> natürlich auch ändern.

Ist das dann in der Biblithek? Weil das kann ich dann gleich vergessen!!

von Timmo H. (masterfx)


Lesenswert?

Alem Kiral schrieb:
> Timmo H. schrieb:
>> Möglicherweise erwartet "lcd_int" ein unsigned, das sollte man dann
>> natürlich auch ändern.
>
> Ist das dann in der Biblithek? Weil das kann ich dann gleich vergessen!!
Das musst du ja wissen. In der Standard Compiler Lib wirds denke ich 
nicht drin sein. Du hältst dich ja schon sehr zurück was deinen Code 
angeht. Deine Compilerfehler sehen eher so aus, als wenn du dann ein 
anderes Problem hast (zu wenig Speicher Flash und/oder RAM)

von Dauergast (Gast)


Lesenswert?

Der Compiler sagt, die Verschachtelung Deiner Funktionsaufrufe ist zu 
tief, und Dein Code zu groß.

Daß das einfach durch Ändern von unsigned auf signed passiert, wage ich 
mal zu bezweifeln.

von Marcus (Gast)


Lesenswert?

Dauergast schrieb:
> Daß das einfach durch Ändern von unsigned auf signed passiert, wage ich
> mal zu bezweifeln.

Mit dem HI-TECH PICC passieren die unmöglichsten Sachen. XC8 ist 
mindestens genauso furchtbar. Anfänger dürfte man eigentlich nicht mit C 
auf PIC16 u.ä. loslassen. Bei den ganzen Seltsamkeiten, die da passieren 
können, sollte man schon ein geistig gefestigter Programmierer sein, der 
genügend Selbstvertrauen sowohl in den eigenen Code als auch in seine 
Assembler-Kenntnisse hat, um den Compiler in Frage stellen zu können.

Aber die Controller sind halt so schön günstig, da nimmt man das 
Durcheinander (mehr oder weniger) gerne auf sich, sobald es um 
Stückzahlen geht.

von W.S. (Gast)


Lesenswert?

Marcus schrieb:
> gerne auf sich, sobald es um Stückzahlen geht.

..und man glaubt, sich mit C um das Stückchen Assemblerprogrammierung 
drücken zu können, und/oder sich um das Verständnis der Hardware drücken 
zu können, usw.

Wenn der TO denn schon in C werkelt, dann wäre es ja wohl nicht zuviel 
verlangt, ein klein wenig nachzudenken:

Also, angenommen, der ADC liefert in diesem Kontext immer Zahlen 0..1023 
(10 Bit, so als Beispiel), dann muß man rechnerisch den Nullpunkt auf 
eine Zahl größer als 0 verschieben. Nennt man Subtraktion, sowas.
1
 unsigned int AD_Wert;
2
 int i;
3
4
 AD_Wert = ADRESH>>2;
5
 i = AD_Wert;
6
 i = i - 100;
7
 if (i<0)
8
 { Char_Out('-');
9
   i = -i;
10
 }
11
 else Char_Out('+');
12
 Integer_Out(i);
Dann kannst du deine Zahlenausgabe ab -99  bewundern.

Ist so etwas bereits zu kompliziert?

W.S.

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.