czy ten program powinien działać

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

czy ten program powinien działać

Post autor: Jacek » 10 gru 2017, 1:21

Witam - czy załączony program będzie działał czy mam coś źle - proszę o podpowiedź.
  1. '************************************************
  2. 'MIKROKONTROLER
  3. '$sim
  4. $regfile = "m16adef.dat"
  5. $crystal = 16000000
  6. '$baud = 19200
  7. $hwstack = 64
  8. $swstack = 32
  9. $framesize = 64
  10. '************************************************
  11. 'KONFIGURACJA TIMER0
  12. Config Timer0 = Timer , Prescale = 256
  13. Enable Timer0 : On Timer0 Przertimer0
  14. '************************************************
  15. 'KONFIGURACJA LCD
  16. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
  17. Config Lcd = 16 * 4
  18. '************************************************
  19. 'PRZYPISANIE ZMIENNYCH
  20. Dim Dzielnik(4) As Byte                                                         'dzielniki timera
  21. Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit , Flaga_5s As Bit       'flagi przerwa?
  22. Dim Poz_wys As Byte
  23. '************************************************
  24. 'DEKLARACJE
  25. Declare Sub Wyswietlanie
  26. Declare Sub Przyciski
  27.  
  28. 'KONFIGURACJA PORTÓW
  29. Config Portd = &B00000000 , Portd = &B11111111
  30. '************************************************
  31. 'ALIASY
  32. Enter Alias Pind.0
  33.  
  34. '************************************************
  35. 'USTAWIENIA POCZĄTKOWE
  36. Cursor Off
  37. Cls
  38. Poz_wys = 0
  39. Locate 1 , 1 : Lcd "poz. lcd zero"
  40. '************************************************
  41. 'POCZĄTEK
  42. Do
  43.  
  44.   '**********************************************   co 4ms
  45.    If Flaga_4ms = 1 Then
  46.       Flaga_4ms = 0
  47.    End If
  48. '***********************************************
  49.    If Flaga_100ms = 1 Then
  50.       Flaga_100ms = 0
  51.       Call Przyciski
  52.    End If
  53. '***********************************************   co 500ms
  54.    If Flaga_500ms = 1 Then
  55.       Flaga_500ms = 0
  56.       'Gosub Wysw
  57.    End If
  58. '***********************************************   co 1s
  59.    If Flaga_1s = 1 Then
  60.       Flaga_1s = 0
  61.       Call Wyswietlanie
  62.    End If
  63.    '********************************************* co 5s
  64.  
  65. Loop
  66. End
  67.  
  68.  
  69. '************************************************
  70. 'PRZERWANIE TIMER0
  71. Przertimer0:
  72.    Timer0 = 6
  73.    Set Flaga_4ms                                                                'wyzawlanie co 4ms
  74.    Incr Dzielnik(1)
  75.    If Dzielnik(1) = 25 Then
  76.       Dzielnik(1) = 0
  77.       Set Flaga_100ms                                                           'wyzwalanie co 100ms
  78.       Incr Dzielnik(2)
  79.       If Dzielnik(2) = 5 Then
  80.          Dzielnik(2) = 0
  81.          Set Flaga_500ms                                                        'wyzwalanie co 500ms
  82.          Incr Dzielnik(3)
  83.          If Dzielnik(3) = 2 Then
  84.             Dzielnik(3) = 0
  85.             Set Flaga_1s                                                        'wyzwalanie co 1s
  86.             Incr Dzielnik(4)
  87.             If Dzielnik(4) = 5 Then
  88.                Dzielnik(4) = 0
  89.                Set Flaga_5s                                                     'wyzwalanie co 5s
  90.             End If
  91.          End If
  92.       End If
  93.    End If
  94. Return
  95.  
  96. Sub Przyciski:
  97.    If Enter = 0 And Flaga_5s = 1 Then
  98.       Flaga_5s = 0
  99.       Poz_wys = 1
  100.    End If
  101. End Sub
  102.  
  103. Sub Wyswietlanie:
  104.    If Poz_wys = 0 Then
  105.       Cls
  106.       Locate 1 , 1 : Lcd "poz. lcd zero   "
  107.       If Poz_wys = 1 Then
  108.          Cls
  109.          Locate 1 , 1 : Lcd "poz. lcd jeden  "
  110.       End If
  111.    End If
  112. End Sub
pozdrawiam Jacek.
Ostatnio zmieniony 10 gru 2017, 16:21 przez Jacek, łącznie zmieniany 1 raz.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: czy ten program powinien działać

Post autor: Jacek » 10 gru 2017, 10:01

Witam - no tak nie miałem włączonych przerywań (enable interrupts ) - ale program dalej nie działa - sprawdzałem w symulatorze i program nie skacze do przerwania.
  1. '************************************************
  2. 'MIKROKONTROLER
  3. '$sim
  4. $regfile = "m16adef.dat"
  5. $crystal = 16000000
  6. '$baud = 19200
  7. $hwstack = 64
  8. $swstack = 32
  9. $framesize = 64
  10. '************************************************
  11. 'KONFIGURACJA TIMER0
  12. Config Timer0 = Timer , Prescale = 256
  13. 'Enable Timer0 : On Timer0 Przertimer0
  14. '************************************************
  15. 'KONFIGURACJA LCD
  16. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'mirley UPT M16
  17. Config Lcd = 16 * 4
  18. '************************************************
  19. 'PRZYPISANIE ZMIENNYCH
  20. Dim Dzielnik(4) As Byte                                                         'dzielniki timera
  21. Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit , Flaga_5s As Bit       'flagi przerwa?
  22. Dim Poz_wys As Byte
  23. '************************************************
  24. 'DEKLARACJE
  25. Declare Sub Wyswietlanie
  26. Declare Sub Przyciski
  27.  
  28. 'KONFIGURACJA PORTÓW
  29. 'Config Portd = &B00000000 , Portd = &B11111111
  30. Config Portd.0 = Input
  31. Set Pind.0
  32. Config Portb.7 = Output
  33. Set Portb.7
  34. '************************************************
  35. 'ALIASY
  36. Enter Alias Pind.0
  37.  
  38. '************************************************
  39. 'USTAWIENIA POCZĄTKOWE
  40. Enable Interrupts
  41. Enable Timer0 : On Timer0 Przertimer0
  42. Cursor Off
  43. Cls
  44. Poz_wys = 0
  45. Locate 1 , 1 : Lcd "poz. lcd zero"
  46. '************************************************
  47. 'POCZĄTEK
  48. Do
  49.  
  50.   '**********************************************   co 4ms
  51.    If Flaga_4ms = 1 Then
  52.       Flaga_4ms = 0
  53.    End If
  54. '***********************************************
  55.    If Flaga_100ms = 1 Then
  56.       Flaga_100ms = 0
  57.       Call Przyciski
  58.    End If
  59. '***********************************************   co 500ms
  60.    If Flaga_500ms = 1 Then
  61.       Flaga_500ms = 0
  62.       'Gosub Wysw
  63.    End If
  64. '***********************************************   co 1s
  65.    If Flaga_1s = 1 Then
  66.       Flaga_1s = 0
  67.       Call Wyswietlanie
  68.    End If
  69.    '********************************************* co 5s
  70.    If Enter = 0 Then
  71.       Reset Portb.7
  72.    End If
  73.  
  74. Loop
  75. End
  76.  
  77.  
  78. '************************************************
  79. 'PRZERWANIE TIMER0
  80. Przertimer0:
  81.    Timer0 = 6
  82.    Set Flaga_4ms                                                                'wyzawlanie co 4ms
  83.    Incr Dzielnik(1)
  84.    If Dzielnik(1) = 25 Then
  85.       Dzielnik(1) = 0
  86.       Set Flaga_100ms                                                           'wyzwalanie co 100ms
  87.       Incr Dzielnik(2)
  88.       If Dzielnik(2) = 5 Then
  89.          Dzielnik(2) = 0
  90.          Set Flaga_500ms                                                        'wyzwalanie co 500ms
  91.          Incr Dzielnik(3)
  92.          If Dzielnik(3) = 2 Then
  93.             Dzielnik(3) = 0
  94.             Set Flaga_1s                                                        'wyzwalanie co 1s
  95.             Incr Dzielnik(4)
  96.             If Dzielnik(4) = 5 Then
  97.                Dzielnik(4) = 0
  98.                Set Flaga_5s                                                     'wyzwalanie co 5s
  99.             End If
  100.          End If
  101.       End If
  102.    End If
  103. Return
  104.  
  105. Sub Przyciski:
  106.    If Enter = 0 And Flaga_5s = 1 Then
  107.       Flaga_5s = 0
  108.       Poz_wys = 1
  109.    End If
  110. End Sub
  111.  
  112. Sub Wyswietlanie:
  113.    If Poz_wys = 0 Then
  114.       Cls
  115.       Locate 1 , 1 : Lcd "poz. lcd zero   "
  116.       If Poz_wys = 1 Then
  117.          Cls
  118.          Locate 1 , 1 : Lcd "poz. lcd jeden  "
  119.       End If
  120.    End If
  121. End Sub
pozdrawiam Jacek.
Ostatnio zmieniony 10 gru 2017, 16:23 przez Jacek, łącznie zmieniany 2 razy.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: czy ten program powinien działać

Post autor: niveasoft » 10 gru 2017, 15:21

Wsadź ten kod prawidlowo w znaczniki jak każdy mój inny tu na Forum.
To nie jest skomplikowane. Edytujesz wiadomość i zamiast "</>" wybierasz niżej "Select code" . Dalej z rozwijanej listy wybierasz Bascom AVR i kod będzie kolorowany i na dodatek nie trzeba go przewijać.

U mnie, przez opady śniegu i pozrywane linie, nie ma pradu drugi dzień. Jak się Energetyka ogarnie to postaram się odpowiedzieć też na ten post o enkoderach.

W symulatorze, żeby działały przerwania od Timerów musisz u góry wcisnąć "Symulate Timers"
Wtedy działają automatycznie, ale czasem lepiej samemu wcisnąć przycisk na karcie Interrupts.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: czy ten program powinien działać

Post autor: Jacek » 10 gru 2017, 16:24

Witam - przepraszam ale ślepy byłem hi teraz jest chyba prawidłowo wstawiony kod.
pozdrawiam Jacek.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: czy ten program powinien działać

Post autor: niveasoft » 10 gru 2017, 18:02

Co Ci nie działa w tym programie?
Osobiście nie ustawiał bym żadnych Bitów w przerwaniu.
Lepiej zadeklarować te flagi jako Byte i wtedy w przerwaniu pisać Flaga_5s = 1 (zamiast Set Flaga_5s)
O dziwo kod jest wtedy mniejszy bo Bascom nie musi bawić się w wyłuskanie Bitu tylko wpisuje wartość.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: czy ten program powinien działać

Post autor: Jacek » 10 gru 2017, 19:00

Program powinien wyświetlić "poz. lcd jeden" po 5 sekundach od naciśnięcia przycisku - a jest tak że raz napis pojawia się po np. 3 sekundach a innym razem po np 8 - czyli działa nie tak jak powinien.

pozdrawiam Jacek.
ODPOWIEDZ