ATMEGA-SKS
 
Atmega-Steck-Karten-System

 


Luftdruck- und Luftfeuchte-Sensor

Auf dieser Steckkarte befindet sich je ein Luftdruck-Sensor HP03S und ein Luftfeuchtigkeits-Sensor HH10D.
Die Versorgungsspannung der Sensoren beträgt 3,3 Volt.
Deshalb wurde für dieses Projekt ein ATMEGA644p verwendet.
Der ATMEGA644p wird ebenfalls mit 3,3 Volt betrieben.
Das LCD-Display wird mit 5 Volt betrieben und erkennt die 3,3 Volt Signale des ATMEGA644p ohne Probleme.

(Schaltplan folgt demnächst)

Um die Daten eines HP03S verarbeiten zu können müssen einige Vorbereitungen getroffen werden.
Zunächst muss eine Frequenz von ca. 32 kHz erzeugt werden die an den Anschluss MCLK gelegt wird damit der HP03S seine Messungen vornehmen kann.
Zusätzlich müssen Parameter über den I2C Anschluss aus dem EPROM des HP03S gelesen werden, sie dienen zur Kalibrierung der Messung, dabei muss der Anschluss XCLR auf auf LOW liegen.
Die Messwerte werden dann auch über den I2C Anschluss gelesen, dabei muss der XCLR Anschluss auf HIGH liegen.
 
Das unten stehende Programm ist ein erster Versuch um die beidem Module auslesen zu können. Man kann bestimmt noch das ein oder andere verbessern. Verbesserungsvorschläge sind wie immer willkommen.

' **************************************
' *    Projekt: HP03S & HH10D          *
' *    Date:    25.02.2011             *
' *    Autor:   DL4FBZ & DL1ZAX        *
' *    Atmega:  644p                   *
' *    LCD:     4 * 20                 *
' *    Version: 1.1                    *
' **************************************

$regfile = "m644pdef.dat"
$crystal = 16000000

$hwstack = 32
$swstack = 20
$framesize = 10
$baud = 38400                                               'Testausgabe über Schnittstelle

'Variablen
Dim Msb As Byte
Dim Lsb As Byte
Dim C1 As Word
Dim C2 As Word
Dim C3 As Word
Dim C4 As Word
Dim C5 As Word
Dim C6 As Word
Dim C7 As Word
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim D1 As Word
Dim D2 As Word

Dim Dut As Single
Dim Dut1 As Single
Dim Dut2 As Single
Dim Dut4 As Single
Dim Offset As Single
Dim Offset1 As Single
Dim Sens As Single
Dim X As Single
Dim Dut3 As Single
Dim T As Single
Dim Dis As String * 20
Dim Anzeige As String * 20
Dim P As Single
Dim Tt As Single
Dim Dd As Single
Dim I As Byte
Dim Sensf As Byte
Dim Offsetf As Word
Dim Frequenz As Single
Dim Takt As Single
Dim L As Integer

Declare Sub Eeprom_auslesen()
Declare Sub Messwerte_einlesen()
Declare Sub Berechnung()
Declare Sub Ausgabe()
Declare Sub Eeprom_feuchte_auslesen()
Declare Sub Frequenz_messen()
Declare Sub Luftfeuchte_berechnen()

'Init LCD Display
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd., Db5 = Portd., Db6 = Portd., Db7 = Portd., E = Portd., Rs = Portd.2
Config Lcd = 20 * 4
Initlcd

Cls
Cursor Off
Deflcdchar 1 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32           ' Sonderzeichen °

' Definition des I2C Bus
Config Scl = Portc.0
Config Sda = Portc.1
Config I2cdelay = 10
I2cinit                                                     'start i2c

' Init Port
Config Pina.= Output                                      'MCLK Takt 32,768kHz
Mclk Alias Porta.0
Config Pina.= Output                                      'XCLR Pin
Xclr Alias Porta.1
Config Pinb.= Input                                       'Pin Fout von HH10D Feuchtigkeitsfühler
Set Portb.2.0
Fout Alias Pinb.2

' Init Timer
Ocr0a = 243                                                 '243 Zählerwert um 32768 Hz zu erzeugen (hälfte des errechneten Wertes!!)

Config Timer1 = Timer , Prescale = 1                        'Timer zur Frequenzmessung des Feuchtefühlers
Config Timer0 = Timer , Prescale = 1 , Clear Timer = 1 , Compare A = Disconnect

On Oc0a Timer0serv
Enable Oc0a
Enable Interrupts
Enable Timer1

Call Eeprom_auslesen()
Waitms 50
Call Eeprom_feuchte_auslesen()

' Start Programm
Do
   Locate 4 , 20
   Lcd "*"
   Call Messwerte_einlesen()                                'Messwerte HP03s
   Call Berechnung()                                        'Berechnung Luftdruck und Temperatur
   Locate 4 , 20
   Lcd " "

   'Disable Interrupts                                       'Takt HP03 abschalten
   Stop Timer0
   Waitms 100
   Call Frequenz_messen()                                   'Frequenz messen HH10D
   Call Luftfeuchte_berechnen()                             'Berechnung der Luftfeuchte
   Waitms 100

   Call Ausgabe()                                           'Werte ausgeben
   'Enable Interrupts                                        'Takt HP03 einschalten
   Start Timer0
   Wait 5

Loop
End

' Takt Erzeugung für MCLK Anschluss
Timer0serv:
  Toggle Mclk                                               'Takt Pin MCLK
Return

Sub Eeprom_auslesen()                                       'Daten aus EEPROM HP03 auslesen
   Xclr = 0
   I2cstart
   I2cwbyte &HA0
   I2cwbyte &H10
   I2cstart
   I2cwbyte &HA1
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C1 = Msb * 256
   C1 = C1 + Lsb
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C2 = Msb * 256
   C2 = C2 + Lsb
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C3 = Msb * 256
   C3 = C3 + Lsb
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C4 = Msb * 256
   C4 = C4 + Lsb
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C5 = Msb * 256
   C5 = C5 + Lsb
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C6 = Msb * 256
   C6 = C6 + Lsb
   I2crbyte Msb , Ack
   I2crbyte Lsb , Ack
   C7 = Msb * 256
   C7 = C7 + Lsb
   I2crbyte A , Ack
   I2crbyte B , Ack
   I2crbyte C , Ack
   I2crbyte D , Nack
   I2cstop

End Sub

Sub Messwerte_einlesen()                                    'Messwerte Luftdruck und Temperatur einlesen
   Xclr = 1
   Waitms 50
   I2cstart                                                 'Temperatur
   I2cwbyte &HEE
   I2cwbyte &HFF
   I2cwbyte &HE8
   I2cstop
   Waitms 50
   I2cstart
   I2cwbyte &HEE
   I2cwbyte &HFD
   I2cstart
   I2cwbyte &HEF
   I2crbyte Msb , Ack
   I2crbyte Lsb , Nack
   I2cstop
   D2 = Msb * 256
   D2 = D2 + Lsb
   Waitms 50
   I2cstart                                                 'Luftdruck
   I2cwbyte &HEE
   I2cwbyte &HFF
   I2cwbyte &HF0
   I2cstop
   Waitms 50
   I2cstart
   I2cwbyte &HEE
   I2cwbyte &HFD
   I2cstart
   I2cwbyte &HEF
   I2crbyte Msb , Ack
   I2crbyte Lsb , Nack
   I2cstop
   D1 = Msb * 256
   D1 = D1 + Lsb

   Xclr = 0
End Sub

Sub Berechnung()                                            'Berechnung Luftdruck und Temperatur
   Dut1 = D2 - C5                                           '1.Schritt
   Dut1 = Dut1 / 128                                        '2 hoch 7
   Dut4 = 2
   For I = 2 To C
      Dut4 = Dut4 * 2
   Next I
   If D2 >= C5 Then
      Dut2 = A / Dut4
   Else
      Dut2 = B / Dut4
   End If
   Dut4 = Dut1 * Dut1
   Dut4 = Dut4 * Dut2
   Dut = D2 - C5
   Dut = Dut - Dut4

   Offset = C4 - 1024                                       'Schritt2
   Offset1 = Dut / 16384                                    '2 hoch 14
   Offset = Offset * Offset1
   Offset = Offset + C2
   Offset = Offset * 4

   Sens = Dut / 1024                                        'Schritt3  2 hoch 10
   Sens = C3 * Sens                                         ' mal 4 entfällt in Formel
   Sens = C1 + Sens

   X = D1 - 7168                                            'Schritt4
   X = X / 16384                                            '2 hoch 14
   X = Sens * X
   X = X - Offset

   P = 10 / 32                                              'Luftdruck  2 hoch 5
   P = X * P
   P = P + C7
   P = P / 10
   P = P + 17                                               'Achtung!!!! Offset für Höhe +17

   Dd = 2
   For I = 2 To D
      Dd = Dd * 2
   Next I
   Dut3 = Dut / Dd                                          'Temperatur
   Tt = C6 / 65536
   Tt = Dut * Tt
   T = 250 + Tt
   T = T - Dut3
   T = T / 10

End Sub

Sub Ausgabe()
   Anzeige = "Temperatur:          "
   Dis = Fusing(, "###.#")
   Dis = Dis + " " + Chr(1) + "C"
   L = 20 - Len(dis)
   Anzeige = Left(anzeige , L) + Dis
   Locate 1 , 1
   Lcd Anzeige

   Anzeige = "Luftfeuchte:         "
   Dis = Fusing(frequenz , "#.#")
   Dis = Dis + " % "
   L = 20 - Len(dis)
   Anzeige = Left(anzeige , L) + Dis
   Locate 2 , 1
   Lcd Anzeige

   Anzeige = "Luftdruck:           "
   Dis = Fusing(, "#.#")
   Dis = Dis + " hP"
   L = 20 - Len(dis)
   Anzeige = Left(anzeige , L) + Dis
   Locate 3 , 1
   Lcd Anzeige

End Sub

Sub Eeprom_feuchte_auslesen()                               'Eeprom HH10d auslesen
   I2cstart
   I2cwbyte &HA2
   I2cwbyte &H09
   I2cstart
   I2cwbyte &HA3
   I2crbyte Msb , Ack                                       'Wert verwerfen (H09)
   I2crbyte Lsb , Ack                                       'Adresse (H0A)
   Sensf = Lsb
   I2crbyte Msb , Ack                                       'Wert verwerfen (H0B)
   I2crbyte Msb , Ack                                       'Adresse (H0C)
   I2crbyte Lsb , Nack                                      'Adresse (H0D)
   Offsetf = Msb * 256
   Offsetf = Offsetf + Lsb
   I2cstop
End Sub

Sub Frequenz_messen()                                       'Frequenz messen
   Stop Timer1                                              'Timer1 sicher stoppen
   Tcnt1 = 0                                                'Timerergebnis auf 0 setzten
   While Fout <> 1 : Wend                                   'synchronisieren mit Takt
   While Fout <> 0 : Wend
   Start Timer1
   While Fout = 0 : Wend                                    'einen kompletten Takt messen
   While Fout = 1 : Wend
   Stop Timer1
End Sub

Sub Luftfeuchte_berechnen()                                 'Messwerte Luftfeuchte berechnen
   Takt = 1 / 16000                                         'Zykluszeit in ms  -> 16000 kHz Quarz (16MHz)
   Frequenz = Tcnt1 * Takt                                  'Ergebnis Timer1 mal Zykluszeit
   Frequenz = 1 / Frequenz
   Frequenz = Frequenz * 1000                               'Umrechnung in Hz
   Frequenz = Offsetf - Frequenz                            '2 hoch 10
   Frequenz = Frequenz / 1024                               'Umrechnung in % und Ergebnis
   Frequenz = Frequenz * 100
End Sub