Hallo,
ich habe mal wieder ein seltsames Problem mit meiner Steuerung..
Bin gerade dabei Funktionen zu schreiben und diese zu testen.
Beim ausgeben der Werte kommt es regelmäßig zu Problemen, sprich die Anzeige zeigt nur noch merkwürdige
Zeichen an. Hin und wieder bleibt der Controller auch komplett stehen und reagiert auf nichts mehr!
Erst hatte ich das Problem mit einer Funktion die mir permanent nur 0 zurück gab nur weil ich einen weiteren Wert übergeben hab.
Nach dem erhöhen des HWstacks konnte das Problem jedoch gelöst werden.
Aber ich denke das das aktuelle Problem evtl. da was mit zu tun hat.
Was sind den Höchstwerte für hwstack, swstack und framesize? Nutze den Atmega 644, im Datenblatt habe ich keine Antwort gefunden.
Hier der relevante Teil des Codes, das menü habe ich weggelassen, das Problem taucht ja auch so auf, ohne das man ins menü geht.
Die Funktion ist eigentlich so wie erwartet, es werden die korrekten Werte angezeigt, nur halt eben nur für ein paar Minuten..
Hat jemand Rat?
ich habe mal wieder ein seltsames Problem mit meiner Steuerung..
Bin gerade dabei Funktionen zu schreiben und diese zu testen.
Beim ausgeben der Werte kommt es regelmäßig zu Problemen, sprich die Anzeige zeigt nur noch merkwürdige
Zeichen an. Hin und wieder bleibt der Controller auch komplett stehen und reagiert auf nichts mehr!
Erst hatte ich das Problem mit einer Funktion die mir permanent nur 0 zurück gab nur weil ich einen weiteren Wert übergeben hab.
Nach dem erhöhen des HWstacks konnte das Problem jedoch gelöst werden.
Aber ich denke das das aktuelle Problem evtl. da was mit zu tun hat.
Was sind den Höchstwerte für hwstack, swstack und framesize? Nutze den Atmega 644, im Datenblatt habe ich keine Antwort gefunden.
Hier der relevante Teil des Codes, das menü habe ich weggelassen, das Problem taucht ja auch so auf, ohne das man ins menü geht.
Die Funktion ist eigentlich so wie erwartet, es werden die korrekten Werte angezeigt, nur halt eben nur für ein paar Minuten..
Hat jemand Rat?
Code:
$regfile = "m644def.dat"
$crystal = 16000000
$lib "i2c_twi.lbx"
$framesize = 32 ' die Größe des Frames
$swstack = 32 ' die Größe des Software-stacks
$hwstack = 48 ' die Größe des Hardware-Stacks
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 20 * 4
Config 1wire = Pind.3
Config Timer1 = Timer , Prescale = 256 'Timer1 für den Sekundentakt
On Timer1 Timer_irq
Initlcd 'initalisieren und Pause damit das Zeichen in den Puffer des LCDs geschrieben werden kann
Waitms 100
Cls
Deflcdchar 1 , 8 , 20 , 8 , 32 , 32 , 32 , 32 , 32 'Grad Zeichen
Declare Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
Declare Function Decigrades(byval Sc(9) As Byte) As Integer
Declare Function Prescale(byval B_maxpwm As Byte , Byref B_zeiger As Byte) As Byte
Lcd_backlight Alias Pina.6 ' LCD - LED Hintergrundbeleuchtung
Dosierpumpe1 Alias Pina.7
Dosierpumpe2 Alias Pinc.7
Dosierpumpe3 Alias Pinc.6
Heizung Alias Pinc.4
Backlight Alias Pinc.3
Led_weiss Alias Pind.4
T_runter Alias Pinb.0
T_rechts Alias Pinb.1
T_hoch Alias Pinb.2
T_links Alias Pinb.3
T_menu Alias Pinb.4
T_wasserwechsel Alias Pind.0
T7 Alias Pind.1
T8 Alias Pind.2
Config Porta = Output 'LCD Display
Config Portc = Output
Config Portb = Input
Config T_wasserwechsel = Input
Config T7 = Input
Config T8 = Input
Config Led_weiss = Output
Config Pind.3 = Input ' DS18B20
Config Pind.4 = Output ' PWM Kanal LED Weiss
Config Pind.5 = Output ' PWM Kanal LED Backlight
Config Clock = User
Config Date = Dmy , Separator = . ' Datumsformat DD.MM.YY
Const Timervorgabe = 3036
Const Ds1307w = &HD0 ' Addresse des DS1307 zum schreiben
Const Ds1307r = &HD1
Dim Menu As Byte
Dim Twi_control As Byte ' Controlregister lokale kopie
Dim Twi_status As Byte
Dim Twi_data As Byte
Dim B As Byte ' Zeichen von UART
Dim Error As Byte
Dim _wd As Byte ' Wochentag
Dim _sec_bcd As Byte , _min_bcd As Byte , _hour_bcd As Byte , _day_bcd As Byte , _month_bcd As Byte , _year_bcd As Byte
Dim I As Integer , Sekunde As Integer
Dim Temperatur As String * 5
Dim Messen As Integer , Zeitabgleich As Integer
Dim W As Word
Dim Dg As Integer
Dim Dg1 As Byte
Dim Dsid1(8) As Byte ' Adresses des DS18B20
Dim Sc(9) As Byte
Dim Zeit As String * 8
Dim Menuzeit As Integer , Hauptmenu As Integer , Beleuchtung As Integer , Dosierpumpen As Integer
Dim Monat As String * 2
Dim Stunde As String * 2
Dim Minute As String * 2
Dim Tag As String * 2
Dim Pwmstartstunde As Integer , Pwmstartminute As Integer , Pwmstopstunde As Integer , Pwmstopminute As Integer
Dim Pwm1(3) As Byte
Dim Pwm2(3) As Byte
Dim Pwm_wert(6) As Byte , Pwm_trigger(6) As Byte , Maxpwm(6) As Byte , Presc(6) As Byte
Dim Eedummy As Eram Byte 'erstes Byte im Eeprom leer lassen da evtl. Probleme beim Neustart
Dim Eetest As Eram Byte
Dim Teststring As String * 3
Dim Daysek As Dword , Daysek2 As Dword , Daysek3 As Dword
Dim Dauer(6) As Byte
Dim Zeiger As Byte
Dim Test1 As Byte , Test2 As Byte
Dsid1(1) = 40 : Dsid1(2) = 3 : Dsid1(3) = 213 : Dsid1(4) = 113 : Dsid1(5) = 4 : Dsid1(6) = 0 : Dsid1(7) = 0 : Dsid1(8) = 114 ' Addresse des DS18B20 zum lesen
'Twi Initialisieren
Twcr = &B00000100
Twsr = 0 ' Status und Prescaler Register
Twbr = 72
Pwm1(1) = 10
Pwm1(2) = 10
Pwm1(3) = 10
Pwm2(1) = 10
Pwm2(2) = 10
Pwm2(3) = 10
Maxpwm(1) = 50
Maxpwm(2) = 75
Maxpwm(3) = 80
Maxpwm(4) = 20
Maxpwm(5) = 15
Maxpwm(6) = 40 'Prozentwert der gedimmt werden soll
Test1 = 1
Test2 = 2
'#########################################################################################
Initlcd 'Display initialisieren
Cursor On
Cls
Enable Timer1 'Bildschirm löschen
Enable Interrupts
Lcd_backlight = 1 ' LCD Dauerhaft eingeschaltet für Testphase
'#########################################################################################
Gosub Getdatetime ' Datum und Uhrzeit auslesen
' sind schon Daten im DS1307 vorhanden?
If _day = 1 And _month = 1 And _year = 0 Then ' 01.01.00 = keine Daten
I2cstart
I2cwbyte Ds1307w
I2cwbyte &H07
I2cwbyte &B00000000
I2cstop
Date$ = "01.08.13" ' Datum
_wd = 6 ' Wochentag
Gosub Setdate ' Datum schreiben
Time$ = "10:30:00" ' Uhrzeit
Gosub Settime ' Uhrzeit schreiben
End If
'Test = Eetest ' Nach dem einschalten Eeprom Wert zurück kopieren
Main:
Cls
Menu = 0
Hauptmenu = 0
Menuzeit = 0
Beleuchtung = 0
Gosub Settime
Gosub Setdate
Daysek3 = _hour * 3600 ' Die Tagessekunde anhand der aktuellen Uhrzeit einstellen
Daysek2 = _min * 60
Daysek = Daysek2 + Daysek3
'Eetest = Test 'Config Änderung im Menü im Eeprom speichern
For Zeiger = 1 To 6
Presc(zeiger) = Prescale(maxpwm(zeiger) , Zeiger)
Next
Do
Locate 4 , 5
For Zeiger = 1 To 6
Teststring = Str(presc(zeiger))
Lcd Teststring
Next
Debounce T_menu , 0 , Menuconfig
If Menu = 0 Then 'Wenn das Menu aktiv ist, reguläre Anzeige überspringen
Select Case _wd
Case 1
Locate 2 , 11 : Lcd "Montag"
Case 2
Locate 2 , 11 : Lcd "Dienstag"
Case 3
Locate 2 , 11 : Lcd "Mittwoch"
Case 4
Locate 2 , 11 : Lcd "Donnerstag"
Case 5
Locate 2 , 11 : Lcd "Freitag"
Case 6
Locate 2 , 11 : Lcd "Samstag"
Case 7
Locate 2 , 11 : Lcd "Sonntag"
End Select
Locate 1 , 11
Tag = Str(_day) 'Formatierung auf 2 Stellen
Tag = Format(tag , "00")
Monat = Str(_month) 'Formatierung auf 2 Stellen
Monat = Format(monat , "00")
Lcd Tag ; "." ; Monat ; ".20" ; _year
Stunde = Str(_hour)
Stunde = Format(stunde , "00")
Minute = Str(_min)
Minute = Format(minute , "00")
Locate 1 , 1
Lcd Stunde ; ":" ; Minute ; " Uhr"
Locate 2 , 1
Lcd Temperatur : Lcd "{001}C" 'Einfügen des 'Sonderzeichen Grad {001}
Debounce T_wasserwechsel , 0 , Pwm_senden , Sub
Debounce T7 , 0 , Pwm_addieren , Sub
Debounce T8 , 0 , Pwm_subtrahieren , Sub
If Messen > 10 Then
Gosub Gettemp ' Temperatur auslesen
Messen = 0
End If
If Zeitabgleich > 2 Then
Gosub Getdatetime ' Datum und Uhrzeit auslesen
Zeitabgleich = 0
End If
Locate 3 , 1
For I = 1 To 6
Lcd Dauer(i)
Lcd " "
Next
End If
Loop
Code:
Function Decigrades(byval Sc(9) As Byte)
Decigrades = 0
Decigrades = Makeint(sc(1) , Sc(2))
Decigrades = Decigrades * 10
Decigrades = Decigrades / 16
End Function
Gettemp:
Disable Interrupts
1wreset ' reset the bus
1wwrite &HCC ' skip rom
1wwrite &H44 ' Convert T
Waitms 500
1wverify Dsid1(1) 'Issues the "Match ROM "
If Err = 1 Then
Locate 3 , 1
Lcd "Err " 'Err = 1 if something is wrong
Elseif Err = 0 Then 'lcd " Sensor found"
1wwrite &HBE
Sc(1) = 1wread(9) 'read bytes into array
Temperatur = Str(dg)
Temperatur = Format(temperatur , " 0.0")
End If
If Sc(9) = Crc8(sc(1) , 8) Then
Dg = Decigrades(sc(9))
End If
Enable Interrupts
Return
Function Prescale(b_maxpwm As Byte , B_zeiger As Byte)
Local L_maxpwm As Single
Local L_prozw1 As Single
Local L_prozw2 As Single
Local L_prescale As Single
L_maxpwm = B_maxpwm
L_prozw1 = L_maxpwm / 100
L_prozw2 = 255 * L_prozw1
L_prescale = 3600 / L_prozw2 ' Auflösung des Dimm Vorgangs bestimmen 3600 = 1 Stunde zum Dimmen
Prescale = L_prescale
Pwm_trigger(b_zeiger) = Pwm_trigger(b_zeiger) + 1
Pwm_wert(b_zeiger) = Pwm_trigger(b_zeiger)
End Function
Timer_irq: ' der Interrupt wird jede Sekunde ausgeführt
Timer1 = Timervorgabe
Sekunde = Sekunde + 1
If Sekunde > 59 Then
Sekunde = 0
End If
For Zeiger = 1 To 6
If Dauer(zeiger) > Presc(zeiger) And Pwm_trigger(zeiger) < 255 Then
Presc(zeiger) = Prescale(maxpwm(zeiger) , Zeiger)
Dauer(zeiger) = 0
End If
Next
For I = 1 To 6
Dauer(i) = Dauer(i) + 1
Next
Messen = Messen + 1
Zeitabgleich = Zeitabgleich + 1
Daysek = Daysek + 1 ' Sekunden des gesamten Tages
If Daysek > 86400 Then Daysek = 0 ' 86400 = 1 Tag in Sekunden
Return