ich arbeite gerade an einem Kapazitätsmessgerät mit eigener kalibrierung. Es funktioniert auch soweit ganz gut, es hat nur einen kleinen schönheitsfehler, den ich nicht finde.
Ich verwende ein 4 * 27 Zeiliges Display von pollin und einen Mega 8.
Beim Start steht, wie es auch soll :
" Das kapazitaetsmessgeraet "
" ***** MEGA 8 ***** "
" (c) Boris Eskin "
" (c) Olaf Petersen "
Dann soll die Zweite Zeile verschwinden und an der Stelle die gemessenen Werte anzeigen. Doch leider sind sie immer in der unteren Displayhälfte.
" Das kapazitaetsmessgeraet "
" ***** MEGA 8 ***** " <-- hier soll es hin
" (c) Boris Eskin "
" 123.00 nF " <-- hier ist es
nun der Code:
An irgeneiner stelle muss er auf die idee kommen die untere hälfte zu nehmen.Code:$regfile = "m8def.dat" 'Atmel MEGA 8 controller $crystal = 16000000 'Quarz auf 16MHz '-- Portbelegung ------------------------------------------------------------- Ddrd.3 = 0 'PD3/INT0 als Eingang deklarieren Portd.3 = 1 'Pullup Widerstand aktiveren Taste Alias Pind.3 'Taste zu Kalibrierung Ddrd.6 = 1 'PD6/INT0 als Ausgang deklarieren Relais Alias Portd.6 'Ralais zu Kalibrierung Relais = 0 'Relais ausschalten '27 x 4 LCD Display angeschlossen 'Festlegen der Verwendeten Ports 'Wenn es nur einen Kontroler gibt das sollte Port E2 der Gleiche wie E sein Ddrc = &B00111111 Portc.1 = 0 'R/W auf masse Ddrd.0 = 1 Ddrd.1 = 1 Dim ___lcdno As Bit 'zwischen den LCD kontroler wechseln Config Lcdpin = Pin , E = Portc.2 , E2 = Portc.3 , Rs = Portc.0 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portd.1 , Db7 = Portd.0 Config Lcd = 40 * 4 '--Variablen ------------------------------------------------------------------ Dim Counter_ueberlauf As Integer 'anzahl der Überlaufe von timer 1 Dim Timerprescale As Long 'um timer auf 1 sec zu stellen Dim Frequenz As Single 'momentahne Frequenz Dim Freq1 As Single 'leerlauf Dim Freq2 As Single 'mit Relais Dim Freqx As Single 'kapazität Dim C1 As Single 'aus der kalibrierung ergebener Wert Dim Cx As Single 'gemessene kapazität Dim L1 As Single 'aus der Kalibrierung Dim Tmp As Single 'variable für Formeln und rechnungen Dim Tmp2 As Single 'variable für Formeln und rechnungen Dim Kalibrierung As Bit 'kalibrierung aktiv Dim K_i As Bit 'so für die kalibrierung Dim K_r As Bit Dim S As String * 27 ' String der Angezeigt wird '--Interrupts------------------------------------------------------------------ On Timer1 Oncounter 'Interrupt anzahl der Impulse On Timer0 Ontimer 'Interrupt eine Sekunde ermitteln On Int1 Ontaste 'Interrupt Taste Kalibrierung Config Timer0 = Timer , Prescale = 1 ' eine Sekunde ermitteln Const Timervorgabe = 62500 ' 62500 * 265 ergibt 16Mhz Config Timer1 = Counter , Edge = Rising , Noise Cancel = 1 'Timer als Timer Festlegen Enable Timer0 'Timer0 Aktivieren Enable Timer1 'Timer1 aktivieren Enable Int1 'Taste aktivieren '--Hauptprogramm-------------------------------------------------------------- Stop Timer1 'erstmal stop damit nicht schon Stop Timer0 'jetzt interrupts kommen ___lcdno = 0 'Ober Displayhälfte initialisieren, wenn Initlcd 'das Display 2 Lcd-Controller besitzt Cursor Off Cls ___lcdno = 1 'untere Displayhälfte initialisieren, Initlcd 'das Display 2 LCD-Controller besitzt Cursor Off Cls ___lcdno = 0 ' auf obere hälfte den Titel schreiben Home Locate 1 , 2 Lcd "Das Kapatitaetsmessgeraet" Locate 2 , 5 Lcd "***** MEGA 8 *****" ___lcdno = 1 ' auf untere hälfte die Namen Home Locate 1 , 5 Lcd "(c) Boris Eskin" Locate 2 , 5 Lcd "(c) Olaf Petersen" Wait 2 '-- Alle werte auf Startwerte setzen ------------------------------------------ ___lcdno = 0 'Obere displayhälfte auswählen Home Counter_ueberlauf = 0 'startwert festlegen Timerprescale = 0 'startwert festlegen Freq1 = 0 'leerlauffrequenz Freq2 = 0 Freqx = 0 C1 = 0 '~700 nF Cx = 0 Kalibrierung = 1 'mit der Kalibrierung beginnen Start Timer1 Start Timer0 Enable Interrupts 'Allgemein Interrupts erlauben '--jetzt kann es losgehen ----------------------------------------------------- Do If Kalibrierung = 0 Then Tmp = Freq1 * Freq1 'Berechnung der Kapazität Tmp2 = Frequenz * Frequenz Tmp = Tmp / Tmp2 Tmp = Tmp - 1 Cx = Tmp * C1 'in nF S = Fusing(cx , "#.####") 'unbekannte Kapazität anzeigen S = S + " nF" Else If K_i = 0 Then 'warten auf den zweiten messwert K_i = 1 S = "Kalibrierung " Else If K_r = 0 Then 'ermitteln der leerlauffrequenz Freq1 = Frequenz K_r = 1 Relais = 1 S = "Relais an" Else Freq2 = Frequenz 'kalibrierfrequenz Tmp = Freq2 * Freq2 Tmp2 = Freq1 * Freq1 Tmp2 = Tmp2 - Tmp Tmp = Tmp / Tmp2 C1 = Tmp * 0.1 'ermittelter wert für C1 Relais = 0 'relais aus Kalibrierung = 0 'Kalibrierung beenden Tmp = C1 * 1000 S = Fusing(tmp , "#.##") 'ermittelten wert anzeigen S = S + " pF " End If End If End If ' anzeige auf dem LCD ___lcdno = 0 'obere Displayhälfte Locate 2 , 0 Lcd " " 'LCD Zeile löschen Locate 2 , 8 Lcd S 'Ausgabe am LCD Wait 1 Loop End '-- Interrupthändler für Überlauf an Timer 1 ---------------------------------- Oncounter: Incr Counter_ueberlauf 'Überlaufe Zählen Return '-- Interrupthändler für Überlauf an Timer 0 ---------------------------------- Ontimer: Incr Timerprescale 'Überlaufzähler um eins erhöhen# If Timerprescale = Timervorgabe Then 'nach einer Sekunde Timer0 = Timervorgabe Frequenz = Counter_ueberlauf * 65536 Frequenz = Timer1 + Frequenz Frequenz = Frequenz / 1000 'in kHz Timerprescale = 0 Counter_ueberlauf = 0 Timer1 = 0 End If Return '-- Interrupthändler für Taste Kalibrierung ----------------------------------- Ontaste: Kalibrierung = 1 K_i = 0 K_r = 0 Return







Zitieren

Lesezeichen