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
Szybkosc = 100
Speed = 0
Led_nr = 1
Do
Czas = Getadc(1)
Czas = Czas
Foto = Getadc(0)
Foto = Foto
If Foto > 950 Then
If Sw1 = 0 Or Sw2 = 0 And Bit_1 = 1 Then
Bit_1 = 0
Led_nr = 1
Scenario = 1
End If
End If
If Led_nr = 100 Then
If Odlicz >= Czas Then
odlicz=0
Scenario = 3
End If
End If
If Speed = 0 Then
Select Case Scenario '
Case 0
'************************************************************************************
Case 1
' * * * * * * * * * * * * * * * * * * * * * * * * *
If Led_nr < 100 Then Incr Led_nr
If Old_val <> Led_nr Then
Old_val = Led_nr
Speed = 127 - Led_nr
Speed = Szybkosc
Shift Speed , Left , 1
M = Memcopy(led_nr , Pwm_led(10) , 1)
End If
Case 3
If Led_nr > 0 Then Decr Led_nr
If Old_val <> Led_nr Then
Old_val = Led_nr
Speed = 127 - Led_nr
Speed = Szybkosc
Shift Speed , Left , 1
M = Memcopy(led_nr , Pwm_led(10) , 1 )
End If
Bit_1 = 1
End Select
End If
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

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?
Dim Pwm_led(4) As Byte
Dim Speed As Word
Dim Scenario As Byte
Dim Czas As Word
Dim Led_nr As Byte
Dim Bit_1 As Bit
Dim Leds_pwm As Byte
Dim M As Byte
Dim Old_val As Byte
Dim L_d As Byte
Dim Szybkosc As byte
Dim Odlicz As Byte
Bit_1 = 1
Szybkosc = 100
Odlicz = 0
Led_nr = 1
do
Czas = Getadc(1)
Czas = Czas
If Sw1 = 0 Or Sw2 = 0 And Bit_1 = 1 Then
Bit_1 = 0
Led_nr = 1
Scenario = 1
End If
If Led_nr = 100 Then
Odlicz = 0
If Odlicz >= Czas Then
Scenario = 1
End If
End If
If Speed = 0 Then
'jesli nadszedl czas na zmiane PWM
Select Case Scenario 'sprawdz co robimy
'************************************************************************************
Case 0
' * * * * * * * * * * * * * * * * * * * * * * * * *
If Led_nr < 100 Then Incr Led_nr
If Old_val <> Led_nr Then
Old_val = Led_nr
Speed = 127 - Led_nr
Speed = Szybkosc
Shift Speed , Left , 1
M = Memcopy(led_nr , Pwm_led(10) , 1)
End If
Case 1
If Led_nr > 0 Then Decr Led_nr
If Old_val <> Led_nr Then
Old_val = Led_nr
Speed = 127 - Led_nr
Speed = Szybkosc
Shift Speed , Left , 1
M = Memcopy(led_nr , Pwm_led(10) , 1 )
End If
Bit_1 = 1
End Select
End If
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
$regfile = "m8def.dat"
$crystal = 8000000
Ddrb = &B00011100 : Portb = &B11100011
Ddrc = &B00111100 : Portc = &B00000000
Ddrd = &B11111111 : Portd = &B00000000
Config Timer2 = Timer , Prescale = 8 , Compare = Disconnect , Clear Timer = 1
Enable Compare2 : On Compare2 Int0_isr : Compare2 = 124
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Enable Interrupts
'****************** Zmienne *******************
'***********************************************
Dim Licznik As Byte
Dim Licz As Byte
Dim Max_pwm As Byte 'liczy od 1 do 100 w przerwaniu
Dim Pwm_led(4) As Byte 'osiem bajtów, dla każdego kanału wartosc PWM 1%-100% 'pomocnicza
Dim Speed As Word
Dim Speed_2 As Word 'spowolnienie akcji
Dim Scenario As Byte
Dim Z As Word
Dim Czas As Byte 'wybor dwoch trybów
Dim Led_nr As Byte
Dim Bit_1 As Bit
Dim Bit_2 As Bit
Dim Ena_3 As Bit
Dim Foto As Word
Dim Leds_pwm As Byte
Dim M As Byte
Dim Old_val As Byte
Dim L_d As Byte
Dim Szybkosc As Word
Dim Odlicz As Byte
D1 Alias Portd.2 : D2 Alias Portd.3 : D3 Alias Portd.4 : D4 Alias Portd.5
'*************** przyciski *****************
Sw1 Alias Pinb.0 'czujnik
Sw2 Alias Pinb.1 'włącznik na stałe
'*************************************************
'************** Petla glowna ******************
'***********************************************
Bit_1 = 1
Szybkosc = 100
Speed = 0
Odlicz = 1
Led_nr = 1
Do
Czas = Getadc(1)
Czas = Czas
If Sw1 = 0 Or Sw2 = 0 And Bit_1 = 1 Then
Bit_1 = 0
Led_nr = 1
Scenario = 1
End If
If Led_nr = 100 Then
Incr Odlicz
Waitms 200
If Odlicz >= Czas Then
Odlicz = 0
Scenario = 2
End If
End If
If Speed = 0 Then
'jesli nadszedl czas na zmiane PWM
Select Case Scenario 'sprawdz co robimy
Case 0
'************************************************************************************
Case 1
' * * * * * * * * * * * * * * * * * * * * * * * * *
If Led_nr < 100 Then Incr Led_nr
If Old_val <> Led_nr Then
Old_val = Led_nr
Speed = 127 - Led_nr
Speed = Szybkosc
Shift Speed , Left , 1
M = Memcopy(led_nr , Pwm_led(4) , 1)
End If
Case 2
If Led_nr > 0 Then Decr Led_nr
If Old_val <> Led_nr Then
Old_val = Led_nr
Speed = 127 - Led_nr
Speed = Szybkosc
Shift Speed , Left , 1
M = Memcopy(led_nr , Pwm_led(4) , 1 )
End If
Bit_1 = 1
End Select
End If
Loop
'************ Przerwanie timer 0 ***************
'***********************************************
Int0_isr:
Incr Licznik
If Licznik = 100 Then Licznik = 0
If Licznik < Pwm_led(1) Then Set D1 Else Reset D1
If Licznik < Pwm_led(2) Then Set D2 Else Reset D2
If Licznik < Pwm_led(3) Then Set D3 Else Reset D3
If Licznik < Pwm_led(4) Then Set D4 Else Reset D4
If Speed > 0 Then Decr Speed
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
Dim Adc_read As Word
Dim Result As byte
Adc_read = Getadc(0)
Result = Adc_read/4
Nie użyłem tu przesunięcia bitowego a usprawniłoby sprawę
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
Dim Adc_read As Word
Dim Result As Byte
pytanie jeszcze odnośnie tego fragmentu
If Led_nr = 100 Then
Incr Result
Waitms 100
If Result > Adc_read Then
Result = 0
Scenario = 2
End If
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