Strona 1 z 2

Odliczanie czasu na zmiennej

: 19 wrz 2017, 18:16
autor: demsy
Witam
Przerobiłem trochę kolego Bartka kod po swojemu ale nie działa mi odmierzanie czasu. Wykorzystałem ADC(1) i potencjometr. chciałem uzyskać efekt rozjaśnienia diod później czekaj ustawiony czas na potencjometrze i zgaś diody (narazie tylko 2 diody na próbę). Samo rozjaśnianie i gaszenie działa tylko czas raz odlicza mi 30s raz 50s nieprzestawiając suwaka. Kwarc 8Mhz
  1. Szybkosc = 100
  2. Speed = 0
  3. Led_nr = 1
  4.  
  5. Do
  6.  
  7.  
  8. Czas = Getadc(1)
  9. Czas = Czas
  10. Foto = Getadc(0)
  11.                                          
  12. Foto = Foto
  13.  
  14.  
  15.  
  16.  
  17.  If Foto > 950 Then
  18.   If Sw1 = 0 Or Sw2 = 0 And Bit_1 = 1 Then
  19.      Bit_1 = 0
  20.      Led_nr = 1
  21.       Scenario = 1
  22.  
  23.    End If
  24.     End If
  25.  
  26.        If Led_nr = 100 Then
  27.      
  28.     If Odlicz >= Czas Then
  29.     odlicz=0
  30.     Scenario = 3
  31.     End If
  32.     End If
  33.  
  34.  
  35. If Speed = 0 Then
  36.                                          
  37. Select Case Scenario                                        '
  38.  
  39.  
  40.  
  41. Case 0
  42. '************************************************************************************
  43. Case 1
  44. ' * * * * * * * * * * * * * * * * * * * * * * * * *
  45.               If Led_nr < 100 Then Incr Led_nr
  46.  
  47.                If Old_val <> Led_nr Then
  48.                   Old_val = Led_nr
  49.  
  50.                   Speed = 127 - Led_nr
  51.                   Speed = Szybkosc
  52.  
  53.  
  54.                   Shift Speed , Left , 1
  55.  
  56.                   M = Memcopy(led_nr , Pwm_led(10) , 1)
  57.  
  58.                End If
  59.  
  60.  
  61.  
  62. Case 3
  63.  
  64.  
  65.               If Led_nr > 0 Then Decr Led_nr
  66.  
  67.                If Old_val <> Led_nr Then
  68.                   Old_val = Led_nr
  69.  
  70.                   Speed = 127 - Led_nr
  71.                   Speed = Szybkosc
  72.  
  73.                   Shift Speed , Left , 1
  74.  
  75.                   M = Memcopy(led_nr , Pwm_led(10) , 1 )
  76.                End If
  77.  
  78.                  Bit_1 = 1
  79.  
  80.  
  81.  
  82. End Select
  83.  
  84. End If
  85.  
  86. Loop

Re: Odliczanie czasu na zmiennej

: 19 wrz 2017, 18:37
autor: niveasoft
Tak okroiłeś kod, że nie widać czy odczyt z ADC ładujesz do zmiennej typu Word/Integer czyli coś co pomieści odczyt z ADC do 1023.
Nie wiem jakiej maści są zmienne Czas i Foto.

Szkoda gdybać co tam masz pomiksowane jak całego kodu nie ma lub kodu który da się skompilować i przedstawia problem.

Nie wiem czy nie zamotam Ci w głowie ale jeśli nie interesuje Cie dokładność 10bit to można czytac ADC do zmiennej typu Byte ale trzeba ustawić bit ADLAR :D Jak będziesz chciał wiedzieć o co chodzi to zapytaj.

Re: Odliczanie czasu na zmiennej

: 19 wrz 2017, 23:22
autor: demsy
Już się poprawiam
Nie musi być to super dokładnie więc zamienna może być byte.
Co to jest ADLER?
  1.  
  2. Dim Pwm_led(4) As Byte                                  
  3. Dim Speed As Word
  4. Dim Scenario As Byte
  5. Dim Czas As Word                                            
  6. Dim Led_nr As Byte
  7. Dim Bit_1 As Bit
  8. Dim Leds_pwm As Byte
  9. Dim M As Byte
  10. Dim Old_val As Byte
  11. Dim L_d As Byte
  12. Dim Szybkosc As byte
  13. Dim Odlicz As Byte
  14.  
  15. Bit_1 = 1
  16. Szybkosc = 100
  17. Odlicz = 0
  18. Led_nr = 1
  19.  
  20. do
  21. Czas = Getadc(1)
  22. Czas = Czas
  23.  
  24.   If Sw1 = 0 Or Sw2 = 0 And Bit_1 = 1 Then
  25.      Bit_1 = 0
  26.      Led_nr = 1
  27.       Scenario = 1
  28.  
  29.  
  30.     End If
  31.  
  32.        If Led_nr = 100 Then
  33.        Odlicz = 0
  34.     If Odlicz >= Czas Then
  35.  
  36.     Scenario = 1
  37.     End If
  38.     End If
  39.  
  40.  
  41. If Speed = 0 Then
  42.                                           'jesli nadszedl czas na zmiane PWM
  43. Select Case Scenario                                        'sprawdz co robimy
  44.  
  45.  
  46.  
  47. '************************************************************************************
  48. Case 0
  49. ' * * * * * * * * * * * * * * * * * * * * * * * * *
  50.               If Led_nr < 100 Then Incr Led_nr
  51.  
  52.                If Old_val <> Led_nr Then
  53.                   Old_val = Led_nr
  54.  
  55.                   Speed = 127 - Led_nr
  56.                   Speed = Szybkosc
  57.  
  58.  
  59.                   Shift Speed , Left , 1
  60.  
  61.                   M = Memcopy(led_nr , Pwm_led(10) , 1)
  62.  
  63.                End If
  64.  
  65.  
  66.  
  67. Case 1
  68.  
  69.  
  70.               If Led_nr > 0 Then Decr Led_nr
  71.  
  72.                If Old_val <> Led_nr Then
  73.                   Old_val = Led_nr
  74.  
  75.                   Speed = 127 - Led_nr
  76.                   Speed = Szybkosc
  77.  
  78.                   Shift Speed , Left , 1
  79.  
  80.                   M = Memcopy(led_nr , Pwm_led(10) , 1 )
  81.                End If
  82.  
  83.                  Bit_1 = 1
  84.  
  85.  
  86.  
  87. End Select
  88.  
  89. End If
  90.  
  91. Loop

Re: Odliczanie czasu na zmiennej

: 19 wrz 2017, 23:44
autor: niveasoft
Kolego "nick" "demsy"pamiętam z forum jakiegoś, ale rozmawiając o elektronice musimy być dosłowni.
Prosze napisac przynajmniej regfile/ na jaki to procesor.
Tak przykro mi tłumaczyć bo przecież każdy może przeczytać, że ADLAR a nie ADLER to ADLAR ADC Left Adjust Result
Tu chodzi o to że wynik pomiaru będzie przepisany do tego ADCH.. nie wiem czy wiecie że trzeba go czytać .. to wszystko związane z czytaniem noty.
Wyjątkowo nie chce mi się tego tłumaczyć bo tego pełno w sieci.

W największym skrócie wynik pomiaru będzie w zakresie 0-255 --> może się akurat przyda.

Re: Odliczanie czasu na zmiennej

: 20 wrz 2017, 11:16
autor: demsy
Na forum u Mirka kiedyś pisałem.
wrzucam cały kod
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3.  
  4. Ddrb = &B00011100 : Portb = &B11100011
  5. Ddrc = &B00111100 : Portc = &B00000000
  6. Ddrd = &B11111111 : Portd = &B00000000
  7.  
  8. Config Timer2 = Timer , Prescale = 8 , Compare = Disconnect , Clear Timer = 1
  9. Enable Compare2 : On Compare2 Int0_isr : Compare2 = 124
  10.  
  11.  
  12. Config Adc = Single , Prescaler = Auto , Reference = Avcc
  13. Start Adc
  14.  
  15.  
  16. Enable Interrupts
  17.  
  18. '******************  Zmienne *******************
  19. '***********************************************
  20. Dim Licznik As Byte
  21. Dim Licz As Byte
  22. Dim Max_pwm As Byte                                         'liczy od 1 do 100 w przerwaniu
  23. Dim Pwm_led(4) As Byte                                     'osiem bajtów, dla każdego kanału wartosc PWM 1%-100%                                            'pomocnicza
  24. Dim Speed As Word
  25. Dim Speed_2 As Word                                         'spowolnienie akcji
  26. Dim Scenario As Byte
  27. Dim Z As Word
  28. Dim Czas As Byte                                            'wybor dwoch trybów
  29. Dim Led_nr As Byte
  30. Dim Bit_1 As Bit
  31. Dim Bit_2 As Bit
  32. Dim Ena_3 As Bit
  33. Dim Foto As Word
  34. Dim Leds_pwm As Byte
  35. Dim M As Byte
  36. Dim Old_val As Byte
  37. Dim L_d As Byte
  38. Dim Szybkosc As Word
  39. Dim Odlicz As Byte
  40.  
  41.  
  42. D1 Alias Portd.2 : D2 Alias Portd.3 : D3 Alias Portd.4 : D4 Alias Portd.5
  43.  
  44.  
  45. '***************   przyciski     *****************
  46. Sw1 Alias Pinb.0                                            'czujnik
  47. Sw2 Alias Pinb.1                                            'włącznik na stałe
  48.  
  49. '*************************************************
  50.  
  51.  
  52.  
  53. '**************  Petla glowna ******************
  54.  
  55. '***********************************************
  56.  
  57.  
  58.  
  59. Bit_1 = 1
  60.  
  61. Szybkosc = 100
  62. Speed = 0
  63. Odlicz = 1
  64. Led_nr = 1
  65.  
  66. Do
  67.  
  68.  
  69. Czas = Getadc(1)
  70. Czas = Czas
  71.  
  72.  
  73.   If Sw1 = 0 Or Sw2 = 0 And Bit_1 = 1 Then
  74.      Bit_1 = 0
  75.      Led_nr = 1
  76.       Scenario = 1
  77.  
  78.    End If
  79.  
  80.  
  81.        If Led_nr = 100 Then
  82.        Incr Odlicz
  83.        Waitms 200
  84.         If Odlicz >= Czas Then
  85.         Odlicz = 0
  86.         Scenario = 2
  87.        End If
  88.        End If
  89.  
  90.  
  91. If Speed = 0 Then
  92.                                           'jesli nadszedl czas na zmiane PWM
  93. Select Case Scenario                                        'sprawdz co robimy
  94.  
  95.  
  96. Case 0
  97. '************************************************************************************
  98.  
  99. Case 1
  100. ' * * * * * * * * * * * * * * * * * * * * * * * * *
  101.               If Led_nr < 100 Then Incr Led_nr
  102.  
  103.                If Old_val <> Led_nr Then
  104.                   Old_val = Led_nr
  105.  
  106.                   Speed = 127 - Led_nr
  107.                   Speed = Szybkosc
  108.  
  109.  
  110.                   Shift Speed , Left , 1
  111.  
  112.                   M = Memcopy(led_nr , Pwm_led(4) , 1)
  113.  
  114.                End If
  115.  
  116.  
  117.  
  118. Case 2
  119.  
  120.  
  121.               If Led_nr > 0 Then Decr Led_nr
  122.  
  123.                If Old_val <> Led_nr Then
  124.                   Old_val = Led_nr
  125.  
  126.                   Speed = 127 - Led_nr
  127.                   Speed = Szybkosc
  128.  
  129.                   Shift Speed , Left , 1
  130.  
  131.                   M = Memcopy(led_nr , Pwm_led(4) , 1 )
  132.                End If
  133.  
  134.                  Bit_1 = 1
  135.  
  136.  
  137.  
  138. End Select
  139.  
  140. End If
  141.  
  142. Loop
  143.  
  144.  
  145.  
  146.  
  147.  
  148. '************ Przerwanie timer 0 ***************
  149. '***********************************************
  150. Int0_isr:
  151.  Incr Licznik
  152.  
  153.  If Licznik = 100 Then Licznik = 0
  154.  
  155.  If Licznik < Pwm_led(1) Then Set D1 Else Reset D1
  156.  If Licznik < Pwm_led(2) Then Set D2 Else Reset D2
  157.  If Licznik < Pwm_led(3) Then Set D3 Else Reset D3
  158.  If Licznik < Pwm_led(4) Then Set D4 Else Reset D4
  159.  
  160.     If Speed > 0 Then Decr Speed
  161.  
  162.  
  163.  
  164. Return

Re: Odliczanie czasu na zmiennej

: 20 wrz 2017, 11:21
autor: niveasoft
Kolego pisze Czas As Byte a niżej Czas = Getadc()
Tak się nie robi.
Byte pomieści do 255 a ADC daje wyniki do 1023.
Kiedy wynik ADC odczytasz do Byte to kiedy on przekroczy 255 to w tym Byte chyba jest tylko reszta tego odczytu.
Zadeklaruj Czas jako Word który pomieści dwa Byte

Czasem się tak to pisze jeśli chcesz tylko 8 bitów
  1. Dim Adc_read As Word
  2. Dim Result As byte
  3.  
  4. Adc_read = Getadc(0)
  5. Result = Adc_read/4
Nie użyłem tu przesunięcia bitowego a usprawniłoby sprawę :D

Podsumowując jeśli nie masz ustawionego bitu ADLAR to ADC czytamy do typu WORD

Re: Odliczanie czasu na zmiennej

: 20 wrz 2017, 11:26
autor: demsy
Faktycznie przeoczyłem to.
Mógłby mi kolega podesłać jakieś namiary na ADLAR , w helpie nie mogę tego znaleźć

Re: Odliczanie czasu na zmiennej

: 20 wrz 2017, 11:28
autor: niveasoft
Zerknij tutaj na Forum w dział podpowiedzi tam chyba coś skrobnąłem, a jak niejasne to pisz.

W takim skrócie to trzeba czytać dwa rejesrtry ADCL i ADCH. Jak chcesz znać rezultat pomiaru dokładnie to czytasz najpierw końcówkę czyli ADCL i zawsze trzeba czytać ADCH by poznać najbardziej znaczące bity i przy okazji zezwolić na ponowny zapis tych rejestrów.

Kiedy ustawiony jest Bit ADLAR to ADC mierzy, ale wynik przesuwa do rejestru ADCH. Masz mniejszą dokładność bo tylko 8 Bit, ale czytasz tylko jeden rejestr nie dwa.

Re: Odliczanie czasu na zmiennej

: 20 wrz 2017, 12:29
autor: demsy
Narazie zostańmy przy tym ADC co ja zacząłem pisać, późnij zajrzę do "podpowiedzi"
pozmieniałem zamienne wg kolegi są bardziej czytelne
  1. Dim Adc_read As Word
  2. Dim Result As Byte
pytanie jeszcze odnośnie tego fragmentu
  1.   If Led_nr = 100 Then
  2.        Incr Result
  3.        Waitms 100
  4.  
  5.        If Result > Adc_read Then
  6.  
  7.         Result = 0
  8.         Scenario = 2
  9.        End If
  10.        End If
Jak można zwolnić zwiększanie zmiennej RESULT?

Re: Odliczanie czasu na zmiennej

: 20 wrz 2017, 12:36
autor: demsy
chyba wiem gdzie zrobiłem błąd, ale sprawdzę dopiero jutro jak wrócę do domu