Dziwne zachowanie Sys_Tic zależnie od typu zmiennej

Pytania, kody i porady dotyczące nie tylko Bascom.
Press
Posty: 79
Rejestracja: 21 sty 2018, 23:08

Re: Dziwne zachowanie Sys_Tic zależnie od typu zmiennej

Post autor: Press » 09 cze 2026, 20:14

Być może faktycznie witaminka jest tu winna. Trudno powiedzieć.
Mam WIN 11, ale uruchomienie w trybie zgodności z WIN 7 nic nie zmieniło.

Co ciekawe, aby wykluczyć problem kolizji dostępu do zmiennej przez program główny i procedurę przerwania,
to przeniosłem inkrementację Sys_tic do pętli głównej i efekt ten sam.
Wygląda na to, że problemem jest w samym kompilatorze, więc chyba to kończy rozważania nad problemem.

Znalazłem jeszcze wersję 2085 z witaminami i też to samo.
Ja się poddaję :)
Press
Posty: 79
Rejestracja: 21 sty 2018, 23:08

Re: Dziwne zachowanie Sys_Tic zależnie od typu zmiennej

Post autor: Press » 09 cze 2026, 22:59

I bądź człowieku mądry.
W takiej wersji działa jak należy.
  1. $regfile = "m328pdef.dat"
  2. $crystal = 8000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 128
  6. $baud = 115200
  7.  
  8. Config Submode = New
  9.  
  10. '=====Konfiguracja sprzętowa======
  11. Config Portb.5 = Output                                                                                                 'Dioda LED
  12.  
  13.  
  14. Config Timer0 = Timer , Prescale = 64 , Clear_timer = 1
  15.  
  16. '=====Deklaracja zmiennych======
  17. Dim Tic_raw , Sys_tic , Tim_led As Dword
  18. Dim Blok As Byte
  19. Dim Interval As Dword
  20.  
  21. Ocr0a = 124
  22. Start Timer0                                                                                                            'Przerwanie co 1 mS przez Timer0
  23.  
  24. On Compare0a Tim0_oc0a
  25.  
  26. Enable Oc0a
  27. Enable Interrupts
  28.  
  29.  
  30. '=====Aliasy======
  31. Led_out Alias Portb.5
  32.  
  33. '=====Funkcje i Procedury=====
  34. Function Period(byref T As Dword , P As Dword) As Byte
  35.    Local Temp , Temp_tic As Dword
  36.  
  37.    Blok = 1
  38.    Temp_tic = Sys_tic
  39.    Blok = 0
  40.  
  41.    Temp = Temp_tic - T
  42.    If Temp >= P Then
  43.       Period = 1
  44.       T = T + P
  45.    Else
  46.       Period = 0
  47.    End If
  48.  
  49. End Function
  50.  
  51.  
  52. '=====Pętla główna====
  53. Interval = 100
  54. Do
  55.    If Period(tim_led , Interval) <> 0 Then
  56.       Print Tim_led
  57.       Toggle Led_out
  58.    End If
  59.  
  60. Loop
  61.  
  62. 'Zwiększa zmienną Sys_Tic co 1 ms.
  63. Tim0_oc0a:
  64.    Incr Tic_raw
  65.    If Blok = 0 Then
  66.       Sys_tic = Tic_raw
  67.    End If
  68. Return
ODPOWIEDZ