Prosty generator prostokąta

Pytania, kody i porady dotyczące nie tylko Bascom.
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Prosty generator prostokąta

Post autor: Zbyszek » 02 gru 2017, 18:58

Witam,
Mam zrobiony prosty generator sygnału prostokątnego który ma regulację częstotliwości od 1Hz - 1kHz z rozdzielczością 1Hz i regulację wypełnienia 1 - 99% z rozdzielczością 1%. Chciałbym prosić kolegów o poprawienie poniższego pliku źródłowego tak, żeby można było regulować częstotliwość od 1Hz - 1kHz z rozdzielczością 0,1 Hz. Sam nie za bardzo wiem jak się za to zabrać :(
  1. '*************************************
  2.  
  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 = 16x2
  12. Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portd.4
  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 Portb.4 = Input : Reset Portb.4                      '                  nieprzypisany - na razie jako wyjście
  23. Config Portb.5 = Input : Reset Portb.5                      '                  nieprzypisany - na razie jako wyjście
  24. Config Portc.0 = Input : Reset Portc.0                      '                  nieprzypisany - na razie jako wyjście
  25. Config Portd.0 = Input : Set Portd.0 : Led Alias Portd.0
  26. Config Portd.1 = Input : Reset Portd.1                      '                  nieprzypisany - na razie jako wyjście
  27. Config Pind.2 = Input : Set Portd.2                         '                  nieprzypisany - na razie jako wejście
  28. Config Pind.3 = Input : Set Portd.3                         '                  nieprzypisany - na razie jako wejście
  29. Config Pind.5 = Input : Set Portd.5 : X10 Alias Pind.5
  30. Config Pind.6 = Input : Set Portd.6 : X100 Alias Pind.6
  31. Config Pind.7 = Input : Set Portd.7 : Run Alias Pind.7
  32.  
  33. 'TCCR1A  -> |COM1A1| COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
  34. 'TCCR1B  -> | ICNC1|  ICES1   --   WGM13  WGM12  CS12  CS11  CS10
  35.  
  36. '                    WGM13-|
  37.  
  38. '----- DEKLARACJA STAŁYCH I ZMIENNYCH ------------------------------------------
  39.  
  40.    Const Pwm_presc1 = &B00010001                            'for TCCR1B
  41.    Const Pwm_presc8 = &B00010010
  42.   Const Pwm_presc64 = &B00010011
  43.  Const Pwm_presc256 = &B00010100
  44. Const Pwm_presc1024 = &B00010101
  45.  
  46. Const Set_output_mode = &B10100000                          'for TCCR1A
  47.  
  48. Dim Presc As Byte , Wartosc_dla_tccr1b As Byte
  49. Dim Value As Dword , Help_d As Dword , Freq As Dword , Wanted As Dword
  50. Dim Ustaw As Word , Wypelnienie As Word , Proc As Word
  51. Dim Pos As Byte , Helpb As Byte
  52.  
  53. Freq = _xtal
  54.  
  55. Proc = 50                                                   'taka początkowa wartośc, można wpisać 50
  56. Wanted = 100
  57.  
  58. Locate 1 , 3 : Lcd "FREQ = "
  59. Locate 2 , 3 : Lcd "DUTY = "
  60.  
  61.  Gosub Przelicz
  62.   Gosub Menu_sub
  63.  
  64. Do
  65.  
  66.  If Up = 0 Then
  67.   Waitms 50
  68.    If Up = 0 Then
  69.  
  70.     Select Case Pos
  71.  
  72.      Case 0
  73.  
  74.       If Wanted < 10000 Then
  75.        Incr Wanted
  76.         Gosub Przelicz
  77.       End If
  78.  
  79.      Case 1
  80.  
  81.       If Proc < 99 Then
  82.        Incr Proc
  83.         Gosub Calc_duty
  84.          Waitms 50
  85.       End If
  86.  
  87.     End Select
  88.  
  89.    End If
  90.  End If
  91.  
  92.  If Dn = 0 Then
  93.   Waitms 50
  94.    If Dn = 0 Then
  95.  
  96.     Select Case Pos
  97.  
  98.      Case 0
  99.  
  100.       If Wanted > 1 Then
  101.        Decr Wanted
  102.         Gosub Przelicz
  103.       End If
  104.  
  105.      Case 1
  106.  
  107.       If Proc > 1 Then
  108.        Decr Proc
  109.         Gosub Calc_duty
  110.          Waitms 50
  111.       End If
  112.  
  113.     End Select
  114.  
  115.  
  116.  
  117.    End If
  118.  End If
  119.  
  120.  
  121.  
  122.  Debounce F_d , 0 , Menu_sub , Sub
  123. Loop
  124. End
  125.  
  126. Menu_sub:
  127.  
  128.  If Pos = 0 Then
  129.   Pos = 1
  130.    Locate 1 , 1 : Lcd " "
  131.    Locate 2 , 1 : Lcd ">"
  132.  Else
  133.   Pos = 0
  134.    Locate 1 , 1 : Lcd ">"
  135.    Locate 2 , 1 : Lcd " "
  136.  End If
  137.  
  138. Return
  139.  
  140.  
  141. Przelicz:
  142.  
  143.    Locate 1 , 10 : Lcd Wanted ; " Hz "
  144.  
  145.    Value = Freq                                             'przepisz Freq procka do zmiennej
  146.  
  147.    Help_d = Wanted
  148.  
  149.    Select Case Help_d
  150.  
  151.     Case 1 To 15
  152.     '64
  153.       Wartosc_dla_tccr1b = Pwm_presc64
  154.        Shift Value , Right , 6
  155.      Presc = 64
  156.  
  157.     Case 16 To 122                                          '16000000Hz/131072 = 15Hz  '
  158.     '8
  159.       Wartosc_dla_tccr1b = Pwm_presc8
  160.        Shift Value , Right , 3
  161.       Presc = 8
  162.  
  163.     Case Else                                               '16000000Hz/131072 = 122Hz
  164.     '1
  165.       Wartosc_dla_tccr1b = Pwm_presc1
  166.       Presc = 1
  167.  
  168.    End Select
  169.  
  170.    Value = Value \ Help_d                                   'rzeczywistą po preskalerze podziel przez żądaną
  171.     Shift Value , Right , 1                                 'podziel na pół (skróć bo stan odwraca się raz na okres)
  172.  
  173.     Decr Value : Ustaw = Value                              'odejmij jeden
  174.  
  175.     Gosub Calc_duty
  176.  
  177.      Icr1 = Ustaw
  178.  
  179.       Tccr1a = Set_output_mode                              'set count up, reset count down
  180.       Tccr1b = Wartosc_dla_tccr1b                           'ustaw prescaler i WGM13
  181.  
  182. Return
  183.  
  184. Calc_duty:
  185.  
  186.   Help_d = Value * Proc
  187.   Help_d = Help_d / 100
  188.   Wypelnienie = Help_d
  189.    Ocr1a = Wypelnienie
  190.     Locate 2 , 10 : Lcd Proc ; " % "
  191.  
  192. Return
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 03 gru 2017, 9:49

To się chyba da zrobić. Żeby nie dzielić zawsze wszystkiego /2 lepiej jest przyjąć że częstotliwość wynosi 8MHz(bo to chyba jest już tryb Phase & Freq Correct).
Potem, żeby nie używać typu z przecinkiem Single najlepiej pomnożyć te 8MHz x 10 a częstotliwość wtedy żeby wpisać 1,1Hz należy podstawić do równania jako 11(przecinek można na wyświetlaczu dorysować).
Jest tylko jedno "ale". Nie da się przy 16MHz zejść sprzętowo do 0,1Hz na Atmega8 wykorzystując jeden Timer.
Obliczenia są proste 8MHz/0,1=80MHz a to przy najwyższym preskalerze 1024 równa się 78125 czyli nie zmieści się w 16bitach licznika ;)
Przy jednym Timerze można zacząć od około 0,2Hz :D
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Prosty generator prostokąta

Post autor: Zbyszek » 03 gru 2017, 10:18

Nie ma potrzeby poniżej 1Hz. W zupełności wystarczy od 1Hz do 1kHz co 0,1Hz i wypełnienie 1-99% zostawić co 1%.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 03 gru 2017, 12:37

Łap. Nie testowany głębiej bo jest niedziela :D
Kosmetykę w sensie poprzesuwania w lewo sobie sam zrobisz bo się wieksze liczby mogą nie zmieścić (doszedł przecinek i jedna cyfra = 2 znaki)
  1. '*************************************
  2.  
  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 = 16x2
  12. Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portc.1 , E = Portc.5 , Rs = Portd.4
  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 Portb.4 = Input : Reset Portb.4                      '                  nieprzypisany - na razie jako wyjście
  23. Config Portb.5 = Input : Reset Portb.5                      '                  nieprzypisany - na razie jako wyjście
  24. Config Portc.0 = Input : Reset Portc.0                      '                  nieprzypisany - na razie jako wyjście
  25. Config Portd.0 = Input : Set Portd.0 : Led Alias Portd.0
  26. Config Portd.1 = Input : Reset Portd.1                      '                  nieprzypisany - na razie jako wyjście
  27. Config Pind.2 = Input : Set Portd.2                         '                  nieprzypisany - na razie jako wejście
  28. Config Pind.3 = Input : Set Portd.3                         '                  nieprzypisany - na razie jako wejście
  29. Config Pind.5 = Input : Set Portd.5 : X10 Alias Pind.5
  30. Config Pind.6 = Input : Set Portd.6 : X100 Alias Pind.6
  31. Config Pind.7 = Input : Set Portd.7 : Run Alias Pind.7
  32.  
  33. 'TCCR1A  -> |COM1A1| COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
  34. 'TCCR1B  -> | ICNC1|  ICES1   --   WGM13  WGM12  CS12  CS11  CS10
  35.  
  36. '                    WGM13-|
  37.  
  38. '----- DEKLARACJA STAŁYCH I ZMIENNYCH ------------------------------------------
  39.  
  40.    Const Pwm_presc1 = &B00010001                            'for TCCR1B
  41.    Const Pwm_presc8 = &B00010010
  42.   Const Pwm_presc64 = &B00010011
  43.  Const Pwm_presc256 = &B00010100
  44. Const Pwm_presc1024 = &B00010101
  45.  
  46. Const Set_output_mode = &B10100000                          'for TCCR1A
  47.  
  48. Dim Presc As Byte , Wartosc_dla_tccr1b As Byte
  49. Dim Value As Dword , Help_d As Dword , Wanted As Dword
  50. Dim Ustaw As Word , Wypelnienie As Word , Proc As Word
  51. Dim Pos As Byte , Helpb As Byte
  52. Dim Wanted_str As String * 20
  53.  
  54. Const Freq_ = _xtal / 2
  55. Const Freq = Freq_ * 10                                     'z 8 Mega zrobi 80 Mega
  56.  
  57. Proc = 50                                                   'taka początkowa wartośc, można wpisać 50
  58. Wanted = 150                                               'teraz znaczy 15Hz
  59.  
  60. Locate 1 , 3 : Lcd "FREQ = "
  61. Locate 2 , 3 : Lcd "DUTY = "
  62.  
  63.  Gosub Przelicz
  64.   Gosub Menu_sub
  65.  
  66. Do
  67.  
  68.  If Up = 0 Then
  69.   Waitms 50
  70.    If Up = 0 Then
  71.  
  72.     Select Case Pos
  73.  
  74.      Case 0
  75.  
  76.       If Wanted < 100000 Then
  77.        Incr Wanted
  78.         Gosub Przelicz
  79.       End If
  80.  
  81.      Case 1
  82.  
  83.       If Proc < 99 Then
  84.        Incr Proc
  85.         Gosub Calc_duty
  86.          Waitms 50
  87.       End If
  88.  
  89.     End Select
  90.  
  91.    End If
  92.  End If
  93.  
  94.  If Dn = 0 Then
  95.   Waitms 50
  96.    If Dn = 0 Then
  97.  
  98.     Select Case Pos
  99.  
  100.      Case 0
  101.  
  102.       If Wanted > 10 Then
  103.        Decr Wanted
  104.         Gosub Przelicz
  105.       End If
  106.  
  107.      Case 1
  108.  
  109.       If Proc > 1 Then
  110.        Decr Proc
  111.         Gosub Calc_duty
  112.          Waitms 50
  113.       End If
  114.  
  115.     End Select
  116.  
  117.  
  118.  
  119.    End If
  120.  End If
  121.  
  122.  
  123.  
  124.  Debounce F_d , 0 , Menu_sub , Sub
  125. Loop
  126. End
  127.  
  128. Menu_sub:
  129.  
  130.  If Pos = 0 Then
  131.   Pos = 1
  132.    Locate 1 , 1 : Lcd " "
  133.    Locate 2 , 1 : Lcd ">"
  134.  Else
  135.   Pos = 0
  136.    Locate 1 , 1 : Lcd ">"
  137.    Locate 2 , 1 : Lcd " "
  138.  End If
  139.  
  140. Return
  141.  
  142.  
  143. Przelicz:
  144.  
  145.    Wanted_str = Str(wanted)
  146.    Wanted_str = Format(wanted_str , "0.0")
  147.  
  148.    Locate 1 , 10 : Lcd Wanted_str ; " Hz "
  149.  
  150.    Value = Freq                                             'przepisz Freq procka do zmiennej
  151.  
  152.    Help_d = Wanted
  153.  
  154.    Select Case Help_d
  155.  
  156.     Case 10 To 150
  157.     '64
  158.       Wartosc_dla_tccr1b = Pwm_presc64
  159.        Shift Value , Right , 6
  160.      Presc = 64
  161.  
  162.     Case 151 To 1220                                        '16000000Hz/131072 = 15Hz  '
  163.     '8
  164.       Wartosc_dla_tccr1b = Pwm_presc8
  165.        Shift Value , Right , 3
  166.       Presc = 8
  167.  
  168.     Case Else                                               '16000000Hz/131072 = 122Hz
  169.     '1
  170.       Wartosc_dla_tccr1b = Pwm_presc1
  171.       Presc = 1
  172.  
  173.    End Select
  174.  
  175.    Value = Value \ Help_d                                   'rzeczywistą po preskalerze podziel przez żądaną
  176.  
  177.     Decr Value : Ustaw = Value                              'odejmij jeden
  178.  
  179.     Gosub Calc_duty
  180.  
  181.      Icr1 = Ustaw
  182.  
  183.       Tccr1a = Set_output_mode                              'set count up, reset count down
  184.       Tccr1b = Wartosc_dla_tccr1b                           'ustaw prescaler i WGM13
  185.  
  186. Return
  187.  
  188. Calc_duty:
  189.  
  190.   Help_d = Value * Proc
  191.   Help_d = Help_d / 100
  192.   Wypelnienie = Help_d
  193.    Ocr1a = Wypelnienie
  194.     Locate 2 , 10 : Lcd Proc ; " % "
  195.  
  196. Return
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Prosty generator prostokąta

Post autor: Zbyszek » 03 gru 2017, 13:42

Dzięki wielkie, generalnie jest ok oprócz małej dysfunkcji. Jak podłączę zasilanie częstotliwość ustala się na 15Hz. Jak podłączyłem na wyjście miernik częstotliwości to pokazuje 15Hz, ale z całego zakresu nie działa 15,1Hz i 15,2Hz tak to przeleciałem do 200Hz i działa ok. Jak ustawię 15,1 albo 15,2Hz na wyjściu atmegi jest 0, ale to jutro bo dzisiaj niedziela i dajmy sobie dzisiaj z tym spokój ( chodziaż ja dzisiaj maszeruję na II zmianę do roboty :( )
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 03 gru 2017, 13:46

Nie napisałem, że w niedzielę nic nie robię :D
Jestem bardzo zajęty i nie mam do tego głowy. Zobacz co się stanie jak zamienisz "Case 10 To 150" na "Case 10 To 159" i niżej "Case 151 To 1220" na "Case 160 To 1220" :D
Zbyszek
Posty: 71
Rejestracja: 30 lis 2017, 17:12

Re: Prosty generator prostokąta

Post autor: Zbyszek » 03 gru 2017, 14:03

Uprzedziłeś mnie, właśnie tak zrobiłem tylko że zmieniłem "Case 10 To 150" na "Case 10 To 152" i niżej "Case 151 To 1220" na "Case 153 To 1220" i się zrobiło że już działa :D Dzięki wielkie
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 26 sty 2018, 21:56

Witam :D
Przymierzam się do tego projektu , tylko mój Bascom 1.11.9.1 jest chyba nieco jak jak leciwy :lol:
Wywala błędy przy :
linia 11 16x2 , tu nie problem w moim muszę pisać 16*2
linia 49 Dim Value As Dword , Help_d AsDword , Wanted As Dword , tu podstawiam long :?:
linia 181 Icr1 = Ustaw
linia 193 Ocr1a = Wypelnienie

Przepraszam , nie wklejam kodu , bo nie wiem co jeszcze mi wysypie Bascom .

Help ;)

Sorki za zamęt ;) odrobiłem lekcje , mój Baskom jest jeszcze lampowy :lol: zainstalowałem wersję demo i przeszło bezboleśnie ;)
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Prosty generator prostokąta

Post autor: niveasoft » 27 sty 2018, 0:12

No i gitara bo miałem Ci własnie Demo polecić.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Prosty generator prostokąta

Post autor: Henryk » 27 sty 2018, 14:31

Witam :D
Podziękowania dla Autora/ów generatora , przyda się na warsztacie :D
Już działa na płycie testowej , teraz mogę spokojnie projektować PCB ;)
[media]https://www.youtube.com/watch?v=-6ZdaNVr6Y8[/media]

Jest jeden drobny mankament , poniżej 2 Hz przestaje działać , albo nalicza i wyświetla więcej niż trzeba :?:
Tych kilka mignięć diody led poniżej częstotliwości 2Hz , jest efektem zwalniania przycisków .
ODPOWIEDZ