Prosty generator prostokąta

Pytania, kody i porady dotyczące nie tylko Bascom.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 28 sty 2018, 12:58

Witam :D
Zabawy z generatorem ciąg dalszy .
Przezwyciężyłem lenistwo i poszedłem do sklepu kupić baterię do mojego multimetra :lol:
Zmierzyłem częstotliwości wychodzące z generatora , zgadzają się idealnie z tym co wyświetla LCD .
Dodałem dwa przyciski do szybszego ustawiania częstotliwości , może i w mało elegancki sposób , ale skutecznie działające .
  1. '*************************************
  2. '&sim
  3. $regfile = "m8def.dat"
  4. $crystal = 16000000
  5. $hwstack = 64
  6. $swstack = 32
  7. $framesize = 128
  8.  
  9. '----- KONFIGURACJA WYŚWIETLACZA -----------------------------------------------
  10.  
  11. Config Lcd = 20 * 4
  12. Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
  13. Cursor Off
  14. Cls
  15.  
  16. '----- KONFIGURACJA PORTÓW WEJŚCIA I WYJŚCIA / SCL i SDA / 1 WIRE / ALIASY -----
  17.  
  18. Config Pinb.0 = Input : Set Portb.0 : F_d Alias Pinb.0
  19. Config Portb.1 = Output       'OC1A
  20. Config Pinb.2 = Input : Set Portb.2 : Dn Alias Pinb.2
  21. Config Pinb.3 = Input : Set Portb.3 : Up Alias Pinb.3
  22. Config Pinb.4 = Input : Set Portb.4 : Plus Alias Pinb.4       'zaminna wanted + 10
  23. Config Pinb.5 = Input : Set Portb.5 : Minus Alias Pinb.5       'zmienna wanted - 10
  24. 'Config Portb.5 = Input : Reset Portb.5       'nieprzypisany - na razie jako wejście
  25. 'Config Portc.0 = Input : Reset Portc.0       'nieprzypisany - na razie jako wejście
  26. 'Config Portd.0 = Input : Set Portd.0 : Led Alias Portd.0
  27. 'Config Portd.1 = Input : Reset Portd.1       'nieprzypisany - na razie jako wejście
  28. 'Config Pind.2 = Input : Set Portd.2       'nieprzypisany - na razie jako wejście
  29. 'Config Pind.3 = Input : Set Portd.3       'nieprzypisany - na razie jako wejście
  30. 'Config Pind.5 = Input : Set Portd.5 :         nieprzypisany - na razie jako wejście
  31. 'Config Pind.6 = Input : Set Portd.6 : X100 Alias Pind.6
  32. 'Config Pind.7 = Input : Set Portd.7 : Run Alias Pind.7
  33.  
  34. 'TCCR1A  -> |COM1A1| COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
  35. 'TCCR1B  -> | ICNC1|  ICES1   --   WGM13  WGM12  CS12  CS11  CS10
  36.  
  37. '                    WGM13-|
  38.  
  39. '----- DEKLARACJA STAŁYCH I ZMIENNYCH ------------------------------------------
  40.  
  41.    Const Pwm_presc1 = &B00010001       'for TCCR1B
  42.    Const Pwm_presc8 = &B00010010
  43.   Const Pwm_presc64 = &B00010011
  44.  Const Pwm_presc256 = &B00010100
  45. Const Pwm_presc1024 = &B00010101
  46.  
  47. Const Set_output_mode = &B10100000       'for TCCR1A
  48.  
  49. Dim Presc As Byte , Wartosc_dla_tccr1b As Byte
  50. Dim Value As Dword , Help_d As Dword , Wanted As Dword
  51. Dim Ustaw As Word , Wypelnienie As Word , Proc As Word
  52. Dim Pos As Byte , Helpb As Byte
  53. Dim Wanted_str As String * 20
  54.  
  55. Const Freq_ = _xtal / 2
  56. Const Freq = Freq_ * 10       'z 8 Mega zrobi 80 Mega
  57.  
  58. Proc = 50                     'wypełnienie początkowa wartośc, można wpisać 50
  59. Wanted = 100                  'Hz początkowa 10,0 Hz
  60.  
  61. Locate 1 , 3 : Lcd "FREQ = "
  62. Locate 2 , 3 : Lcd "DUTY = "
  63.  
  64.  Gosub Przelicz
  65.   Gosub Menu_sub
  66.  
  67. Do
  68.   If Plus = 0 Then
  69.     Wanted = Wanted + 10
  70.     Gosub Przelicz
  71.    End If
  72.  
  73.  If Minus = 0 Then
  74.        Wanted = Wanted - 10
  75.        If Wanted < 10 Then : Wanted = 10 : End If
  76.         Gosub Przelicz
  77.       End If
  78.  
  79.  If Up = 0 Then
  80.   Waitms 50
  81.    If Up = 0 Then
  82.  
  83.     Select Case Pos
  84.  
  85.      Case 0
  86.  
  87.       If Wanted < 100000 Then
  88.        Incr Wanted
  89.         Gosub Przelicz
  90.       End If
  91.  
  92.      Case 1
  93.  
  94.       If Proc < 99 Then
  95.        Incr Proc
  96.         Gosub Calc_duty
  97.          Waitms 50
  98.       End If
  99.         End Select
  100.       End If
  101.  End If
  102.  
  103.  If Dn = 0 Then
  104.   Waitms 50
  105.    If Dn = 0 Then
  106.  
  107.     Select Case Pos
  108.  
  109.      Case 0
  110.  
  111.       If Wanted > 10 Then
  112.        Decr Wanted
  113.        Gosub Przelicz
  114.       End If
  115.      Case 1
  116.  
  117.       If Proc > 1 Then
  118.        Decr Proc
  119.         Gosub Calc_duty
  120.          Waitms 50
  121.       End If
  122.  
  123.     End Select
  124.      End If
  125.  End If
  126.  
  127.  Debounce F_d , 0 , Menu_sub , Sub
  128. Loop
  129. End
  130.  
  131. Menu_sub:
  132.  
  133.  If Pos = 0 Then
  134.   Pos = 1
  135.    Locate 1 , 1 : Lcd " "
  136.    Locate 2 , 1 : Lcd ">"
  137.  Else
  138.   Pos = 0
  139.    Locate 1 , 1 : Lcd ">"
  140.    Locate 2 , 1 : Lcd " "
  141.  End If
  142.  
  143. Return
  144.  
  145. Przelicz:
  146.  
  147.    Wanted_str = Str(wanted)
  148.    Wanted_str = Format(wanted_str , "0.0")
  149.  
  150.    Locate 1 , 10 : Lcd Wanted_str ; " Hz "
  151.  
  152.    Value = Freq               'przepisz Freq procka do zmiennej
  153.  
  154.    Help_d = Wanted
  155.  
  156.    Select Case Help_d
  157.  
  158.     Case 10 To 152
  159.     '64
  160.       Wartosc_dla_tccr1b = Pwm_presc64
  161.        Shift Value , Right , 6
  162.      Presc = 64
  163.  
  164.     Case 153 To 1220          '16000000Hz/131072 = 15Hz  '
  165.     '8
  166.       Wartosc_dla_tccr1b = Pwm_presc8
  167.        Shift Value , Right , 3
  168.       Presc = 8
  169.  
  170.     Case Else                 '16000000Hz/131072 = 122Hz
  171.     '1
  172.       Wartosc_dla_tccr1b = Pwm_presc1
  173.       Presc = 1
  174.  
  175.    End Select
  176.  
  177.    Value = Value \ Help_d     'rzeczywistą po preskalerze podziel przez żądaną
  178.  
  179.     Decr Value : Ustaw = Value       'odejmij jeden
  180.  
  181.     Gosub Calc_duty
  182.  
  183.      Icr1 = Ustaw
  184.  
  185.       Tccr1a = Set_output_mode       'set count up, reset count down
  186.       Tccr1b = Wartosc_dla_tccr1b       'ustaw prescaler i WGM13
  187.  
  188. Return
  189.  
  190. Calc_duty:
  191.  
  192.   Help_d = Value * Proc
  193.   Help_d = Help_d / 100
  194.   Wypelnienie = Help_d
  195.    Ocr1a = Wypelnienie
  196.     Locate 2 , 10 : Lcd Proc ; " % "
  197.  
  198. Return
Chyba zrezygnuję z Menu_sub: , wolnych pinów jest od groma , można je wykorzystać .

Nie potrafię ogarnąć dlaczego generator nie działa poniżej 2Hz .
Dwie stałe dla preskalera są niewykorzystane Pwm_presc256 , Pwm_presc1024 , pewnie tu tkwi odpowiedź .
Słabo sobie radzę z przeliczaniem tych częstotliwości :oops:

Podpowie Ktoś jak ruszyć ten biedny 1Hz
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 30 sty 2018, 17:00

Przeczytałbyś cały wątek to byś obliczenia znalazł ;)

viewtopic.php?f=3&t=96#p482
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 30 sty 2018, 18:01

niveasoft pisze:
30 sty 2018, 17:00
Przeczytałbyś cały wątek to byś obliczenia znalazł ;)
Witam :D
Czytałem i co z tego , jeszcze trzeba toto zrozumieć ;) jestem amator samouk jeśli chodzi o elektronikę .
Dużo wody w Wiśle jeszcze musi upłynąć .

Bardziej liczyłem na podpowiedź dlaczego nie działa od 1Hz .
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 30 sty 2018, 18:48

Może nie doczytałem bo działać od 1Hz powinien. Odpowiada za to "If Wanted > 10 Then"
Pamiętam tylko że mój miernik słabo sobie radził z pomiarem poniżej 2Hz dlatego takie testy to już robię oscyloskopem albo analizatorem Saleae.
Nie pamiętam czy to tak nisko testowałem.
Zawsze możesz podłączyć diodę LED i powinna w ciągu minuty mignąć 30 razy.
Kiedyś, przy okazji, sprawdzę.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 30 sty 2018, 19:26

niveasoft pisze:
30 sty 2018, 18:48
' działać od 1Hz powinien. Odpowiada za to "If Wanted > 10 Then"
Dzięki , sprawdzę to sobie jutro , zostawiłem programator w pracy .
Na filmiku który zamieściłem , pod koniec , jest pokazany moment kiedy schodzę z częstotliwością poniżej 2Hz .
Jak tylko ustawię 1,9 Hz , sygnału brak , mam podpiętą diodę LED .
Dioda mignie sobie jak zwalniam przyciski , widać to na filmiku .
Podejrzewałem , że może mój procek jakiś tandetny , ale sprawdziłem na dwóch innych .
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 30 sty 2018, 19:40

Może to "efekt niedzielnej pracy". Zerknie się kiedyś :P
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 30 sty 2018, 19:43

W niedzielę , to się leży "kołami " do góry ;)
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 31 sty 2018, 20:18

Witam :D
Zdaje się , że trafiłem gada w bolące miejsce , podstawiłem do generatora kwarc 8MHz i tyka sobie od 1Hz ;)
Przy kwarcu 12MHz podobne objawy co przy kwarcu 16MHz , z tą różnicą , że zdycha dopiero przy 1,5Hz a nie 2Hz :lol:
Jutro sobie kupię 10MHz kwarce zobaczę jak zadziała .
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 01 lut 2018, 21:29

Witam :D

Zabawa z kwarcami daje marne efekty , musiał bym przeliczyć całość od nowa ( to już nie na moją głowę ) , błąd częstotliwości rośnie z jej wzrostem :(

Bartek , ten warunek "If Wanted > 10 Then" tylko blokuje zejście poniżej wartości < od 10 .

Zostawiam to jak jest , zabieram się za pudełko , całość musi jakoś wyglądać ;)

Rzuciłem na wyświetlacz zmienne value , help_d i ustaw .
  1.  Value = Value \ Help_d       'rzeczywistą po preskalerze podziel przez żądaną
  2.  
  3.     Decr Value : Ustaw = Value       'odejmij jeden
Poniżej 2Hz zmienna ustaw przyjmuje wartości nie zgodne z Value , np. przy ustawieniu częstotliwości 1,9 Hz zmienna Ustaw przyjmuje wartość 252 .
Kompletnie nie wiem z kąt się to bierze :?:
Powyżej 2Hz zmienna Ustaw ma wartości zgodne z Value.



Z ostatniej chwili :!: ;)
Zmieniłem zmienną Ustaw na Dword była Word , teraz wartości się zgadzają z value :P ale dalej generator nie działa poniżej 2Hz :(
Jest jeszcze jedna zmienna która nie bierze udziału w programie Helpb na ....... ona :?: pozostałość prototypowa czy powinna być gdzieś użyta :?:
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 02 lut 2018, 13:35

Witam :D

Odwiedziłem dzisiaj miejscowy elektronik by kupić fajną obudowę , a tam g.... zero wyboru , znowu trzeba zamawiać przez internet :evil:
Nie marnując czasu , troszeczkę pogrzebałem w kodzie generatora .
  1. $regfile = "m8def.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 128
  6. 'Config Lcd = 16 * 2
  7. Config Lcd = 20 * 4
  8.  
  9. Deflcdchar 0 , 32 , 4 , 2 , 31 , 31 , 2 , 4 , 32       ' replace [x] with number (0-7)
  10. Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
  11. Cursor Off
  12. Cls
  13.  
  14. Config Pinb.0 = Input : Set Portb.0 : F_d Alias Pinb.0
  15. Config Portb.1 = Output       'OC1A
  16. Config Pinb.2 = Input : Set Portb.2 : Dn Alias Pinb.2
  17. Config Pinb.3 = Input : Set Portb.3 : Up Alias Pinb.3
  18. Const Pwm_presc1 = &B00010001       'for TCCR1B
  19. Const Pwm_presc8 = &B00010010
  20. Const Pwm_presc64 = &B00010011       '&B00010011
  21. 'Const Pwm_presc255 = &B00010100
  22. 'Const Pwm_presc1024 = &B00010101
  23.  
  24. Const Set_output_mode = &B10100000       'for TCCR1A
  25.  
  26. Dim Pos As Bit
  27. Dim Presc As Byte , Proc As Byte
  28. Dim Value As Dword , Help_d As Dword , Wanted As Dword , Ustaw As Dword , Helpb As Dword
  29. Dim Wypelnienie As Word , Wartosc_dla_tccr1b As Word
  30. Dim Wanted_str As String * 2
  31.  
  32. Const Freq_ = _xtal / 2
  33. Const Freq = Freq_ * 10
  34. Proc = 50
  35. Wanted = 10
  36. Pos = 0
  37. Locate 1 , 2 : Lcd "FREQ="
  38. Locate 2 , 2 : Lcd "DUTY="
  39.  
  40.  Gosub Przelicz
  41.   Gosub Menu_sub
  42. Do
  43.  
  44.  If Up = 0 Then
  45.   Waitms 50
  46.    If Up = 0 Then
  47.  Select Case Pos
  48.    Case 0
  49.      If Wanted < 100000 Then
  50.        Wanted = Wanted + 10       'Incr Wanted
  51.         Gosub Przelicz
  52.       End If
  53.    Case 1
  54.      If Proc < 99 Then
  55.        Incr Proc
  56.         Gosub Calc_duty
  57.          Waitms 50
  58.       End If
  59.         End Select
  60.       End If
  61.  End If
  62.  
  63.  If Dn = 0 Then
  64.   Waitms 50
  65.    If Dn = 0 Then
  66.     Select Case Pos
  67.      Case 0
  68.       If Wanted > 10 Then
  69.        Wanted = Wanted - 10       'Decr Wanted
  70.        Gosub Przelicz
  71.       End If
  72.      Case 1
  73.       If Proc > 1 Then
  74.        Decr Proc
  75.         Gosub Calc_duty
  76.          Waitms 50
  77.       End If
  78.        End Select
  79.      End If
  80.  End If
  81.  Debounce F_d , 0 , Menu_sub , Sub
  82. Loop
  83. End
  84.  Menu_sub:
  85.  
  86.  If Pos = 0 Then
  87.   Pos = 1
  88.    Locate 1 , 1 : Lcd " "
  89.    Locate 2 , 1 : Lcd ; Chr(0)       '">"
  90.  Else
  91.   Pos = 0
  92.    Locate 1 , 1 : Lcd ; Chr(0)       '">"
  93.    Locate 2 , 1 : Lcd " "
  94.  End If
  95.  
  96. Przelicz:
  97.  
  98.    Wanted_str = Str(wanted)
  99.    Wanted_str = Format(wanted_str , "0.0")
  100.    Locate 1 , 7 : Lcd Wanted_str ; " Hz "
  101.      Value = Freq   'przepisz Freq procka do zmiennej
  102.       Help_d = Wanted
  103.  
  104.    Select Case Help_d
  105.     Case 10 To 152
  106.     '64
  107.       Wartosc_dla_tccr1b = Pwm_presc64
  108.       Shift Value , Right , 6
  109.      Presc = 64
  110.     Case 153 To 1220       '16000000Hz/131072 = 15Hz  '
  111.     '8
  112.       Wartosc_dla_tccr1b = Pwm_presc8
  113.        Shift Value , Right , 3
  114.       Presc = 8
  115.     Case Else       '16000000Hz/131072 = 122Hz
  116.     '1
  117.       Wartosc_dla_tccr1b = Pwm_presc1
  118.      Presc = 1
  119.     End Select
  120.  
  121.   Value = Value / Help_d       'rzeczywistą po preskalerze podziel przez żądaną
  122.     Value = Value - 1       'odejmij jeden
  123.      Ustaw = Value
  124.        Gosub Calc_duty
  125.  
  126.      Icr1 = Ustaw
  127.       Tccr1a = Set_output_mode       'set count up, reset count down
  128.        Tccr1b = Wartosc_dla_tccr1b       'ustaw prescaler i WGM13
  129.  
  130. Return
  131.  
  132. Calc_duty:
  133.   Help_d = Value * Proc
  134.   Help_d = Help_d / 100
  135.   Wypelnienie = Help_d
  136.    Ocr1a = Wypelnienie
  137.    Locate 2 , 7 : Lcd Proc ; " % "
  138. Return
Teraz generator działa niby od 1Hz ( rzeczywista jest dalej te cholerne 2Hz ) a duty musi być ustawione na wartość większą lub mniejszą od 50 %
Miejcie litość nad starym chłopem , patrzę w ten kod jak szpak w.............. nie widząc tego błędu .
ODPOWIEDZ