Dopisałem do kodu zapis I odczyt napięcia u_set w 24C02, ale nie działa - są błędy, w ogóle się nie kompiluje.
Przypuszczam, że problemem jest zapisanie zmiennej single do tego eeproma. To jak to można zapisać, bo w necie nie mogę znaleźć nic.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m32def.dat"
- $crystal = 11059200
- $hwstack = 64
- $swstack = 16
- $framesize = 64
- Const Timeout_time = 8 'x500ms
- Config Submode = New
- ' config LCD 2X16
- Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
- Config Lcd = 16x2
- Cursor Off
- Cls
- Config POrTC.3 = Input : PORTC.3 = 1 : output_sw Alias PINC.3 ' switch OUTPUT ON/OFF
- Config Portc.5 = Output : Portc.5 = 0 : relay Alias Portc.5 ' Przekaźnik OUTPUT ON/OFF
- Config PortC.4 = Output : PortC.4 = 0 : output_led Alias PortC.4 'Led OUTPUT ON/0FF
- Config PortD.4 = Output : PortD.4 = 0 : buzzer Alias PortD.4 'Buzzer
- Config POrTA.7 = Input : PORTA.7 = 1 : cv Alias PINA.7 ' constant voltage
- Config POrTC.7 = Input : PORTC.7 = 1 : cc Alias PINC.7 ' constant current
- Config POrTB.0 = Input : PORTB.0 = 1 : ovp_sw Alias PINB.0 ' switch OVP
- Config POrTB.1 = Input : PORTB.1 = 1 : ocp_sw Alias PINB.1 ' switch OCP
- Config POrTB.3 = Input : PORTB.3 = 1 : sw1 Alias PINB.3 ' switch 1
- Config POrTB.2 = Input : PORTB.2 = 1 : sw2 Alias PINB.2 ' switch 2
- Dim ovp As Single
- Dim ocp As Single
- Dim ov As Bit ' zmienna pomocnicza dla OVP
- Dim oc As Bit ' zmienna pomocnicza dla OCP
- Dim S As Bit
- ov = 0
- oc = 0
- S = 0
- Dim Pulses As Word 'Zmienna długości dźwięku
- Dim Periods As Word ' Zmienna barwy dźwięku
- Deflcdchar 3,31,32,31,31,31,32,31,32'pasek pełny
- Deflcdchar 4,31,32,32,32,32,32,31,32'pasek pusty
- ' Symbole na LCD
- Deflcdchar 0,17,17,17,10,4,32,32,32' (volt)
- Deflcdchar 1,14,17,17,31,17,32,32,32' (amper)
- Deflcdchar 2,17,17,21,21,10,32,32,32' (wat)
- ' Konfiguracja I2C
- $lib "i2c_twi.lbx"
- Config Scl = Portc.0
- Config Sda = Portc.1
- I2cinit
- Config Twi = 100000
- '---------------------------------------------------------------------------------------
- ' config for encoders
- ' ENCODER U_SET
- Config PortD.5 = Input : PortD.5 = 1 : Encoder1_a Alias PinD.5 'ENKODER1A
- Config Portd.3 = Input : Portd.3 = 1 : Encoder1_b Alias Pind.3 'ENKODER1B, INT1
- Config PortD.7 = Input : PortD.7 = 1 : Enc_sw1 Alias PinD.7 ' Przycisk Enkoder1
- ' ENCODER I_SET
- Config PortD.6 = Input : PortD.6 = 1 : Encoder2_a Alias PinD.6 'ENKODER2A
- Config Portd.2 = Input : Portd.2 = 1 : Encoder2_b Alias Pind.2 'ENKODER2B, INT0
- Config PortC.2 = Input : PortC.2 = 1 : Enc_sw2 Alias PinC.2 ' Przycisk Enkoder2
- Config Int1 = Rising 'przerwanie generować będzie rosnące zbocze
- Enable Int1 : On Int1 Encoder1_isr Nosave
- Config Int0 = Rising 'przerwanie generować będzie rosnące zbocze
- Enable Int0 : On Int0 Encoder2_isr Nosave
- Dim Encoder1_turn_left As Byte , Encoder1_turn_right As Byte
- Dim Encoder2_turn_left As Byte , Encoder2_turn_right As Byte
- '---------------------------------------------------------------------------------------
- ' config Timer2
- Config Timer2 = Timer , Prescale = 1024 , Clear_timer = 1
- Compare2 = 107 '10ms @11MHz/1024
- 'settings
- Dim 500ms As Byte , Mig As Byte , Timeout As Byte , Mig1 As Byte , Timeout1 As Byte
- 'Zmienne dla encodera prądu
- Dim Prad As Single , Prad_ee As Eram Single
- Dim Pos2 As Byte , Pos2_ee As Eram Byte
- Dim Current_str As String * 10
- Dim Temp_str As String * 10
- 'Zmienne dla encodera napięcia
- Dim Napiecie As Single , Napiecie_ee As Eram Single
- Dim Pos As Byte , Pos_ee As Eram Byte
- Dim Volt_str As String * 10
- Dim Temp_str1 As String * 10
- Enable Interrupts
- ' Procedura wyświetlania napięcia U_SET
- Sub Show_voltage
- Temp_str1 = Fusing(napiecie , "#.&&&")
- Volt_str = Format(temp_str1 , " ") 'dwa znaki+kropka+trzy znaki
- If Mig1 = 1 Then
- Select Case Pos
- Case 1
- Mid(volt_str , 1) = " " 'wstaw spację w miejscu pos (migaj)
- Case 2
- Mid(volt_str , 4) = " "
- Case 3
- Mid(volt_str , 5) = " "
- Case 4
- Mid(volt_str , 6) = " "
- End Select
- End If
- Locate 1 , 1 : Lcd Volt_str ; Chr(0) ' Wyświetlenie na LCD napięcia ustawionego U_SET
- End Sub
- ' Procedura wyświetlania prądu I_SET
- Sub Show_current
- Temp_str = Fusing(prad , "#.&&&")
- Current_str = Format(temp_str , " ") 'dwa znaki+kropka+trzy znaki
- If Mig = 1 Then
- Select Case Pos2
- Case 1
- Mid(current_str , 1) = " " 'wstaw spację w miejscu pos (migaj)
- Case 2
- Mid(current_str , 4) = " "
- Case 3
- Mid(current_str , 5) = " "
- Case 4
- Mid(current_str , 6) = " "
- End Select
- End If
- Locate 1 , 10 : Lcd Current_str ; Chr(1) ' Wyświetlenie na LCD ograniczenia prądowego I_SET
- End Sub
- Sub Set_dac
- 'przelicz Single Prad i wyslij do DAC
- End Sub
- ' eeprom reading U_SET
- '------------------------------
- ' Pos = Pos_ee
- ' If Pos > 4 Then
- ' Pos = 4 : Pos_ee = Pos
- ' Napiecie_ee = 0
- ' End If
- ' Napiecie = Napiecie_ee
- '------------------------------
- If Pos > 4 Then
- Pos = 4
- end if
- ' ODCZYT WAROTOŚCI NAPIĘCIA Z 24C02
- I2cstart
- I2cwbyte 168
- I2cwbyte 1
- I2cstart
- I2cwbyte 169
- I2crbyte Napiecie_ee , Nack
- I2cstop
- Napiecie = Napiecie_ee
- Call Show_voltage()
- ' eeprom reading I_SET
- '------------------------------
- ' Pos2 = Pos2_ee
- ' If Pos2 > 4 Then
- ' Pos2 = 4 : Pos2_ee = Pos2
- ' Prad_ee = 0
- ' End If
- ' Prad = Prad_ee
- '------------------------------
- Call Show_current()
- Call Set_dac()
- ' ########################## GŁÓWNA PĘTLA ###############################
- Do
- '************************************************************** Obsługa encodera dla prądu
- Debounce Enc_sw2 , 0 , Enc_sw2_sub , Sub 'ENCODER I_SET
- '##### encoder turns left ######
- If 0 < Encoder2_turn_left Then
- Decr Encoder2_turn_left
- 'tutaj Twój kod -
- If Timeout > 0 Then
- Select Case Pos2
- Case 1
- Prad = Prad - 1.0
- Case 2
- Prad = Prad - 0.1
- Case 3
- Prad = Prad - 0.01
- Case 4
- Prad = Prad - 0.001
- End Select
- If Prad < 0 Then Prad = 0
- Mig = 0 : Call Show_current
- End If
- Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
- Gifr.intf0 = 1
- Enable INT0
- End If
- ' #### encoder turns right ######
- If 0 < Encoder2_turn_right Then
- Decr Encoder2_turn_right
- 'tutaj Twój kod +
- If Timeout > 0 Then
- Select Case Pos2
- Case 1
- Prad = Prad + 1
- Case 2
- Prad = Prad + 0.1
- Case 3
- Prad = Prad + 0.01
- Case 4
- Prad = Prad + 0.001
- End Select
- If Prad > 3.0 Then Prad = 3.0
- Mig = 0 : Call Show_current
- End If
- Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
- Gifr.intf0 = 1
- Enable INT0
- End If
- ' ***************************************************************** Obsługa encodera dla napięcia
- Debounce Enc_sw1 , 0 , Enc_sw1_sub , Sub 'ENCODER U_SET
- '##### encoder turns left ######
- If 0 < Encoder1_turn_left Then
- Decr Encoder1_turn_left
- 'tutaj Twój kod -
- If Timeout1 > 0 Then
- Select Case Pos
- Case 1
- Napiecie = Napiecie - 1.0
- Case 2
- Napiecie = Napiecie - 0.1
- Case 3
- Napiecie = Napiecie - 0.01
- Case 4
- Napiecie = Napiecie - 0.001
- End Select
- If Napiecie < 0 Then Napiecie = 0
- Mig1 = 0 : Call Show_voltage
- End If
- Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
- Gifr.intf1 = 1 'dla Mega8, M32 itp
- Enable Int1
- End If
- ' #### encoder turns right ######
- If 0 < Encoder1_turn_right Then
- Decr Encoder1_turn_right
- 'tutaj Twój kod +
- If Timeout1 > 0 Then
- Select Case Pos
- Case 1
- Napiecie = Napiecie + 1
- Case 2
- Napiecie = Napiecie + 0.1
- Case 3
- Napiecie = Napiecie + 0.01
- Case 4
- Napiecie = Napiecie + 0.001
- End Select
- If Napiecie > 20.0 Then Napiecie = 20.0
- Mig1 = 0 : Call Show_voltage
- End If
- Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
- Gifr.intf1 = 1 'dla Mega8, M32 itp
- Enable Int1
- End If
- If Tifr.ocf2 = 1 Then '10ms
- Tifr.ocf2 = 1
- If 500ms < 49 Then
- Incr 500ms
- Else
- 500ms = 0
- If Mig = 0 Then Mig = 1 Else Mig = 0
- If Timeout > 0 Then
- Decr Timeout
- If Timeout = 0 Then
- 'wyślij do DAC
- Mig = 0
- Prad_ee = Prad 'zapamietaj dopiero po Timeoucie
- Call Set_dac
- End If
- Call Show_current()
- End If
- If Mig1 = 0 Then Mig1 = 1 Else Mig1 = 0
- If Timeout1 > 0 Then
- Decr Timeout1
- If Timeout1 = 0 Then
- 'wyślij do DAC
- Mig1 = 0
- Napiecie_ee = Napiecie 'zapamietaj dopiero po Timeoucie
- ' ZAPIS NAPIĘCIA DO 24C02
- I2cstart
- I2cwbyte 168
- I2cwbyte 1
- I2cwbyte Napiecie_ee
- I2cstop
- Call Set_dac
- End If
- Call Show_voltage()
- End If
- End If
- End If
- '********************************************************************************************
- Loop
- End
- ' Obsługa przycisku Encoder1 U_SET
- Enc_sw1_sub:
- If Timeout1 > 0 Then
- Incr Pos : If Pos > 4 Then Pos = 1
- 'Pos_ee = Pos
- End If
- Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
- Return
- ' Obsługa przycisku Encoder2 I_SET
- Enc_sw2_sub:
- If Timeout > 0 Then
- Incr Pos2 : If Pos2 > 4 Then Pos2 = 1
- Pos2_ee = Pos2
- End If
- Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
- Return
- 'tutaj obsługa przerwania zewnetrznego z enkodera 2
- Encoder2_isr:
- $asm
- PUSH R23
- PUSH R24
- PUSH R26
- PUSH R27
- !in R24, sreg
- PUSH R24
- $end Asm
- Disable INT0
- If Encoder2_a = 1 Then
- Incr Encoder2_turn_right
- Else
- Incr Encoder2_turn_left
- End If
- 'Tuned with NoSave Tool
- $asm
- POP R24
- !out sreg, r24
- POP R27
- POP R26
- POP R24
- POP R23
- $end Asm
- Return
- 'tutaj obsługa przerwania zewnetrznego z enkodera 1
- Encoder1_isr:
- $asm
- PUSH R23
- PUSH R24
- PUSH R26
- PUSH R27
- !in R24, sreg
- PUSH R24
- $end Asm
- Disable Int1
- If Encoder1_a = 1 Then
- Incr Encoder1_turn_right
- Else
- Incr Encoder1_turn_left
- End If
- ' Tuned with NoSave Tool
- $asm
- POP R24
- !out sreg, r24
- POP R27
- POP R26
- POP R24
- POP R23
- $end Asm
- Return