Es ist vollbracht ...
Hallo,
ich hab das Proggi tatsächlich mit Bascom in den Tiny2313 gequetscht
bekommen
So siehts jetzt aus ..
CodeBox BASCOM
' ####################################################
' ##### Basisroutinen für das Tiny2313-EvalBoard #####
' ####################################################
' (c) 27.06.2010 by Dino
'
' Frequenzmessung und Temperaturmessung fuer
' Zisternenanzeige (Fuellstand und Innentemperatur)
' Prozessor ATtiny2313
$regfile = "ATtiny2313.DAT"
$crystal = 20000000
$hwstack = 32
$swstack = 32
$framesize = 32
$noramclear
' ####################################
' ##### DEFINITION DER VARIABLEN #####
' ####################################
'
' Array fuer den 1Wire-Sensor
Dim Ds18s20(9) As Byte
' Variablen fuer DS18S20 Temperatur
Dim Ds_count As Byte '
Dim Deg_lo As Byte
Dim Deg_hi As Byte
' Variablen fuer Frequenzmessung
Dim Ticks As Word
Dim Cnt_lo As Byte
Dim Cnt_md As Byte
Dim Cnt_hi As Byte
Dim T1ovf As Byte
' ################################
' ##### DEFINITION DER PORTS #####
' ################################
'
' PD0 --<---- RxD | UART
' PD1 ---->-- TxD | TTL-Pegel
'
' PD2 --<---- INT0
' PD3 --<---- INT1
' PD4 --<---- T0 --- 1Wire
' PD5 --<---- T1 --- Mess-Oszillator
' ____________
' | |
' PB0 ---->--|D4 |
' PB1 ---->--|D5 LCD 4Bit |
' PB2 ---->--|D6 HD44780 |
' PB3 ---->--|D7 2x16Chr |
' | |
' PD6 ---->--|E / Sys-LED |
' PB4 ---->--|RS |
' |____________|
'
' PB5 ---->-- SDA - MOSI |
' PB6 --<---- --- - MISO | ISP-Port
' PB7 ---->-- SCL - SCK |
'
' PA0 -- XTAL1 | Systemquarz
' PA1 -- XTAL2 | 20,000MHz
' PA2 -- RESET
'
' ===== PortB =================================================================
' O=7= I=6= O=5= O=4= O=3= O=2= O=1= O=0= => 10111111 => DDRB
' SCL ?? SDA RS D7 D6 D5 D4 => 01000000 => PORTB (init)
' | | | | | | | |
'
Ddrb = &B1011_1111
Portb = &B0100_0000
' ===== PortD =================================================================
' I=7= O=6= I=5= I=4= I=3= I=2= O=1= I=0= => 01000010 => DDRD
' ---- E T1 T0 INT1 INT0 TxD RxD => 00111101 => PORTD (init)
' x | | | | | | |
'
Ddrd = &B0100_0010
Portd = &B0011_1101
'
' ===== UART (TTL) initialisieren =============================================
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
' Config Serialin = Buffered , Size = 4
Open "com1:" For Binary As #1
' Clear Serialin
' ===== 1Wire-Bus DS18S20 Temperatursensor ====================================
Config 1wire = Portb.1
'
' ===== Lcd Initialisieren ====================================================
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portd.6 , Rs = Portb.4
Config Lcdbus = 4
Initlcd
Cursor Off
Cls
' ===== Timer Initialisieren ==================================================
Config Timer0 = Timer , Prescale = 256
On Ovf0 Tim0_isr
Config Timer1 = Counter , Edge = Falling , Prescale = 1
On Ovf1 Tim1_isr
Enable Timer0
Enable Timer1
' ###############################################
' ##### Hauptschleife Start #####################
' ###############################################
Do
Gosub Ds18s20_temp
Gosub Ds18s20_mess
Ticks = 0
Enable Interrupts
Waitms 1100
' Debug-Anzeige
Locate 1 , 1
Lcd Hex(cnt_hi) ; " " ; Hex(cnt_md) ; " " ; Hex(cnt_lo)
Locate 2 , 1
Lcd Hex(deg_hi) ; " " ; Hex(deg_lo)
' Uebertragung der Daten ueber UART (9k6 8n1)
Print #1 , Chr(cnt_hi) ; Chr(cnt_md) ; Chr(cnt_lo); Chr(deg_hi) ; Chr(deg_lo)
Loop
' ###############################################
' ##### Hauptschleife Ende ######################
' ###############################################
' ============================================
' ===== Sub fuer DS18S20 Messung starten =====
' ============================================
Ds18s20_mess:
1wreset ' 1Wire-Bus zuruecksetzen
1wwrite &HCC ' Alle 1Wire-Devices ansprechen
1wwrite &H44 ' Temperaturmessung starten
Return
' ================================================
' ===== Sub fuer DS18S20 Temperatur einlesen =====
' ================================================
Ds18s20_temp:
1wreset ' 1Wire-Bus zuruecksetzen
1wwrite &HCC ' Alle 1Wire-Devices ansprechen
1wwrite &HBE ' Scratchpad einlesen
For Ds_count = 1 To 9
Ds18s20(ds_count) = 1wread() ' Scratchpad in Array uebertragen
' Print #1 , Count ; " - " ; Ds18s20(count)
Next
If Ds18s20(9) = Crc8(ds18s20(1) , 8) Then ' Wenn CRC8 korrekt dann Berechnung starten
Deg_lo = Ds18s20(1) ' Temperatur LSB
Deg_hi = Ds18s20(2) ' Temperatur MSB
End If
Return
' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist das Gate fuer die Frequenzmessung
Tim0_isr:
Timer0 = 178
Incr Ticks
If Ticks = 1 Then
Timer1 = 0
T1ovf = 0
End If
If Ticks = 1001 Then
Cnt_lo = Tcnt1l ' Frequenz LSB (Byte 1)
Cnt_md = Tcnt1h ' Frequenz (Byte 2)
Cnt_hi = T1ovf ' Frequenz MSB (Byte 3)
Disable Interrupts
End If
Return
' ================================================
' ===== ISR fuer Timer1 Overflow =================
' ================================================
' Timer1 ist der Zaehler fuer die Frequenzmessung
Tim1_isr:
Incr T1ovf ' 16Bit-Ueberlauf (Byte3) bearbeiten
Return
' ###############################################
' ##### Programm Ende ###########################
' ###############################################
' Close #1
End
73% vom 2kB-Flash werden verwendet (also ca 1,5kByte)
Vom Programm aus der Elektor 4/2009 das ich als Vorlage/Beispiel
verwendet habe ist nicht mehr wirklich viel übrig geblieben
Dafür ist eine 1Wire-Temperaturmessung und die Frequenzmessung drin,
die Werte werden als Debug-Info auf dem LCD angezeigt und als rohe
Bytes auf dem UART übertragen ...
und hier die Einstellung des Timer0 (8Bit) für die Gate-Zeit für die
Frequenzmessung. Also die Zähldauer für die Impulse am Timer1.
Mit Prescaler=256 und Reload von 178 ergibt sich in etwa 1ms die dann
über die Variable Ticks auf 1sec erweitert wird. Die genaue Frequenz ist
aber nicht so wichtig. Man muß nachher sowieso den gemessenen Wert
auf die Füllhöhe der Zisterne umrechnen.
Nun kann es also weiter gehen. Bei der Auswerte-Einheit hab ich im Gehäuse
mehr Platz und kann da auch nen normalen Mega8 im DIP-Gehäuse nehmen.
Bei der entgültigen Meßeinheit fällt dann nachher das LCD wieder weg. Für
den Probezeitraum will ich es aber unbedingt haben.
Mit einem Funktionsgenerator hab ich den Tiny2313 bis auf 2,2MHz am T1-Pin
getestet. Läuft alles super. Er könnte evtl sogar noch höhere Frequenzen ab.
Gruß
Dino