PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Compileroption Optimize Code



martin66119
03.04.2007, 10:02
Einen guten Morgen an alle!

Ich habe mal eine Frage zu der Compiler-Option "Potimize Code".

Welche Auswirkung hat diese Funktion auf den erzeugten Code (kleiner, schnelle, usw.).

Wenn ich für die Compilierung bei mir diese Funktion verwende, bekomme ich folgende Fehlermeldung:

Invalide comparison operator
Der Fehler zeigt auf die Codezeile mit Case 0

Im Vorfeld habe ich diesen Case mit Alias definiert

Messpunkt Alias 0

Grüße
Martin

x-ryder
07.04.2007, 11:29
schick mal bitte deinen ganzen quellcode, ich glaub da issn dicker fehler drin, denn konstanten macht man in bascom nich mit alias sondern mit const (const messpunkt = 0)

maddin

martin66119
08.04.2007, 22:40
Hier der gesamte Code

$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 46
$swstack = 40
$framesize = 40
'***************************Config Schaltausgänge*******************************
Config Portb = Output
Pumpeww Alias Portb.2
Brenner Alias Portb.3
Pumpefb Alias Portb.4
Pumpehk Alias Portb.5
'**************************Def. allgemeiner Variabeln***************************
Dim Tagnacht As Bit
Dim Nachtbetrieb As Byte
Dim Tagbetrieb As Byte
Dim Tempmessstelle(8) As Single

'Dim Setzeservo As Integer

Dim Tempmittel(8) As Single
Dim Tempmittelist(8) As Single
Dim Deltatempnewold As Single
Dim Z As Byte
Dim Y As Byte
Dim X As Byte
X = 0
Z = 0

Const Tagtemp_og = 21.6
Const Tagtemp_ug = 21.4
Const Nachttemp_og = 20.8
Const Nachttemp_ug = 20.6

Nachtbetrieb = 21
Tagbetrieb = 5

'***************Variabeln für Servo*********************************************
Config Portc.2 = Output

Dim Minimum As Integer
Dim Mittel As Integer
Dim Maximum As Integer
Dim Ist As Integer
Dim Deltaminmax As Integer
Dim Steigung As Integer
Dim Sollwert As Integer
Dim Pause As Byte

Minimum = 600
Mittel = 1500
Maximum = 600
Ist = Minimum
Deltaminmax = Maximum - Minimum
Steigung = Deltaminmax / 10
'**************************Funktionen LCD-Display*******************************

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

Dim ___lcdno As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls
'************************************************* ******************************

Config 1wire = Portc.1 'DS1820

Match_rom Alias &H55
Read_scratchpad Alias &HBE
Start_conversion Alias &H44

Innen Alias 0
Vorlauf Alias 1
Rücklauf Alias 2
Aussen Alias 3
Kessel Alias 4


Dim Read_temp As Integer
Dim Sensor_ids(48) As Byte
Dim Id As Byte
Dim Offset As Byte
Dim Ds_array(7) As Byte
Dim Bruchteil As Single
Dim Temperatur As Single
Dim I As Integer

'*************************Config Timer1*****************************************
Config Timer1 = Timer , Prescale = 256 '64 '256 'Konfiguriere Timer1
Enable Timer1 'schalte den Timer1 ein
On Timer1 Isr_von_timer1 'verzweige bei Timer1 überlauf zu Isr_von_Timer1
Enable Interrupts
Timer1 = 51135 'Timer1 soll schon von 34285 wegzählen
'***************************Config RTC******************************************
Config Sda = Portc.4
Config Scl = Portc.5

Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User ' this will dim the bytes automatic
Dim Weekday As Byte

'Time$ = "20:10:00" ' to watch the day changing value
'Date$ = "02.27.07" ' erstmaliges stellen der Uhr

Portc.2 = 0
'****************************Servo in Mittelstellun*****************************
'For I = 1 To 8
Pulseout Portc , 2 , 500 'Mittel 'Servo in Mittelstellung bringen
Waitms 60
' Portc.2 = 0
' Waitms 500
'Next I
'***************************ID 1Wire configurieren******************************
For Id = 1 To 40 'Einlesen der 5 Sensoren IDs (5*8 Byte)
I = Id - 1
Readeeprom Sensor_ids(id) , I
Next Id
'**************************Hauptrogramm*********** ******************************
Dim Tempaltplus As Single
Dim Tempaltminus As Single
Do
Print Tempmessstelle(5)
Wait 1
For Id = Innen To Kessel 'Kessel
Offset = Id * 8
Offset = Offset + 1 'Offset geht auf 1, 9, 17, 25 und 33
1wreset 'hier wird der Temperaturwert eingelesen
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8 '8 Byte ID wird übertragen
1wwrite Read_scratchpad
For I = 1 To 7 'nur bis 7, weil 8 und 9 uninteressant
Ds_array(i) = 1wread()
Next I
Read_temp = Makeint(ds_array(1) , Ds_array(2))
1wreset 'jetzt wird wieder die Konvertierung gestartet
1wwrite Match_rom
1wwrite Sensor_ids(offset) , 8
1wwrite Start_conversion
Shift Read_temp , Right
If 127 < Read_temp Then Read_temp = Read_temp - 32768
Bruchteil = 16 - Ds_array(7)
Bruchteil = Bruchteil / 16
Bruchteil = Bruchteil - 0.25
Temperatur = Read_temp + Bruchteil
Temperatur = Temperatur + 0.2
Deltatempnewold = Temperatur - Tempmessstelle(id + 1)

If Deltatempnewold < 0.5 Or Deltatempnewold > -0.5 Or Temperatur = Tempmessstelle(id + 1) Then
Tempmessstelle(id + 1) = Temperatur
Else
Tempmessstelle(id + 1) = Tempmessstelle(id + 1)
End If

___lcdno = 0

Select Case Id
Case Innen:
Locate 1 , 1 : Lcd "WZ: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Vorlauf: 'ausgabe im Display ist dann z.B.
Locate 2 , 1 : Lcd "VL: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#" ) ' Inn Auss Kess Rück Vorl
Case Rücklauf: ' 14.4 52.4 67.3 43.0 62.8
Locate 2 , 11 : Lcd "RL: "
Locate 2 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Locate 1 , 11 : Lcd "AT: "
Locate 1 , 14 : Lcd Fusing(tempmessstelle(8) , "#.###")

___lcdno = 1
Locate 2 , 20
Lcd Time$
Select Case Id
Case Aussen:
Locate 1 , 1 : Lcd "AU: "
Locate 1 , 5 : Lcd Fusing(temperatur , "#.#")
Case Kessel:
Locate 1 , 11 : Lcd "KE: "
Locate 1 , 14 : Lcd Fusing(temperatur , "#.#")
End Select
Locate 2 , 1 : Lcd "A2: "
Locate 2 , 5 : Lcd Fusing(temperatur , "#.#")
Cursor Off
Next Id
Gosub Schalterelais
'Gosub Servo
Gosub Tempmittel
Loop
End
'*******************************TempMittel******** ******************************
Servo:
Sollwert = Tempmessstelle(4) * Steigung
Sollwert = Sollwert + Minimum
If Tempmessstelle(4) >= 20.0 Then
If Ist < Sollwert And Ist > Minimum Then
Ist = Ist + 10 ' Incr Ist
Pulseout Portc , 2 , Ist
Waitms 60
End If
Else
Ist = Ist - 10 ' Incr Ist
Pulseout Portc , 2 , Ist
Waitms 60
End If
Wait 1
Return
'*************************Sub Relais schalten***********************************
Schalterelais:
Select Case Tagnacht
Case 0
Gosub Nachtbetrieb
Case 1
Gosub Tagbetrieb
End Select
Return
'**************************Sub für Tagbetrieb***********************************
Tagbetrieb:
If Tempmessstelle(1) >= Tagtemp_og Then 'And Oldmesswert(1) >= Tagtemp_og Then
Brenner = 0 ' Brenner
If Tempmessstelle(5) < 32.0 Then
Pumpefb = 0 ' Pumpe FB
Pumpehk = 0 ' PumpeHK
End If
If Tempmessstelle(5) > 34.0 Then
Pumpefb = 1 ' Pumpe FB
Pumpehk = 1 ' PumpeHK
End If
End If
If Tempmessstelle(1) < Tagtemp_ug Then 'And Oldmesswert(1) < Tagtemp_ug Then
Brenner = 1
Pumpefb = 1
Pumpehk = 1
End If
Return
'**************************TempMittel berechnen*********************************
Tempmittel:
If X = 0 Then
For Y = 1 To 8
Tempmittel(y) = Tempmessstelle(y)
Next Y
X = 1
End If
If X = 1 Then
If Z < 50 Then
For Y = 1 To 8
Tempmittel(y) = Tempmittel(y) + Tempmessstelle(y)
Tempmittel(y) = Tempmittel(y) / 2
' Print Tempmittel(y)
Next Y
Z = Z + 1
End If
End If
If Z = 50 Then
X = 0
Z = 0
End If
Return
'**************************Sub für Nachtbetrieb*********************************
Nachtbetrieb:
If Tempmessstelle(1) >= Nachttemp_og Then 'And Oldmesswert(1) >= Nachttemp_ogthen
Brenner = 0
If Tempmessstelle(5) < 32.0 Then
Pumpefb = 0
Pumpehk = 0 ' Pumpe FB
End If
If Tempmessstelle(5) >= 34.0 Then
Pumpefb = 1
Pumpehk = 1
End If
End If
If Tempmessstelle(1) <= Nachttemp_ug Then 'And Oldmesswert(1) < Nachttemp_ug Then
Brenner = 1
Pumpefb = 1
Pumpehk = 1
End If
Return '
'**************************Subroutine für Timer1********************************
Isr_von_timer1: 'ISR von Timer1
Timer1 = 51135
If _hour >= Nachtbetrieb Or _hour < Tagbetrieb Or _hour = 7 Then
Tagnacht = 0 'Nachteinstellung
Else
Tagnacht = 1 'Tageinstellung
End If
Return
'***************************Subs für RTC****************************************
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return

'************************************************* ******************************
$eeprom

Data &H10 , &HE8 , &HF4 , &H23 , &H01 , &H08 , &H00 , &HEF '
Data &H10 , &H1B , &HD0 , &H23 , &H01 , &H08 , &H00 , &H23 '
Data &H10 , &H78 , &H37 , &H39 , &H01 , &H08 , &H00 , &H11 '
Data &H10 , &HC0 , &H46 , &H19 , &H01 , &H08 , &H00 , &H67 '
Data &H10 , &HBD , &HB6 , &H23 , &H01 , &H08 , &H00 , &H40 '
Data &H10 , &H56 , &HA3 , &H23 , &H01 , &H08 , &H00 , &H3F

Ratber
09.04.2007, 19:01
Wenn du die Variable "Tagnacht" als Byte anlegst dann gehts mit Case.

Alternativ statt Case was anderes nehmen.
zb. "On tagnacht Gosub Nachtbetrieb , Tagbetrieb"