' #################################################
' ##### Basisroutinen für das Mega8-EvalBoard #####
' #################################################
' (c) 27.06.2010 by Dino
'
'
'
' Prozessor ATmega8 8kB Flash, 512B EEPROM, 1kB SRAM
$regfile = "m8def.dat"
' 16,000MHz Quarztakt
$crystal = 16000000
' Fuses ======
' 0:BODLEVEL 4.0V
' 0:BODEN enabled
' 111111:Ext. Crystal/Resonator High Freq.
' 11:128 Words boot size,F80
$prog &HFF , &H3F , &HDF , &H00 ' generated. Take care that the chip supports all fuse bytes.
$hwstack = 32
$swstack = 32
$framesize = 32
$noramclear
' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' PD0 --<---- RxD | UART
' PD1 ---->-- TxD | TTL-Pegel
'
' PD2 --<---- INT0
' PD3 --<---- INT1
' ____________
' | |
' PD4 ---->--|D4 |
' PD5 ---->--|D5 LCD 4Bit |
' PD6 ---->--|D6 HD44780 |
' PD7 ---->--|D7 2x16Chr |
' | |
' PB0 ---->--|E / Sys-LED |
' PB1 ---->--|RS |
' |____________|
'
' PB2 ---->-- /SS |
' PB3 ---->-- MOSI | SPI-Bus
' PB4 --<---- MISO |
' PB5 ---->-- SCK |
'
' PB6 -- XTAL1 | Systemquarz
' PB7 -- XTAL2 | 16,000MHz
'
' ===== PortB =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= O=1= O=0= => 00101111 => DDRB
' XTAL2 XTAL1 SCK MISO MOSI /SS RS E => 00010000 => PORTB (init)
' | | | | | | | |
'
Ddrb = &B0000_0011
Portb = &B0011_1100
' ===== PortD =================================================================
' O=7= O=6= O=5= O=4= I=3= I=2= O=1= I=0= => 11110010 => DDRD
' LCD7 LCD6 LCD5 LCD4 INT1 INT0 TxD RxD => 00001101 => PORTD (init)
' | | | | | | | |
'
Ddrd = &B1111_0010
Portd = &B0000_1101
'
' ===== UART (TTL) initialisieren =============================================
Config Com1 = 1200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 32
Open "com1:" For Binary As #1
Clear Serialin
'
' ===== LCD initialisieren ====================================================
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.0 , Rs = Portb.1
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
'
' ===== SPI initialisieren ====================================================
'
' ===== PortC (analog/digital) ================================================
'
' PC0 -- frei
' PC1 -- frei
' PC2 -- frei
' PC3 -- frei
'
' PC4 --<->-- SDA | I2C
' PC5 ---->-- SCL | TWI
'
' PC6 --<---- RESET
'
' ===== PortC =================================================================
' I=7= I=6= I=5= I=4= I=3= I=2= I=1= I=0= => 00000000 => DDRC
' ---- Reset SCL SDA T3 T2 T1 T0 => 00111111 => PORTC (init)
' x x | | | | | |
'
Ddrc = &B0000_0000
Portc = &B0011_1111
' ===== I2C/TWI initialisieren ================================================
'Config Scl = Portc.5
'Config Sda = Portc.4
'I2cinit
'Config Twi = 100000 ' Taktfrequenz 100 kBit/s
' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
'Twcr = &B00000100 ' nur TWEN setzen
' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0 ' Status und Prescaler Register
' Twbr = 152 ' Bit Rate Register, 72 = 100kHz 152 = 50kHz(0 bis 255)
' Config I2cdelay = 40
' ===== Logo anzeigen =========================================================
Locate 1 , 1
Lcd "Zisterne"
Locate 2 , 1
Lcd "Dino2012"
Wait 1
Cls
' =============================================================================
Enable Interrupts
'---------------------------------------------------
' Uebertragung der Daten ueber UART (1k2 8n1) im Hexformat mit crlf (0D 0A) als Endmarke
' gesamt : 13 Byte => 26 Chr in Hex ... + Ende-Zeichen crlf (0d 0a)
' Wegen der besseren Debug-Moeglichkeit ueber ein Terminal habe ich mich gegen die Binaeruebertragung
' entschieden. Die Gegenstelle liest dann die Daten ueber ...
' INPUTHEX [" prompt" ] , var[ , varn ]
' ... in numerische Variablen ein. Ueber das CRLF als Zeilenende ist die Trennung der Datentelegramme
' gegenueber Binaertelegrammen auch einfacher.
' __LSB
' // __MSB __CntRemain uuuu = Userdefined Bytes im EEPROM
' || // // __Cnt/deg ffff = Reserved Bytes (FF FF)
' |||| || // __CRC
' llmm uuuuffff |||| cc _________Freq
' AA00 4B46FFFF 0C10 87 DBD9E53F
' 3200 4B46FFFF 0E10 FA 00045946 <=== Leerzeichen im Texteditor eingefuegt um die
' 3200 4B46FFFF 0D10 AF 000459DD Lesbarkeit der Datentelegramme zu verbessern
' Ready
' AA00 4B46FFFF 0C10 87 000459DD
' 3200 4B46FFFF 0D10 AF 000459DA
' 3200 4B46FFFF 0D10 AF 000459D6
' ____-________-____-__ ________
' 1234 56789012 3456 78 90123456
' 0000 00000111 1111 11 12222222
' === Ohne eingefügte Leerzeichen (so kommt es ueber die Leitung) ===
' AA004B46FFFF0C1087DBD9E537
' 34004B46FFFF0F10AD00045B12
' 34004B46FFFF0F10AD00045B79
' 34004B46FFFF0E106900045B72
' 00000000000000000000000000 Startmeldung ueber UART
' AAAAAAAAAAAAAAAAAAAAAAAAAA 26xA als Mess-Anfang (nach Senden von "a")
' EEEEEEEEEEEEEEEEEEEEEEEEEE 26xE als Mess-Ende (nach Senden von "e")
Dim A As Byte
A = 0
' ne Zaehlervariable
Dim Count As Byte ' Zaehlervariable fuer allen Kram
Dim Com1chrwait As Byte , Com1chrin As Byte ' UART-Steuerung
Com1chrwait = 0
Com1chrin = 0
Dim Text As String * 30 ' Empfangsstring
Dim Transfer As Byte ' Ablaufsteuerung
Transfer = 0 ' 0 = kein Datentransfer
' 1 = Datentransfer
' 2 = Daten fertig fuer Bearbeitung
Dim Tmpstr As String * 8 ' Temporaerer String
Dim Freq As Long ' Frequenzmessung
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte
' Variablen fuer DS18S20 Temperatur
Dim Ds_temp As Integer ' 2 Bytes : -32768 bis +32767
Dim Ds_count As Byte '
Dim Temperatur As Single ' 4 Bytes : 1.5 x 10^-45 bis 3.4 x 10^38
Temperatur = 8 ' vorbelegen mit 8°C
Dim Loopcount As Word
Loopcount = 0
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do
Com1chrwait = Ischarwaiting(#1)
If Com1chrwait = 1 Then
If Transfer = 0 Then ' Transferstart ?
Text = "" ' Empfangsstring loeschen
Transfer = 1 ' Daten liegen an und werden empfangen
End If
Com1chrin = Waitkey(#1) ' Byte lesen
If Com1chrin = &H0D Then
'Transfer = 2 ' Transfer-Ende (cr empfangen)
NOP
Elseif Com1chrin = &H0A Then
Transfer = 2 ' Transfer-Ende (lf empfangen)
Else
Text = Text + Chr(com1chrin) ' Byte als Character anfuegen
End If
Else
Com1chrin = 0
End If
If Transfer = 2 Then
' ===== DS18S20 Daten in Array uebernehmen =====
For Count = 0 To 8
A = Count * 2
A = A + 1
Tmpstr = Mid(text , A , 2) ' alle 9 Bytes bearbeiten
Ds18s20(count + 1) = Hexval(tmpstr) ' Scratchpad in Array uebertragen
Next
' ===== DS18S20 Array verarbeiten =====
If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then ' Wenn CRC8 korrekt dann Berechnung starten
Ds_temp = Makeint(ds18s20(1) , Ds18s20(2)) ' LSB und MSB zu 16Bit-Integer zusammensetzen
' ===== Ab hier eine genaue Berechnung =====
' Shift Ds_temp , Right , 1 ' durch 2 teilen
' If Ds_temp.14 = 1 Then Ds_temp.15 = 1 ' Vorzeichen wieder herstellen (2er Komplement)
' Ds_count = Ds18s20(8) - Ds18s20(7) ' Formelteil ... ( COUNT_PER_C - COUNT_REMAIN )
' Temperatur = Ds_count / Ds18s20(8) ' Formelteil ... / COUNT_PER_C
' Temperatur = Temperatur + Ds_temp ' Der Rest der Formel
' Temperatur = Temperatur - .25 ' Der Rest der Formel
' ===== oder eine Berechnung auf 0,5 Grad genau =====
Temperatur = Ds_temp / 2 ' Nachkommateil erzeugen
Locate 1 , 1 ' Die CRC8-Checksumme hat nicht gepasst
Lcd Temperatur ; "deg "
Else
Locate 1 , 1 ' Die CRC8-Checksumme hat nicht gepasst
Lcd "CRC-Err "
End If
' ===== Debug-Daten anzeigen =====
Tmpstr = Mid(text , 1 , 4) ' DS18S20 LSB, MSB
Locate 1 , 9
Lcd Tmpstr ;
Tmpstr = Mid(text , 13 , 2) ' DS18S20 RemainCnt
Lcd Tmpstr ;
Tmpstr = Mid(text , 17 , 2) ' DS18S20 CRC
Lcd Tmpstr
Tmpstr = Mid(text , 19 , 8) ' FreqCnt 4Bytes = 8 Character
Locate 2 , 9
Lcd Tmpstr
Freq = Hexval(tmpstr)
Locate 2 , 1
Lcd Freq ; " "
Transfer = 0 ' Bearbeitungsende
End If
' ===== Messung abschalten =====
If Pinc.0 = 0 Then
Print #1 , "a";
Else
End If
' ===== Messung einschalten =====
If Pinc.1 = 0 Then
Print #1 , "e";
Else
End If
If Pinc.2 = 0 Then
Else
End If
If Pinc.3 = 0 Then
Else
End If
'If Loopcount = 0 Then
' Locate 1 , 1
' Lcd A ; " "
' Incr A
'' Print #1 , "test serial port 1"
'End If
Incr Loopcount
Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################
' ################################################
Close #1
End