Xaver
02.01.2006, 15:05
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:
$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
An irgeneiner stelle muss er auf die idee kommen die untere hälfte zu nehmen.
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:
$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
An irgeneiner stelle muss er auf die idee kommen die untere hälfte zu nehmen.