Przetwornik DAC do zasilacza

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 01 maja 2021, 18:43

Ze względu na skończoną ilość zapisów pamięci eeprom, chciałem oszczędzić procek i dołożyłem zewnętrzną pamięć eeprom 24C02

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.
  1.  $regfile = "m32def.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6.  
  7. Const Timeout_time = 8 'x500ms
  8. Config Submode = New
  9.  
  10. ' config LCD 2X16
  11. Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
  12. Config Lcd = 16x2
  13. Cursor Off
  14. Cls
  15.  
  16. Config POrTC.3 = Input : PORTC.3 = 1 : output_sw Alias PINC.3 ' switch OUTPUT ON/OFF
  17. Config Portc.5 = Output : Portc.5 = 0 : relay Alias Portc.5 ' Przekaźnik OUTPUT ON/OFF
  18. Config PortC.4 = Output : PortC.4 = 0 : output_led Alias PortC.4 'Led OUTPUT ON/0FF
  19. Config PortD.4 = Output : PortD.4 = 0 : buzzer Alias PortD.4 'Buzzer
  20. Config POrTA.7 = Input : PORTA.7 = 1 : cv Alias PINA.7 ' constant voltage
  21. Config POrTC.7 = Input : PORTC.7 = 1 : cc Alias PINC.7 ' constant current
  22. Config POrTB.0 = Input : PORTB.0 = 1 : ovp_sw Alias PINB.0 ' switch OVP
  23. Config POrTB.1 = Input : PORTB.1 = 1 : ocp_sw Alias PINB.1 ' switch OCP
  24. Config POrTB.3 = Input : PORTB.3 = 1 : sw1 Alias PINB.3 ' switch 1
  25. Config POrTB.2 = Input : PORTB.2 = 1 : sw2 Alias PINB.2 ' switch 2
  26.  
  27. Dim ovp As Single
  28. Dim ocp As Single
  29. Dim ov As Bit ' zmienna pomocnicza dla OVP
  30. Dim oc As Bit ' zmienna pomocnicza dla OCP
  31. Dim S As Bit
  32. ov = 0
  33. oc = 0
  34. S = 0
  35.  
  36. Dim Pulses As Word  'Zmienna długości dźwięku
  37. Dim Periods As Word ' Zmienna barwy dźwięku
  38.  
  39. Deflcdchar 3,31,32,31,31,31,32,31,32'pasek pełny
  40. Deflcdchar 4,31,32,32,32,32,32,31,32'pasek pusty
  41.  
  42. ' Symbole na LCD
  43. Deflcdchar 0,17,17,17,10,4,32,32,32' (volt)
  44. Deflcdchar 1,14,17,17,31,17,32,32,32' (amper)
  45. Deflcdchar 2,17,17,21,21,10,32,32,32' (wat)
  46.  
  47. ' Konfiguracja I2C
  48. $lib "i2c_twi.lbx"
  49. Config Scl = Portc.0
  50. Config Sda = Portc.1
  51. I2cinit
  52. Config Twi = 100000
  53.  
  54. '---------------------------------------------------------------------------------------
  55. ' config for encoders
  56.  
  57. ' ENCODER U_SET
  58. Config PortD.5 = Input : PortD.5 = 1 : Encoder1_a Alias PinD.5      'ENKODER1A
  59. Config Portd.3 = Input : Portd.3 = 1 : Encoder1_b Alias Pind.3      'ENKODER1B, INT1
  60. Config PortD.7 = Input : PortD.7 = 1 : Enc_sw1 Alias PinD.7         ' Przycisk Enkoder1
  61.  
  62. ' ENCODER I_SET
  63. Config PortD.6 = Input : PortD.6 = 1 : Encoder2_a Alias PinD.6      'ENKODER2A
  64. Config Portd.2 = Input : Portd.2 = 1 : Encoder2_b Alias Pind.2      'ENKODER2B, INT0
  65. Config PortC.2 = Input : PortC.2 = 1 : Enc_sw2 Alias PinC.2         ' Przycisk Enkoder2
  66.  
  67. Config Int1 = Rising 'przerwanie  generować będzie rosnące zbocze
  68. Enable Int1 : On Int1 Encoder1_isr Nosave
  69.  
  70. Config Int0 = Rising 'przerwanie  generować będzie rosnące zbocze
  71. Enable Int0 : On Int0 Encoder2_isr Nosave
  72.  
  73. Dim Encoder1_turn_left As Byte , Encoder1_turn_right As Byte
  74. Dim Encoder2_turn_left As Byte , Encoder2_turn_right As Byte
  75.  
  76. '---------------------------------------------------------------------------------------
  77.         ' config Timer2
  78.     Config Timer2 = Timer , Prescale = 1024 , Clear_timer = 1
  79.     Compare2 = 107 '10ms @11MHz/1024
  80.  
  81.         'settings
  82.     Dim 500ms As Byte , Mig As Byte , Timeout As Byte , Mig1 As Byte , Timeout1 As Byte
  83.  
  84.         'Zmienne dla encodera prądu
  85.     Dim Prad As Single , Prad_ee As Eram Single
  86.     Dim Pos2 As Byte , Pos2_ee As Eram Byte
  87.     Dim Current_str As String * 10
  88.     Dim Temp_str As String * 10
  89.  
  90.         'Zmienne dla encodera napięcia
  91.     Dim Napiecie As Single , Napiecie_ee As Eram Single
  92.     Dim Pos As Byte , Pos_ee As Eram Byte
  93.     Dim Volt_str As String * 10
  94.     Dim Temp_str1 As String * 10
  95.  
  96.     Enable Interrupts
  97.  
  98.         ' Procedura wyświetlania napięcia U_SET
  99.     Sub Show_voltage
  100.  
  101.        Temp_str1 = Fusing(napiecie , "#.&&&")
  102.        Volt_str = Format(temp_str1 , "      ")                     'dwa znaki+kropka+trzy znaki
  103.  
  104.        If Mig1 = 1 Then
  105.           Select Case Pos
  106.              Case 1
  107.                 Mid(volt_str , 1) = "  "                             'wstaw spację w miejscu pos (migaj)
  108.              Case 2
  109.                 Mid(volt_str , 4) = " "
  110.              Case 3
  111.                 Mid(volt_str , 5) = " "
  112.              Case 4
  113.                 Mid(volt_str , 6) = " "
  114.           End Select
  115.        End If
  116.        Locate 1 , 1 : Lcd Volt_str ; Chr(0) ' Wyświetlenie na LCD napięcia ustawionego U_SET
  117.     End Sub
  118.  
  119.  
  120.         ' Procedura wyświetlania prądu I_SET
  121.     Sub Show_current
  122.  
  123.        Temp_str = Fusing(prad , "#.&&&")
  124.        Current_str = Format(temp_str , "      ")  'dwa znaki+kropka+trzy znaki
  125.  
  126.        If Mig = 1 Then
  127.           Select Case Pos2
  128.              Case 1
  129.                 Mid(current_str , 1) = "  " 'wstaw spację w miejscu pos (migaj)
  130.              Case 2
  131.                 Mid(current_str , 4) = " "
  132.              Case 3
  133.                 Mid(current_str , 5) = " "
  134.              Case 4
  135.                 Mid(current_str , 6) = " "
  136.           End Select
  137.        End If
  138.        Locate 1 , 10 : Lcd Current_str ; Chr(1) ' Wyświetlenie na LCD ograniczenia prądowego I_SET
  139.     End Sub
  140.  
  141.     Sub Set_dac
  142.          'przelicz Single Prad i wyslij do DAC
  143.     End Sub
  144.  
  145.         ' eeprom reading U_SET
  146.         '------------------------------
  147.  '   Pos = Pos_ee
  148.  '   If Pos > 4 Then
  149.  '      Pos = 4 : Pos_ee = Pos
  150.  '      Napiecie_ee = 0
  151.  '   End If
  152.  '   Napiecie = Napiecie_ee
  153.         '------------------------------
  154.  If Pos > 4 Then
  155.  Pos = 4
  156.  end if
  157.  
  158. ' ODCZYT WAROTOŚCI NAPIĘCIA Z 24C02
  159. I2cstart
  160. I2cwbyte 168
  161. I2cwbyte 1
  162. I2cstart
  163. I2cwbyte 169
  164. I2crbyte Napiecie_ee , Nack
  165. I2cstop
  166. Napiecie = Napiecie_ee
  167.  
  168.  
  169.  
  170.     Call Show_voltage()
  171.  
  172.         ' eeprom reading I_SET
  173.         '------------------------------
  174.   '  Pos2 = Pos2_ee
  175.   '  If Pos2 > 4 Then
  176.   '     Pos2 = 4 : Pos2_ee = Pos2
  177.   '     Prad_ee = 0
  178.   '  End If
  179.   '  Prad = Prad_ee
  180.         '------------------------------
  181.     Call Show_current()
  182.  
  183.  
  184.  
  185.  
  186.  
  187.     Call Set_dac()
  188.  
  189.  
  190.  
  191.  
  192.         ' ########################## GŁÓWNA PĘTLA ###############################
  193.     Do
  194.  
  195.         '************************************************************** Obsługa encodera dla prądu
  196.        Debounce Enc_sw2 , 0 , Enc_sw2_sub , Sub                 'ENCODER I_SET
  197.         '##### encoder turns left ######
  198.        If 0 < Encoder2_turn_left Then
  199.           Decr Encoder2_turn_left
  200.         'tutaj Twój kod -
  201.           If Timeout > 0 Then
  202.              Select Case Pos2
  203.                 Case 1
  204.                    Prad = Prad - 1.0
  205.                 Case 2
  206.                    Prad = Prad - 0.1
  207.                 Case 3
  208.                    Prad = Prad - 0.01
  209.                 Case 4
  210.                    Prad = Prad - 0.001
  211.              End Select
  212.  
  213.              If Prad < 0 Then Prad = 0
  214.              Mig = 0 : Call Show_current
  215.           End If
  216.  
  217.           Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  218.           Gifr.intf0 = 1
  219.           Enable INT0
  220.        End If
  221.         ' #### encoder turns right ######
  222.        If 0 < Encoder2_turn_right Then
  223.           Decr Encoder2_turn_right
  224.         'tutaj Twój kod +
  225.  
  226.           If Timeout > 0 Then
  227.              Select Case Pos2
  228.                 Case 1
  229.                    Prad = Prad + 1
  230.                 Case 2
  231.                    Prad = Prad + 0.1
  232.                 Case 3
  233.                    Prad = Prad + 0.01
  234.                 Case 4
  235.                    Prad = Prad + 0.001
  236.              End Select
  237.  
  238.              If Prad > 3.0 Then Prad = 3.0
  239.              Mig = 0 : Call Show_current
  240.           End If
  241.           Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  242.           Gifr.intf0 = 1
  243.           Enable INT0
  244.        End If
  245.  
  246.         ' ***************************************************************** Obsługa encodera dla napięcia
  247.        Debounce Enc_sw1 , 0 , Enc_sw1_sub , Sub 'ENCODER U_SET
  248.         '##### encoder turns left ######
  249.        If 0 < Encoder1_turn_left Then
  250.           Decr Encoder1_turn_left
  251.         'tutaj Twój kod -
  252.           If Timeout1 > 0 Then
  253.              Select Case Pos
  254.                 Case 1
  255.                    Napiecie = Napiecie - 1.0
  256.                 Case 2
  257.                    Napiecie = Napiecie - 0.1
  258.                 Case 3
  259.                    Napiecie = Napiecie - 0.01
  260.                 Case 4
  261.                    Napiecie = Napiecie - 0.001
  262.              End Select
  263.              If Napiecie < 0 Then Napiecie = 0
  264.              Mig1 = 0 : Call Show_voltage
  265.           End If
  266.  
  267.           Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  268.           Gifr.intf1 = 1                                        'dla Mega8, M32 itp
  269.           Enable Int1
  270.        End If
  271.         ' #### encoder turns right ######
  272.        If 0 < Encoder1_turn_right Then
  273.           Decr Encoder1_turn_right
  274.         'tutaj Twój kod +
  275.           If Timeout1 > 0 Then
  276.              Select Case Pos
  277.                 Case 1
  278.                    Napiecie = Napiecie + 1
  279.                 Case 2
  280.                    Napiecie = Napiecie + 0.1
  281.                 Case 3
  282.                    Napiecie = Napiecie + 0.01
  283.                 Case 4
  284.                    Napiecie = Napiecie + 0.001
  285.              End Select
  286.              If Napiecie > 20.0 Then Napiecie = 20.0
  287.              Mig1 = 0 : Call Show_voltage
  288.           End If
  289.  
  290.           Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  291.           Gifr.intf1 = 1                                     'dla Mega8, M32 itp
  292.           Enable Int1
  293.        End If
  294.  
  295.  
  296.        If Tifr.ocf2 = 1 Then '10ms
  297.           Tifr.ocf2 = 1
  298.  
  299.           If 500ms < 49 Then
  300.              Incr 500ms
  301.           Else
  302.              500ms = 0
  303.              If Mig = 0 Then Mig = 1 Else Mig = 0
  304.  
  305.              If Timeout > 0 Then
  306.                 Decr Timeout
  307.                 If Timeout = 0 Then
  308.         'wyślij do DAC
  309.                    Mig = 0
  310.                    Prad_ee = Prad 'zapamietaj dopiero po Timeoucie
  311.                    Call Set_dac
  312.                 End If
  313.  
  314.                 Call Show_current()
  315.              End If
  316.  
  317.              If Mig1 = 0 Then Mig1 = 1 Else Mig1 = 0
  318.  
  319.              If Timeout1 > 0 Then
  320.                 Decr Timeout1
  321.                 If Timeout1 = 0 Then
  322.         'wyślij do DAC
  323.                    Mig1 = 0
  324.                    Napiecie_ee = Napiecie                           'zapamietaj dopiero po Timeoucie
  325.        ' ZAPIS NAPIĘCIA DO 24C02
  326. I2cstart
  327. I2cwbyte 168
  328. I2cwbyte 1
  329. I2cwbyte Napiecie_ee
  330. I2cstop
  331.                    Call Set_dac
  332.                 End If
  333.  
  334.                 Call Show_voltage()
  335.              End If
  336.  
  337.           End If
  338.        End If
  339.         '********************************************************************************************
  340.     Loop
  341.     End
  342.  
  343.         ' Obsługa przycisku Encoder1 U_SET
  344.     Enc_sw1_sub:
  345.        If Timeout1 > 0 Then
  346.           Incr Pos : If Pos > 4 Then Pos = 1
  347.  
  348.           'Pos_ee = Pos
  349.        End If
  350.        Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  351.     Return
  352.  
  353.  
  354.         ' Obsługa przycisku Encoder2 I_SET
  355.     Enc_sw2_sub:
  356.        If Timeout > 0 Then
  357.           Incr Pos2 : If Pos2 > 4 Then Pos2 = 1
  358.           Pos2_ee = Pos2
  359.        End If
  360.        Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  361.     Return
  362.  
  363.  
  364.         'tutaj obsługa przerwania zewnetrznego z enkodera 2
  365.     Encoder2_isr:
  366.        $asm
  367.           PUSH R23
  368.           PUSH R24
  369.           PUSH R26
  370.           PUSH R27
  371.           !in R24, sreg
  372.           PUSH  R24
  373.        $end Asm
  374.  
  375.        Disable INT0
  376.  
  377.        If Encoder2_a = 1 Then
  378.           Incr Encoder2_turn_right
  379.        Else
  380.           Incr Encoder2_turn_left
  381.        End If
  382.  
  383.         'Tuned with NoSave Tool
  384.        $asm
  385.           POP  R24
  386.           !out sreg, r24
  387.           POP R27
  388.           POP R26
  389.           POP R24
  390.           POP R23
  391.        $end Asm
  392.  
  393.     Return
  394.  
  395.         'tutaj obsługa przerwania zewnetrznego z enkodera 1
  396.     Encoder1_isr:
  397.  
  398.        $asm
  399.           PUSH R23
  400.           PUSH R24
  401.           PUSH R26
  402.           PUSH R27
  403.           !in R24, sreg
  404.           PUSH  R24
  405.        $end Asm
  406.  
  407.        Disable Int1
  408.  
  409.        If Encoder1_a = 1 Then
  410.           Incr Encoder1_turn_right
  411.        Else
  412.           Incr Encoder1_turn_left
  413.        End If
  414.  
  415.           '          Tuned with NoSave Tool
  416.  
  417.        $asm
  418.           POP  R24
  419.           !out sreg, r24
  420.           POP R27
  421.           POP R26
  422.           POP R24
  423.           POP R23
  424.        $end Asm
  425.  
  426.     Return
  427.  
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Przetwornik DAC do zasilacza

Post autor: niveasoft » 01 maja 2021, 18:46

myśl
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 01 maja 2021, 19:38

Już zrobiłem :) Działa :)
Wartości Single nie da się zapisać przecież do jednego bajtu, bo to za duża wartość.


Tylko zrobiłem to dla napięcie samego, a potrzeba jeszcze zmiennej prądu.
  1. Dim N As Byte
  2. Dim Nap As Single
  3. Dim Buff(20) As Byte At Nap Overlay
Czy taki sam zapis tylko dla prądu muszę zrobić osobny? I dla każdej innej zmiennej analogicznie?

To jest kod, zapamiętuje wartość napięcia ustawionego:
  1. $regfile = "m32def.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6.  
  7. Const Timeout_time = 8 'x500ms
  8. Config Submode = New
  9.  
  10. ' config LCD 2X16
  11. Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
  12. Config Lcd = 16x2
  13. Cursor Off
  14. Cls
  15.  
  16. Config POrTC.3 = Input : PORTC.3 = 1 : output_sw Alias PINC.3 ' switch OUTPUT ON/OFF
  17. Config Portc.5 = Output : Portc.5 = 0 : relay Alias Portc.5 ' Przekaźnik OUTPUT ON/OFF
  18. Config PortC.4 = Output : PortC.4 = 0 : output_led Alias PortC.4 'Led OUTPUT ON/0FF
  19. Config PortD.4 = Output : PortD.4 = 0 : buzzer Alias PortD.4 'Buzzer
  20. Config POrTA.7 = Input : PORTA.7 = 1 : cv Alias PINA.7 ' constant voltage
  21. Config POrTC.7 = Input : PORTC.7 = 1 : cc Alias PINC.7 ' constant current
  22. Config POrTB.0 = Input : PORTB.0 = 1 : ovp_sw Alias PINB.0 ' switch OVP
  23. Config POrTB.1 = Input : PORTB.1 = 1 : ocp_sw Alias PINB.1 ' switch OCP
  24. Config POrTB.3 = Input : PORTB.3 = 1 : sw1 Alias PINB.3 ' switch 1
  25. Config POrTB.2 = Input : PORTB.2 = 1 : sw2 Alias PINB.2 ' switch 2
  26.  
  27. Dim ovp As Single
  28. Dim ocp As Single
  29. Dim ov As Bit ' zmienna pomocnicza dla OVP
  30. Dim oc As Bit ' zmienna pomocnicza dla OCP
  31. Dim S As Bit
  32. ov = 0
  33. oc = 0
  34. S = 0
  35.  
  36. Dim Pulses As Word  'Zmienna długości dźwięku
  37. Dim Periods As Word ' Zmienna barwy dźwięku
  38.  
  39. Deflcdchar 3,31,32,31,31,31,32,31,32'pasek pełny
  40. Deflcdchar 4,31,32,32,32,32,32,31,32'pasek pusty
  41.  
  42. ' Symbole na LCD
  43. Deflcdchar 0,17,17,17,10,4,32,32,32' (volt)
  44. Deflcdchar 1,14,17,17,31,17,32,32,32' (amper)
  45. Deflcdchar 2,17,17,21,21,10,32,32,32' (wat)
  46.  
  47. Dim N As Byte
  48. Dim Nap As Single
  49. Dim Buff(20) As Byte At Nap Overlay
  50.  
  51.  Const Addressw_ee = 168
  52.     Const Addressr_ee = 169
  53.  
  54. ' Konfiguracja I2C
  55. $lib "i2c_twi.lbx"
  56. Config Scl = Portc.0
  57. Config Sda = Portc.1
  58. I2cinit
  59. Config Twi = 100000
  60.  
  61. '---------------------------------------------------------------------------------------
  62. ' config for encoders
  63.  
  64. ' ENCODER U_SET
  65. Config PortD.5 = Input : PortD.5 = 1 : Encoder1_a Alias PinD.5      'ENKODER1A
  66. Config Portd.3 = Input : Portd.3 = 1 : Encoder1_b Alias Pind.3      'ENKODER1B, INT1
  67. Config PortD.7 = Input : PortD.7 = 1 : Enc_sw1 Alias PinD.7         ' Przycisk Enkoder1
  68.  
  69. ' ENCODER I_SET
  70. Config PortD.6 = Input : PortD.6 = 1 : Encoder2_a Alias PinD.6      'ENKODER2A
  71. Config Portd.2 = Input : Portd.2 = 1 : Encoder2_b Alias Pind.2      'ENKODER2B, INT0
  72. Config PortC.2 = Input : PortC.2 = 1 : Enc_sw2 Alias PinC.2         ' Przycisk Enkoder2
  73.  
  74. Config Int1 = Rising 'przerwanie  generować będzie rosnące zbocze
  75. Enable Int1 : On Int1 Encoder1_isr Nosave
  76.  
  77. Config Int0 = Rising 'przerwanie  generować będzie rosnące zbocze
  78. Enable Int0 : On Int0 Encoder2_isr Nosave
  79.  
  80. Dim Encoder1_turn_left As Byte , Encoder1_turn_right As Byte
  81. Dim Encoder2_turn_left As Byte , Encoder2_turn_right As Byte
  82.  
  83. '---------------------------------------------------------------------------------------
  84.         ' config Timer2
  85.     Config Timer2 = Timer , Prescale = 1024 , Clear_timer = 1
  86.     Compare2 = 107 '10ms @11MHz/1024
  87.  
  88.         'settings
  89.     Dim 500ms As Byte , Mig As Byte , Timeout As Byte , Mig1 As Byte , Timeout1 As Byte
  90.  
  91.         'Zmienne dla encodera prądu
  92.     Dim Prad As Single , Prad_ee As Eram Single
  93.     Dim Pos2 As Byte , Pos2_ee As Eram Byte
  94.     Dim Current_str As String * 10
  95.     Dim Temp_str As String * 10
  96.  
  97.         'Zmienne dla encodera napięcia
  98.     Dim Napiecie As Single , Napiecie_ee As Eram Single
  99.     Dim Pos As Byte , Pos_ee As Eram Byte
  100.     Dim Volt_str As String * 10
  101.     Dim Temp_str1 As String * 10
  102.  
  103.     Enable Interrupts
  104.  
  105.         ' Procedura wyświetlania napięcia U_SET
  106.     Sub Show_voltage
  107.  
  108.        Temp_str1 = Fusing(napiecie , "#.&&&")
  109.        Volt_str = Format(temp_str1 , "      ")                     'dwa znaki+kropka+trzy znaki
  110.  
  111.        If Mig1 = 1 Then
  112.           Select Case Pos
  113.              Case 1
  114.                 Mid(volt_str , 1) = "  "                             'wstaw spację w miejscu pos (migaj)
  115.              Case 2
  116.                 Mid(volt_str , 4) = " "
  117.              Case 3
  118.                 Mid(volt_str , 5) = " "
  119.              Case 4
  120.                 Mid(volt_str , 6) = " "
  121.           End Select
  122.        End If
  123.        Locate 1 , 1 : Lcd Volt_str ; Chr(0) ' Wyświetlenie na LCD napięcia ustawionego U_SET
  124.     End Sub
  125.  
  126.  
  127.         ' Procedura wyświetlania prądu I_SET
  128.     Sub Show_current
  129.  
  130.        Temp_str = Fusing(prad , "#.&&&")
  131.        Current_str = Format(temp_str , "      ")  'dwa znaki+kropka+trzy znaki
  132.  
  133.        If Mig = 1 Then
  134.           Select Case Pos2
  135.              Case 1
  136.                 Mid(current_str , 1) = "  " 'wstaw spację w miejscu pos (migaj)
  137.              Case 2
  138.                 Mid(current_str , 4) = " "
  139.              Case 3
  140.                 Mid(current_str , 5) = " "
  141.              Case 4
  142.                 Mid(current_str , 6) = " "
  143.           End Select
  144.        End If
  145.        Locate 1 , 10 : Lcd Current_str ; Chr(1) ' Wyświetlenie na LCD ograniczenia prądowego I_SET
  146.     End Sub
  147.  
  148.     Sub Set_dac
  149.          'przelicz Single Prad i wyslij do DAC
  150.     End Sub
  151.  
  152.  
  153.  
  154.      'sub zapisuje Eeprom wartością pod podanym adresem
  155. Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
  156.     I2cstart
  157.     I2cwbyte Addressw_ee
  158.     I2cwbyte Adres
  159.     I2cwbyte Value
  160.     I2cstop
  161.     Waitms 10
  162. End Sub
  163.  
  164.  
  165. 'funkcja zwraca wartosć bajtu pod podanym adresem w eepromie
  166. Function Read_eeprom(byval Adres As Byte )as Byte
  167.    I2cstart
  168.    I2cwbyte Addressw_ee
  169.    I2cwbyte Adres
  170.    I2cstart
  171.    I2cwbyte Addressr_ee
  172.    I2crbyte Read_eeprom , Nack
  173.    I2cstop
  174. End Function
  175.  
  176.  
  177.  
  178.  
  179.         ' eeprom reading U_SET
  180.         '------------------------------
  181.  '   Pos = Pos_ee
  182.  '   If Pos > 4 Then
  183.  '      Pos = 4 : Pos_ee = Pos
  184.  '      Napiecie_ee = 0
  185.  '   End If
  186.  '   Napiecie = Napiecie_ee
  187.         '------------------------------
  188.  If Pos > 4 Then
  189.  Pos = 4
  190.  end if
  191.  
  192. ' ODCZYT WAROTOŚCI NAPIĘCIA Z 24C02
  193.  
  194. For N = 1 To 10
  195.  Buff(n) = Read_eeprom(n + 1)
  196. Next
  197.     Napiecie = Nap
  198.  
  199.  
  200.     Call Show_voltage()
  201.  
  202.         ' eeprom reading I_SET
  203.         '------------------------------
  204.   '  Pos2 = Pos2_ee
  205.   '  If Pos2 > 4 Then
  206.   '     Pos2 = 4 : Pos2_ee = Pos2
  207.   '     Prad_ee = 0
  208.   '  End If
  209.   '  Prad = Prad_ee
  210.         '------------------------------
  211.     Call Show_current()
  212.  
  213.  
  214.  
  215.  
  216.  
  217.     Call Set_dac()
  218.  
  219.  
  220.  
  221.  
  222.         ' ########################## GŁÓWNA PĘTLA ###############################
  223.     Do
  224.  
  225.         '************************************************************** Obsługa encodera dla prądu
  226.        Debounce Enc_sw2 , 0 , Enc_sw2_sub , Sub                 'ENCODER I_SET
  227.         '##### encoder turns left ######
  228.        If 0 < Encoder2_turn_left Then
  229.           Decr Encoder2_turn_left
  230.         'tutaj Twój kod -
  231.           If Timeout > 0 Then
  232.              Select Case Pos2
  233.                 Case 1
  234.                    Prad = Prad - 1.0
  235.                 Case 2
  236.                    Prad = Prad - 0.1
  237.                 Case 3
  238.                    Prad = Prad - 0.01
  239.                 Case 4
  240.                    Prad = Prad - 0.001
  241.              End Select
  242.  
  243.              If Prad < 0 Then Prad = 0
  244.              Mig = 0 : Call Show_current
  245.           End If
  246.  
  247.           Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  248.           Gifr.intf0 = 1
  249.           Enable INT0
  250.        End If
  251.         ' #### encoder turns right ######
  252.        If 0 < Encoder2_turn_right Then
  253.           Decr Encoder2_turn_right
  254.         'tutaj Twój kod +
  255.  
  256.           If Timeout > 0 Then
  257.              Select Case Pos2
  258.                 Case 1
  259.                    Prad = Prad + 1
  260.                 Case 2
  261.                    Prad = Prad + 0.1
  262.                 Case 3
  263.                    Prad = Prad + 0.01
  264.                 Case 4
  265.                    Prad = Prad + 0.001
  266.              End Select
  267.  
  268.              If Prad > 3.0 Then Prad = 3.0
  269.              Mig = 0 : Call Show_current
  270.           End If
  271.           Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  272.           Gifr.intf0 = 1
  273.           Enable INT0
  274.        End If
  275.  
  276.         ' ***************************************************************** Obsługa encodera dla napięcia
  277.        Debounce Enc_sw1 , 0 , Enc_sw1_sub , Sub 'ENCODER U_SET
  278.         '##### encoder turns left ######
  279.        If 0 < Encoder1_turn_left Then
  280.           Decr Encoder1_turn_left
  281.         'tutaj Twój kod -
  282.           If Timeout1 > 0 Then
  283.              Select Case Pos
  284.                 Case 1
  285.                    Napiecie = Napiecie - 1.0
  286.                 Case 2
  287.                    Napiecie = Napiecie - 0.1
  288.                 Case 3
  289.                    Napiecie = Napiecie - 0.01
  290.                 Case 4
  291.                    Napiecie = Napiecie - 0.001
  292.              End Select
  293.              If Napiecie < 0 Then Napiecie = 0
  294.              Mig1 = 0 : Call Show_voltage
  295.           End If
  296.  
  297.           Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  298.           Gifr.intf1 = 1                                        'dla Mega8, M32 itp
  299.           Enable Int1
  300.        End If
  301.         ' #### encoder turns right ######
  302.        If 0 < Encoder1_turn_right Then
  303.           Decr Encoder1_turn_right
  304.         'tutaj Twój kod +
  305.           If Timeout1 > 0 Then
  306.              Select Case Pos
  307.                 Case 1
  308.                    Napiecie = Napiecie + 1
  309.                 Case 2
  310.                    Napiecie = Napiecie + 0.1
  311.                 Case 3
  312.                    Napiecie = Napiecie + 0.01
  313.                 Case 4
  314.                    Napiecie = Napiecie + 0.001
  315.              End Select
  316.              If Napiecie > 20.0 Then Napiecie = 20.0
  317.              Mig1 = 0 : Call Show_voltage
  318.           End If
  319.  
  320.           Timeout1 = Timeout_time                                 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  321.           Gifr.intf1 = 1                                     'dla Mega8, M32 itp
  322.           Enable Int1
  323.        End If
  324.  
  325.  
  326.        If Tifr.ocf2 = 1 Then '10ms
  327.           Tifr.ocf2 = 1
  328.  
  329.           If 500ms < 49 Then
  330.              Incr 500ms
  331.           Else
  332.              500ms = 0
  333.              If Mig = 0 Then Mig = 1 Else Mig = 0
  334.  
  335.              If Timeout > 0 Then
  336.                 Decr Timeout
  337.                 If Timeout = 0 Then
  338.         'wyślij do DAC
  339.                    Mig = 0
  340.                    Prad_ee = Prad 'zapamietaj dopiero po Timeoucie
  341.                    Call Set_dac
  342.                 End If
  343.  
  344.                 Call Show_current()
  345.              End If
  346.  
  347.              If Mig1 = 0 Then Mig1 = 1 Else Mig1 = 0
  348.  
  349.              If Timeout1 > 0 Then
  350.                 Decr Timeout1
  351.                 If Timeout1 = 0 Then
  352.         'wyślij do DAC
  353.                    Mig1 = 0
  354.                    'Napiecie_ee = Napiecie                           'zapamietaj dopiero po Timeoucie
  355.  
  356.  
  357.  
  358.        ' ZAPIS NAPIĘCIA DO 24C02
  359.                  Nap = Napiecie
  360.     For N = 1 To 10
  361.     Call Write_eeprom(n + 1 , Buff(n))                     'przekazując można robić obliczenia
  362.    Next
  363.  
  364.  
  365.                    Call Set_dac
  366.                 End If
  367.  
  368.                 Call Show_voltage()
  369.              End If
  370.  
  371.           End If
  372.        End If
  373.         '********************************************************************************************
  374.     Loop
  375.     End
  376.  
  377.         ' Obsługa przycisku Encoder1 U_SET
  378.     Enc_sw1_sub:
  379.        If Timeout1 > 0 Then
  380.           Incr Pos : If Pos > 4 Then Pos = 1
  381.  
  382.           'Pos_ee = Pos
  383.        End If
  384.        Timeout1 = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  385.     Return
  386.  
  387.  
  388.         ' Obsługa przycisku Encoder2 I_SET
  389.     Enc_sw2_sub:
  390.        If Timeout > 0 Then
  391.           Incr Pos2 : If Pos2 > 4 Then Pos2 = 1
  392.           Pos2_ee = Pos2
  393.        End If
  394.        Timeout = Timeout_time 'przedłuzaj/uruchamiaj timeout przy kazdym kliku
  395.     Return
  396.  
  397.  
  398.         'tutaj obsługa przerwania zewnetrznego z enkodera 2
  399.     Encoder2_isr:
  400.        $asm
  401.           PUSH R23
  402.           PUSH R24
  403.           PUSH R26
  404.           PUSH R27
  405.           !in R24, sreg
  406.           PUSH  R24
  407.        $end Asm
  408.  
  409.        Disable INT0
  410.  
  411.        If Encoder2_a = 1 Then
  412.           Incr Encoder2_turn_right
  413.        Else
  414.           Incr Encoder2_turn_left
  415.        End If
  416.  
  417.         'Tuned with NoSave Tool
  418.        $asm
  419.           POP  R24
  420.           !out sreg, r24
  421.           POP R27
  422.           POP R26
  423.           POP R24
  424.           POP R23
  425.        $end Asm
  426.  
  427.     Return
  428.  
  429.         'tutaj obsługa przerwania zewnetrznego z enkodera 1
  430.     Encoder1_isr:
  431.  
  432.        $asm
  433.           PUSH R23
  434.           PUSH R24
  435.           PUSH R26
  436.           PUSH R27
  437.           !in R24, sreg
  438.           PUSH  R24
  439.        $end Asm
  440.  
  441.        Disable Int1
  442.  
  443.        If Encoder1_a = 1 Then
  444.           Incr Encoder1_turn_right
  445.        Else
  446.           Incr Encoder1_turn_left
  447.        End If
  448.  
  449.           '          Tuned with NoSave Tool
  450.  
  451.        $asm
  452.           POP  R24
  453.           !out sreg, r24
  454.           POP R27
  455.           POP R26
  456.           POP R24
  457.           POP R23
  458.        $end Asm
  459.  
  460.     Return
Tylo powiedz mi ile tych komórek zajmuje wartość napięcia single?
Bo chcę dodawać kolejną zmienną do zapamiętania i nie chciałbym żeby się nadpisywały komórki.

Nie wiem jak zapisac kolejne zmienne. Działa pamiętanie tylko tego napiecia.

Tylko tą jedną zmienną single napięcie udalo mi się zapisać tym sposobem. Więcej nie działa...
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Przetwornik DAC do zasilacza

Post autor: Michał6201 » 01 maja 2021, 23:11

Dawno temu dałeś mi taki przykład zapisania string do zewnętrznego eeprom:
  1.  $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 32
  4. $swstack = 32
  5. $framesize = 64
  6.  
  7. $lib "i2c_twi.lbx"
  8.  
  9. Config Submode = New                                        ' najpierw piszemy funkcje i suby, potem używamy bez deklaracji
  10.  
  11. Config Scl = Portc.5
  12. Config Sda = Portc.4
  13. Config Twi = 100000
  14.  I2cinit
  15.  
  16. $lib "glcdSSD1306-I2C.lib"
  17. Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
  18. Cls
  19.  
  20. Const Addressw = &HAE                                       ' = 174 EEPROM
  21. Const Addressr = &HAF
  22.  
  23. '&H78 = 120 'adres wyświetlacza LCD
  24.  
  25. Dim N As Byte
  26. Dim Test_str As String * 19
  27. Dim Buff(20) As Byte At Test_str Overlay
  28.  
  29. Setfont Font8x8tt                                           'wybieram font dla GLCD
  30.  
  31. Test_str = "Hello World"                                    'wpis do zmiennej celem zapisu i testu
  32.  
  33.  
  34. 'sub zapisuje Eeprom wartością pod podanym adresem
  35. Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
  36.     I2cstart
  37.     I2cwbyte Addressw
  38.     I2cwbyte Adres
  39.     I2cwbyte Value
  40.     I2cstop
  41.     Waitms 10
  42. End Sub
  43.  
  44.  
  45. 'funkcja zwraca wartosć bajtu pod podanym adresem w eepromie
  46. Function Read_eeprom(byval Adres As Byte )as Byte
  47.    I2cstart
  48.    I2cwbyte Addressw
  49.    I2cwbyte Adres
  50.    I2cstart
  51.    I2cwbyte Addressr
  52.    I2crbyte Read_eeprom , Nack
  53.    I2cstop
  54. End Function
  55.  
  56.  
  57.  
  58. '*****************************************
  59. '*********** START PRZYKŁADU *************
  60.  
  61.   'zapisz wszystkie 20 bajtów , a co!
  62.   'kolejno i zacznij od miejsca 11 w pamięci
  63.  
  64.    For N = 1 To 20
  65.     Call Write_eeprom(n + 10 , Buff(n))                     'przekazując można robić obliczenia
  66.    Next
  67.  
  68.  
  69. Test_str = ""                                               'wyczyśc string, więc nie ma bata, pusty
  70.  
  71.  
  72.  'wczytaj bajty z powrotem z Eeproma
  73. For N = 1 To 20
  74.  Buff(n) = Read_eeprom(n + 10)
  75. Next
  76.  
  77.  
  78.  'zobaczmy co się zapisało/odczytało
  79.  
  80. Lcdat 4 , 10 , Test_str
  81.  
  82. End
  83.  
  84. $include "font8x8TT.font"                                   ' this is a true type font with variable spacing

Zrobiłem coś podobnego, ale musiałem dla 2 zmiennych utworzyć oddzielne bufory.
Niby działa, ale to chyba mało eleganckie rozwiązanie:
  1. $regfile = "m32def.dat"
  2. $crystal = 11059200
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 64
  6.  Config Submode = New
  7. ' config LCD 2X16
  8. Config Lcdpin = Pin , Rs = Porta.0 , E = Porta.1 , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5
  9. Config Lcd = 16x2
  10. Cursor Off
  11. Cls
  12.  
  13. Dim N As Byte
  14. Dim Q_str As String * 10
  15. Dim Buf1(20) As Byte At Q_str Overlay
  16.  
  17.  
  18. Dim v_str As String * 20
  19. Dim Buf2(20) As Byte At v_str Overlay
  20.  
  21.  
  22. Q_str = "12.555"
  23. v_str = "13.222"
  24.  
  25.  
  26.  
  27. Const Addressw_ee = 168
  28. Const Addressr_ee = 169
  29.  
  30. ' Konfiguracja I2C
  31. $lib "i2c_twi.lbx"
  32. Config Scl = Portc.0
  33. Config Sda = Portc.1
  34. I2cinit
  35. Config Twi = 100000
  36.  
  37.  'sub zapisuje Eeprom wartością pod podanym adresem
  38. Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
  39.     I2cstart
  40.     I2cwbyte Addressw_ee
  41.     I2cwbyte Adres
  42.     I2cwbyte Value
  43.     I2cstop
  44.     Waitms 10
  45. End Sub
  46.  
  47.  
  48. 'funkcja zwraca wartosć bajtu pod podanym adresem w eepromie
  49. Function Read_eeprom(byval Adres As Byte )as Byte
  50.    I2cstart
  51.    I2cwbyte Addressw_ee
  52.    I2cwbyte Adres
  53.    I2cstart
  54.    I2cwbyte Addressr_ee
  55.    I2crbyte Read_eeprom , Nack
  56.    I2cstop
  57. End Function
  58.  
  59.  
  60.  DO
  61. '*****************************************
  62. '*********** START PRZYKŁADU *************
  63.  
  64.   'zapisz wszystkie 20 bajtów , a co!
  65.   'kolejno i zacznij od miejsca 11 w pamięci
  66.  
  67.    For N = 1 To 20
  68.     Call Write_eeprom(n + 1 , Buf1(n))                     'przekazując można robić obliczenia
  69.    Next
  70.  
  71.    For N = 1 To 20
  72.    Call Write_eeprom(n + 8 , Buf2(n))
  73.    Next
  74.  
  75. Q_str = ""                                               'wyczyśc string, więc nie ma bata, pusty
  76. v_str = ""
  77.  
  78.  'wczytaj bajty z powrotem z Eeproma
  79. For N = 1 To 20
  80.  Buf1(n) = Read_eeprom(n + 1)
  81. Next
  82.  
  83. For N = 1 To 20
  84. Buf2(n) = Read_eeprom(n + 8)
  85. Next
  86.  
  87.  'zobaczmy co się zapisało/odczytało
  88.  
  89. Locate 1 , 1 : Lcd Q_str
  90. Locate 2 , 1 : Lcd v_str
  91.    Loop
  92. End
Da się to ładniej zrobić?
Może da się napisać jakąś procedurę, aby sam program porzypisywał kolejne wolne komórki w eeprom dla kolejnych zmiennych single?
ODPOWIEDZ