Hi Leute,
hab nach langer Überlegung für eine einfache Spannungsmessung mich für
einen PIC 16F876 entschieden. Da die Spannungsmessung auch auf dem LCD
angezeigt werden soll eignet sich dieser Mikrocontroller besonders gut.
Doch nun zu meinem Problem, ich Versuche schon seit einigen Tagen das
LC- Display ( 2 X 16 ) mit dem PIC anzusteuern, doch es zeigt nichts an,
damit meine ich, die erste Zeile zeigt schwarze Balken und die zweite
Zeile nichts. Ich hab schon mehrmals überprüft ob alles richtig
angschlossen ist und es ist alles in Ordnung.
Ich vermute es ist irgendetwas mit dem Programm nicht in Ordnung.
Ich benutze den 'mikroPascal Pro for PIC' Compiler dieser erzeugt mir
einen assembler File und ein hex file. Das Hex File brenne ich mit
meinem selbgebauten Brenner von der Sprut Seite 'PIC Brenner 8'. Habe
schon anderen PIC's damit gebrannt und es funktionierte alles in
Ordnung.
Ich benutze nicht wie im Schaltbild einen 4MHz Quarz
sondern einen 7,68 MHz Quarz. Hat das einen Einfluss darauf oder ist das
egal??
Es soll auf dem Display 2 Spannungswerte angezeigt werden, Diese
Spannungswerte werden dann im Programm in Temperaturwerde umgewandelt
3V = 300°C
2,5V = 250°C
zB.: SOLL IST
300°C 250°C
Hier der Quelltext:
1
// Autor: Flat
2
// Projekt: Temperaturregelung bis 300°C
3
4
program LCD;
5
6
var ad0 :word;
7
ad1 :word;
8
sum :real;
9
sum1:string[23];
10
sum2:real;
11
sum3:string[23];
12
13
LCD_RS : sbit at RB2_bit;
14
LCD_EN : sbit at RB3_bit;
15
LCD_D4 : sbit at RB4_bit;
16
LCD_D5 : sbit at RB5_bit;
17
LCD_D6 : sbit at RB6_bit;
18
LCD_D7 : sbit at RB7_bit;
19
20
LCD_RS_Direction : sbit at TRISB2_bit;
21
LCD_EN_Direction : sbit at TRISB3_bit;
22
LCD_D4_Direction : sbit at TRISB4_bit;
23
LCD_D5_Direction : sbit at TRISB5_bit;
24
LCD_D6_Direction : sbit at TRISB6_bit;
25
LCD_D7_Direction : sbit at TRISB7_bit;
26
27
begin
28
29
ADCON1 :=4;
30
TRISA :=1;
31
TRISB :=0;
32
TRISC :=0;
33
PORTB := 0xFF;
34
TRISB := 0xFF;
35
36
Lcd_Init();
37
Lcd_CMD(_LCD_CURSOR_OFF);
38
39
LCD_Out(1,1,'Temp Regelung');
40
LCD_OUT(2,1,'bis 300°C');
41
Delay_ms(2000);
42
Lcd_Cmd(_Lcd_Clear);
43
44
while TRUE do
45
46
47
LCD_Cmd(_Lcd_Clear);
48
Lcd_Out(1,1,'SOLL-Temp.:');
49
Lcd_Out(2,1,'IST-Temp.:');
50
51
repeat
52
53
ad0 := Adc_Read(0);
54
ad1 := Adc_Read(1);
55
sum := (ad0 * 100)/1023;
56
sum2:= (ad1 * 100)/1023;
57
FloatToStr(sum,sum1);
58
FloatToStr(sum2,sum3);
59
Lcd_Out(1,5,sum1);
60
Lcd_Out(2,5,sum3);
61
62
until false
63
64
end.
Ich lade euch die Sachen hoch, vielleicht könnt ihr mir weiter helfen.
Ich danke schonmal im Voraus.
Gruss
flat
Hallo flat,
der Oszillator schwingt nicht. Schalte an OSC1 und OSC2 jeweils einen
Kondensator 20pF gegen Masse (siehe Datenblatt).
Ich kenne mich mit mikroPascal nicht gut aus, aber das Programm könnte
so laufen.
P.S.
TRISC :=0; PORTB := 0xFF; kann entfallen
Gruß
sf1
Hi sf1,
es lag an den Kondensatoren, ich weiß nicht woran es lag aber nachdem
ich sie ausgetauscht habe geht es jetzt, doch nicht mit meinem Programm
sondern mit dem Programm von der Sprut Seite.
Kann mir einer vielleicht sagen warum es nicht mit diesem Programm geht.
Habe Beispiele in Youtube gesehen mit denenen es funktioniert hat, doch
bei mir funkt es nicht.
Die Frage geht an die mikroPascal Experten, help please .....
Gruss
Flat
Hi,
hat einer vielleicht ein C Programm für den Pic Typen womit ich zwei
Analoge Spannungen Messen und am Display anzeigen kann.
Wäre sehr dankbar, wenn ihr mir sowas hochladen könntet
Gruss
flat
Flat K. schrieb:> es lag an den Kondensatoren, ich weiß nicht woran es lag aber...
Schöner Satz ;)
Flat K. schrieb:> TRISB :=0;> TRISC :=0;> PORTB := 0xFF;> TRISB := 0xFF;
Ansich sollte es nicht daran liegen, aber zuerst machst du TRISB auf 0
und danach auf FF... Vergessen in PORTB zu ändern?
Flat K. schrieb:> Lcd_Out(1,5,sum1);> Lcd_Out(2,5,sum3);
Daran sollte es auch nicht liegen, aber sollen die Werte nicht ab Spalte
12 oder sogar 13 (mit Leerzeichen nach dem Doppelpunkt) angezeigt
werden?
Hast du mal Probiert einfach einen Text anzuzeigen?
Oder weißt du welcher Teil nicht funktioniert (ADC oder LCD)?
Ich taste mich meistens an mein Ziel und teste somit das Layout/den
Aufbau und das Programm. Also in deinem Fall ein Simples Programm, dass
2 Zeilen beschreibt. Wenn das geht, kommt der AD-Wandler, dessen Werte
aufs Display geschrieben werden. Das kann man gleich mit der Berechnung
machen, oder ohne.
Ich hab ansich nichts mit Pascal zutun, aber das "while TRUE do" so
alleine sieht komisch aus. Kann das sein, dass das sowas ist, wie
"while(1);" in C? Das wäre dann eine Endlosschleife auf der Stelle und
er würde nichts machen bzw nicht im Programm weiter gehen. Google sagt,
dass in Pascal nach while 'condition' do ein gebin und end kommt. Bei
dir aber nicht.
Hallo,
versuch es doch mal mit dieser Software
[http://gcbasic.sourceforge.net/].
Ich benutze GCGB schon einige Zeit erfolgreich. Da werden fast alle Pic
und auch welche von Atmel AVR unterstützt.
Die fertigen Routinen für AD Wandler und PWM sowie Augabe auf LCD
Display vereinfachen das Programieren erheblich und man muß sich nicht
mit Assembler rumschlagen. Der erzeugte Hexcode kann dann mit Sprut 8
gebrannt werden. Und es läuft (wenn das Programm richtig war). Die
Datenblätter der Pic sollte man immer lesen. Schon die Innenbeschaltung
der Ports ist sehr unterschiedlich und hilft bei Denkfehlern weiter.
Einfach mal anschauen.
Gruß Manfred
HI,
Danke für euren Feedback.
Ich hab es jetzt entlich geschafft einen Text anzuzeigen.
Die größte Hürde ist schonmal geschafft :).
Doch nun geht es weiter.
@ ich
du hast recht mit dem begin, das hab ich extra weggelassen mit der
Hoffnung das er das compilieren tut, denn wenn ich es rein schreibe sagt
der mikropascal compiler zumir, das das demo limit erreicht ist und ohne
zeigt der mir nichts im Display an.
Also an euch wieder, kann man das Programm irgendwie noch weiter
verkleinern sodass man das kompilieren kann oder geht da nix mehr.
Oder kennt ihr ein anderes Programm womit man das kompilieren kann.
Gruss
Flat
hab das Programm soweit ferig, nur das der ADC mir falsche Werte für
jeweilige Spannung liefert.
z.B. bei 1V zeigt es mir 000021
es soll bei 3V am Eingang 300 am Display zeigen. Eine Stelle hinter dem
Komma wäre auch nicht schlecht aber muss nicht sein.
Kann mir vielleicht einer Helfen das in die Reihe zu bekommen
1
// Projekt: Temperaturregelung bis 300°C
2
3
program lcdneuerVersuch;
4
5
var ad0 : word;
6
ad1 : word;
7
sum :real;
8
sum1 :real;
9
sum2:string[10];
10
sum3:string[10];
11
12
LCD_RS : sbit at RB2_bit;
13
LCD_EN : sbit at RB0_bit;
14
LCD_D4 : sbit at RB4_bit;
15
LCD_D5 : sbit at RB5_bit;
16
LCD_D6 : sbit at RB6_bit;
17
LCD_D7 : sbit at RB7_bit;
18
19
LCD_RS_Direction : sbit at TRISB2_bit;
20
LCD_EN_Direction : sbit at TRISB0_bit;
21
LCD_D4_Direction : sbit at TRISB4_bit;
22
LCD_D5_Direction : sbit at TRISB5_bit;
23
LCD_D6_Direction : sbit at TRISB6_bit;
24
LCD_D7_Direction : sbit at TRISB7_bit;
25
26
begin
27
28
ADCON1 :=4;
29
TRISA :=255;
30
TRISB :=0;
31
TRISC :=0;
32
33
Lcd_Init();
34
Lcd_CMD(_LCD_CURSOR_OFF);
35
Lcd_Out(1,1,'Temp.-Regelung');
36
Lcd_Out(2,1,'bis 300°C @Ali K');
37
Delay_ms(2000);
38
Lcd_Cmd(_Lcd_Clear);
39
40
while TRUE do
41
42
begin
43
44
LCD_Cmd(_Lcd_Clear);
45
Lcd_Out(1,1,'SOLL:');
46
Lcd_Out(2,1,'IST:');
47
48
repeat
49
50
ad0 := Adc_Read(0);
51
ad1 := Adc_Read(1);
52
sum := (ad0 * 100)/1023;
53
sum1:= (ad1 * 100)/1023;
54
IntToStrWithZeros(sum,sum2);
55
IntToStrWithZeros(sum1,sum3);
56
Lcd_Out(1,7,sum2);
57
Lcd_Out(2,7,sum3);
58
until false
59
60
end;
61
end.
Wenn ich FloatToStr benutze sagt das Programm das das eine Demo Version
ist und es Kompiliert nicht.
Bin in Sachen Programmieren ein Noop, deswegen habt verständnis.
Danke.
Gruss
flat
So kannst du nicht rechnen. 5Volt entsprechen einen Digitalemwert
von 1023. 2,5Volt sind 500 und 3 Vollt 600. Schau dir mal in den
Demos die Temperaturateuerrung an, wie die da rechnen.
Danke für deine Antwort aber habs jetzt doch alleine geschafft
:) Freu :)
Statt FloatToStr habe ich jetzt WordToStr benutzt
und da der PIC die Versorgungsspannung als Referenzspannung benutzt
muss man bei der Rechnung mit 500 multiplizieren. Und man bekommt bei 3V
am Eingang 300.
So da ich jetzt soweit gekommen bin, wollte ich jetzt noch ein gimmik
reinbauen, sowas wie eine Lade Balkenanzeige, dass der Pic erst mal Warm
wird und mir dann die Analogwerte ausspuckt.
Kann mir vielleicht einer einen quellcode zukommen lassen, wie man sowas
realisiert, hab im Internet mich umgeschaut aber nichts gefunden was bei
mir passt. Wäre nett wenn ihr sowas rein posten würdet.
Danke nochmals
Viele Grüsse
Flat
Flat K. schrieb:> denn wenn ich es rein schreibe sagt> der mikropascal compiler zumir, das das demo limit erreicht ist und ohne> zeigt der mir nichts im Display an.
Das ist aber seltsam, denn das Programm ist, so wie es hier steht,
winzig. Der C-Compiler mikroC hat eine Beschrenkung auf 2KB, die
erreichst du damit ansich nicht. Hast du die aktuelle Version vom
Compiler??
Flat K. schrieb:> So da ich jetzt soweit gekommen bin, wollte ich jetzt noch ein gimmik> reinbauen, sowas wie eine Lade Balkenanzeige, dass der Pic erst mal Warm> wird und mir dann die Analogwerte ausspuckt.
Ansich musst du da nur eine Schleife aufrufen, in der jede x
Millisekunden ein Balkenteil dazu kommt. Wenn das letzte Teil da ist,
wechselst du in den normalen Betrieb... Du weißt aber schon, dass ein
PIC nicht warm werden sollte. Zumindest nicht so ein PIC und auch nicht
bei so einer Pille-Palle-Anwendung ;) Damit wäre es halt was fürs Auge,
aber Sinnvoll ist es nicht^^
ich weiß das der Pic nicht warm werden sollte aber ist ja nur just for
fun,
dass man das mit schliefen realisiert ist mir auch schon klar nur wie
bekomme ich die balken auf dem display angezeigt.
Gruss
flat
Du kannst im DB vom LCD gucken, ob es ein Zeichen gibt, dass jeden Pixel
ausfüllt und davon machst du dann 10 hintereinander. Oder du benutzt das
LCD-Tool von mikroElektronika, mit dem du selbsterstellte Zeichen machen
kannst.
Hallo,
das mit dem Gimmick hab ich jetzt doch weggelassen, da ich eingesehen
habe das es doch nichts bringt und nur ein haufen arbeit ist.
Ich wollte nochmal auf was anderes kommen, mein PIC macht das was ich
möchte im großen und ganzen, es zeigt mir bei einer Spannungsquelle von
5V VDD(Betriebsspannung) genau diese 300 an wenn es am Eingang auch 3V
anliegen,
doch wenn die Spannung von einem Spannungsregler 7805 kommt das nicht
ganz Präzise ist, habs schon gemessen es sind 5,04V , dann zeigt der mir
bei einer Eingangsspannung von 3V nur 296 an .
Ich weiß jetzt sagt ihr bestimmt dann muss du das halt mit 504
multiplizieren bei der Berechnung, aber das habe ich gemacht dann kommt
zwar bei 300 auch 300 raus doch bei sagen wir 100 kommt dann nicht 100
sonder wieder was anderes raus.
Ich weiß das ist ein bisschen Tricky, aber wie kann man den Fehler
korrigieren. Also an eine anderen präziseren Spannungsregler habe ich
auch schon gedacht doch ich möchte jetzt nichts großartiges an der
Harware ändern.
Kann man das irgendwie Software technisch realisieren??
Danke schonmal für euere Antworten
Gruss
flat
Also Hardwareseitig könntest du eine hochgenaue Spannungsreferenz
anschließen, was ansich ne gute Lösung ist. Ansonsten könntest du das
Ding kalibrieren. D.h. du schließt einmal Masse an und einmal 3V. Dann
hast du 2 Punkte und kannst dir den Rest errechnen.
Angenommen, wenn du Masse anschließt ist ein Wert von 1 im ADC und bei
3V hast du 615. Also hättest du ((ADC-Wert - 1) / (615 - 1) ) * 3V.
Ist der Wert also 615, deine 3V, hast du 614/614 = 1 * 3V. Hast du die
Hälfte, also die Mitte von 615 und 1 -> 308, sind das 307/614 = 0,5 * 3V
= 1,5V.
Somit kannst du auch, wenn Masse den Wert 100 hat und 3V den Wert 200,
errechnen, was Anliegt. Genau mit der gleichen Rechnung.
((ADC-Wert - 100) / (200 - 100) ) * 3V. -> Mit dem Wert 150 hast du also
50/100 = 0,5 * 3V = 1,5V
Oder, wenn du mehr als 3V hast -> Angenommener Wert 256, dann ist deine
Rechnung 156/100 = 1,56 * 3V = 4,68V.
Also Allgemein:
(("aktueller ADC-Wert" - "Untergrenze ADC-Wert") / ("wählbarer Punkt
ADC-Wert" - "Untergrenze ADC-Wert")) * "wählbarer Punkt Messwert".
Dazu musst du halt 2 feste, genaue Punkte kalibrieren und deren Wert
speichern.
Die Frage ist nur, wie stabil die Eingangsspannung ist und wie konstant
die Ungenauigkeit ist. Es nützt nichts, den Fehler rauszurechnen, wenn
aber deine 5V schwanken und du immer andere Werte bekommst. Daher würde
ich raten, doch Hardwaremäßig und evtl. auch Layouttechnisch genauer und
störungsfreier/-unempflindlicher zu werden. Auch doof ist, wenn die 5V
Stromabhängig sind. Dann schaltest du z.B. ein Relais an oder eine LED
und die 5,004V gehen auf 5,001V runter. Kannst ja mal im Datenblatt
deines Reglers gucken.
Danke für deine Antwort.
Du hast recht, ich muss doch einen anderen Regler nehmen, dieser hier
schwankt zu viel.
Kannst du mir einen günstigen empfehlen der Hochkonstant ist und 5V
ausgibt?
Bin bei Einkaufen von neuen Bauteilen sehr schludrig, also kaufe immer
das falsche ein :(
Hab noch ne frage, also bei dem Übergang vom Wer am LCD Display schwankt
der Wert sehr wenn es z.B. von 100 auf 101 übergeht.
Kann man diesen Übergang flüssiger gestalten.
Ich weis, dass das was mit der Auflösung zu tun hat, aber der Controller
hat nur 10 Bit.
Kann man das irgendiwe programmieren, das der Übergang nicht schwankt?
Ich hätte noch nen anderen Vorschlag. Du kannst z.b. den LT 1029 CZ
(http://www.reichelt.de/ICs-LT-LTC-/LT-1029-CZ/index.html?ACTION=3&GROUPID=2913&ARTICLE=10871&SHOW=1&START=0&OFFSET=500&;PROVID=2402)
nehmen. Das ist eine 5V Referenz. Die kann/soll/will man nicht belasten,
dadurch ist sie aber auch gleich genauer. Der PIC hat einen
Extra-Anschluss für die Vref. Der LT 1029 hat eine Genauigkeit von 0,2%
-> bei 5V sind das also 10mV. Du kannst dir den/so einen auch als 3,3V
Version holen. Dann musst du aber aufpassen, dass auch nicht mehr in den
AD-WAndler geht. Da musst du gucken, wieviel mehr der aushält. Aber bei
3,3V Referenz und 0,2% -> 6,6mV Genauigkeit.
ABER (es gibt doch immer ein Aber):
-Dein Temp-Sensor wird eine Toleranz bzw Genauigkeit haben
-Der AD-Wandler hat auch einen Fehler (1-3 LSB also kann bei berechneten
Wert 500 auch 503 kommen).
Dir bringt es also nichts, wenn du auf 1µV genau messen könntest, dein
Temperatursensor aber total ungenau ist. Ein ungenaues Signal hochgenau
gemessen ist immernoch ungenau;) -> Fehlerfortpflanzung. Dennoch würde
ich eine Referenz nehmen, denn dann ist der Fehler durch die Stromquelle
schonmal weg. Auf die beiden oben genannten hast du ja keinen Einfluss.
Bei einer Differenz von 500 zu 505(mal angenommen), ist das ein
Unterschied von ((5V/1024)*5) von 0,0244140625V -> ca. 2,4°C.. Das mag
viel klingen, doch bei messbaren 500°C sind das 0,48% Genauigkeit.
Das gleiche bei 3,3V Referenz: ((3,3V/1024)*5) -> 0,01611328125V -> ca.
1,6°C. Das sind bei messbaren 330°C (is weniger) aber immernoch 0,48%
Genauigkeit. Also heißt: Kleinerer Messbereich -> Bessere Auflösung aber
prozentual gleiche Genauigkeit.
Ich kenne jetzt nicht deine Anwendung, aber wenn du eine Temperatur
kontrollieren willst, die zwischen 280°C und 320°C (also 300°C+-20°C)
sein muss/soll, kannst du auch mit ein paar OPs den Bereich selektieren.
So dass 280°C = 0V und 320°C = 5V sind. Dann hast du nämlich eine
theoretische Genauigkeit von 0,039°C. Dann könntest du auch prüfen, wenn
die Temperatur unter 280°C ist, soll ein High-Signal an einen Eingang
gehen und wenn die Temperatur über 320°C sind, soll ein High-Signal an
einen anderen Eingang gehen. Da dann nur nicht vergessen, die Eingänge
(Digital UND Analog) gegen Über- und Unterspannung zu schützen.
Wenn das nicht deine Anwendung ist, kannste das natürlich vergessen ;)
Du könntest dann aber Verraten, was genau du messen willst, also ein
paar Infos. Vielleicht weiß jemand dann noch ein paar Kniffe oder hat
Tipps.
Noch schnell hinterher:
Eine genauere Referenz:
http://www.reichelt.de/ICs-AD-BUF-/AD-586-JN/index.html?ACTION=3&GROUPID=2909&ARTICLE=3821&SHOW=1&START=0&OFFSET=500&;PROVID=2402
Dennoch sei gesagt, du kannst eine Ideale Referenzspannung haben, deine
Fehler von ADC und Sensor bleiben. Zudem, 2mV sind schon nicht soo
schlecht, aber denk auch dran, dass deine Leiterbahnen kleine Antennchen
sind ;) Die holst dir also auch Spannungen von außen rein. Damit kenne
ich mich nich so gut aus, aber ein paar milliVolt sind da bestimmt
möglich.
Was ich noch gesehen habe. An jedem µC gehört ein Kondensator an die
Spannungsversorgung. Du hast nur einen an deinem Regler (vor dem Regler
sollte auch noch einer sein). Den Kondensator dann auch in µC-Nähe
plazieren.
Wenn du das mit den OPs machst (selektieren), denk dran, dass deine OPs
auch Fehler und unlinearitäten haben. Doch da wirkt sich so eine
Ungenauigkeit nicht soo aus.. wenn du mit 0,5°C anzeigen willst,
brauchst du 1,25% Genauigkeit, was machbar sein sollte.
Hmm da steckt ja viel Arbeit drin,
ich glaube ich lass es so, ob es jetzt 1 °C mehr oder weniger einzeigt
sei es drum.
Aber die zweite Frage würde mich noch interessieren, ob der Übergang
zwischen den Werten flüssger ist, hab sowas schon auf youtube gesehen
aber bei mir geht es nicht, liegt es am LCD Display??
Ist aus China :)
Oder muss ich bei der Programmierung noch was einfügen, z.B bei der
Berechnung??
Danke nochmals für deine ausführlichen Antworten, wenn ich Zeit hätte
würde ich es so machen, aber bald ist der Abgabetermin da.
hmm.. Ich weiß nich was du meinst. Meinst du, dass es nicht von 200,3
auf 201,1 springen soll, sondern quasi jeden Zwischenwert einmal kurz
einzeigen soll?
Das Video wär mal interessant zu sehen.
So soll das sein :
Hier sieht man das der Übergang z.B 6 > 7 > 8 >9 > 10 flüssiger ist.
Ab der 1:06 min laufen lassen
[[http://www.youtube.com/watch?v=zFPFE-3VSRc]]
Hab jetzt kein Video gefunden, wo es das gleich wie bei mir ist.
Ich erläutere es mal so. Es sieht beim übergang z.B. von 8 auf 9 etwas
durchsichtig und wenn es genau 9°C ist dann normal.
Meine Frage kann man diesen Übergang flüssiger machen wie auf dem Video
??
Oder woran kann das liegen??
Hoffe ihr habt mich verstanden, ich weiß sonst nicht wie ich es anders
erklären soll :)
Hmm... Vielleicht über PWM. Dass die 1 in die 2 übergefadet wird. Ich
weiß aber nicht, in wie fern du dir das zutraust. Siehe LED-Fading bei
dem LED Arikel
Mir fallen folgende Punkte auf:
Der Kontrast-Pin C: muss da nicht 0-1V über Poti ran, bei anderen
Displays brauchen negative Spannung. Steht den in der Anleitung deines
Displays das da +5Volt drauf müssen?
RW_Pin: ist es richtig das der RW_Pin fest auf +5V kommen? Du willst
also das Display nur mit dem PIC auslesen und nichts auf das Dispaly
schreiben?
Backligth: Hier sind ein oder mehrer LEDs geschaltet, sicher hast Du
schon mal was davon gehört das man LEDs nie ohne Vorwiderstand betreiben
darf, aber sicher ist entweder schon die LED oder die Leiterbahn
durchgebrannt.
Sicher weißt Du auch welcher Controller dauf ist und wie man ihn
ansteuert
Hättest du vor dem Anschluss des Displays das Datenblatt gelesen,
bräuchstest du hier keine Fragen stellen...