No i następnej sprawy nie rozumiem.
Dlaczego ten licznik liczy do 99999 a nie "po bożemu" do 65535?
Przynajmniej tak się wyświetla.
I z 1000 przy decr "zmniejsza" się na 9999?
[b]
Dlaczego ten licznik liczy do 99999 a nie "po bożemu" do 65535?
Przynajmniej tak się wyświetla.
I z 1000 przy decr "zmniejsza" się na 9999?
'Program do sterowania małych silników krokowych za pomocą ATMega8 i układu L6219 lub LB1845
'sterowanie ćwierćrokowe, zasilanie 30V
'set i reset zastosowałem w celach poglądowych- można- a nawet należy zastąpić to np.PortB=&B00001100 itp.
$regfile "m8def.dat"
$crystal = 4915200
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5
Ddrb = &HFF
sei
Config Timer0 = Timer , Prescale = 8 ' teraz da ok. 0.417us- ale może skrócić
Enable Ovf0
On Ovf0 Step_delay
Config Portd = Input
Set Portd.2
'Config Pind.4 = Output
'Config Debounce = 1800
Dim Kier As Byte
Dim Temp0 As Byte
Dim Opoznienie_odczytu As Byte
Ph1 Alias Portb.0 'kierunek przepływu prądu w uzwojeniu Ph1
Ph2 Alias Portb.1 'kierunek przepływu prądu w uzwojeniu Ph2
I01 Alias Portb.2 'napięcie dostarczane do uzwojeń- 1 , 2/3 lub 1/3 Imax
I11 Alias Portb.3
I02 Alias Portb.4
I12 Alias Portb.5
Set I01 ' na początek ustawiamy mały prąd
Set I11
Set I02
Set I12
Dim Next_step As Byte
Next_step = 0
Dim Flaga As Byte
Flaga = 0
Dim Liczba_krokow As Word
Liczba_krokow = 0
Kier = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "ustal kierunek "
Do
If Flaga = 1 Then 'gdy jest przerwanie od Timer0- co 237us
If Pind.2 = 0 Then 'i jest wciśnięty przycisk PIND.2
Incr Opoznienie_odczytu 'no bo przycisk ma drgania dłużej niż 237us- niech zwiększy
'to sprawdzanie powtórne do 17ms
If Opoznienie_odczytu >= 70 Then 'dajmy mu na wygaszenie drgań 17ms
If Temp0 = 0 Then ' i jest zezwolenie na zmianę stanu
Gosub Ustawianie
Temp0 = 1 ' zablokuj zezwolenie na zmianę stanu
End If
Opoznienie_odczytu = 0 'Jak już ustawił kierunek to pozwolimy mu liczyć od początku-
'po powtórnym naciśnięciu PIND.2
End If
Else
Temp0 = 0 'zezwalaj na zmiany
Opoznienie_odczytu = 0
End If
If Kier = 1 Then
Gosub Kier_prawo
End If
If Kier = 2 Or Kier = 0 Then
Gosub Kier_stop
End If
If Kier = 3 Then
Gosub Kier_lewo
End If
Flaga = 0
'Toggle Portd.4 'to jest tylko do pomiaru
End If
'If Pind.3 = 0 Then
Debounce Pind.3 , 0 , Ustaw_liczba_krokow
'End If
Loop
End
Step_delay:
Timer0 = 90 '110 'no to skracamy- ten silnik się jeszcze kręci- ale na jakimś innym moze to trzeba zmienić
'tu jest ok.237us obliczone a 248us zmierzone- procesor jednak coś wolno liczy
Flaga = 1
Incr Next_step
If Next_step >= 16 Then
Next_step = 0
End If
Return
Ustawianie:
Select Case Kier
Case 0
Locate 1 , 1
Lcd "kierunek- lewo " ; Kier
Case 1
Locate 1 , 1
Lcd "kierunek- stop " ; Kier
Case 2
Locate 1 , 1
Lcd "kierunek- praw " ; Kier
Case 3
Locate 1 , 1
Lcd "kierunek- stop " ; Kier
End Select
Incr Kier
If Kier >= 4 Then
Kier = 0
End If
Return
Kier_prawo:
'Incr Liczba_krokow
Select Case Next_step
Case 0
Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
Case 1
Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
Case 2
Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 3
Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 4
Set Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
Case 5
Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 6
Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 7
Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
Case 8
Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
Case 9
Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
Case 10
Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 11
Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 12
Reset Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
Case 13
Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 14
Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 15
Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
End Select
Return
Kier_lewo:
'Incr Liczba_krokow
Select Case Next_step
Case 0
Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
Case 1
Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
Case 2
Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 3
Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 4
Set Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
Case 5
Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 6
Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 7
Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
Case 8
Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
Case 9
Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
Case 10
Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 11
Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 12
Reset Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
Case 13
Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 14
Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 15
Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
End Select
Return
Kier_stop: 'stop ma zachować aktualne położenie wirnika
Return
Ustaw_liczba_krokow: [b]'tu się zaczyna problem[/b]
Cls
Lcd "liczba krokow:"
Do
If Pind.5 = 0 Then
Waitms 20
If Pind.5 = 0 Then
Incr Liczba_krokow
Waitms 1
If Liczba_krokow >= 65535 Then 'i tu rośnie do 99999 a potem zmienia się na 10000
Liczba_krokow = 65535
End If
'Lowerline
Locate 2 , 2
Lcd "-> " ; Liczba_krokow
End If
End If
If Pind.6 = 0 Then
Waitms 20
If Pind.6 = 0 Then
Decr Liczba_krokow
Waitms 1
If Liczba_krokow <= 0 Then 'a tu maleje z 10000 na 99999
Liczba_krokow = 0
End If
'Lowerline
Locate 2 , 2
Lcd "<- " ; Liczba_krokow
End If
End If
Debounce Pind.4 , 0 , Kier_stop
Loop
Return