Timer1, a inne funkcje?


Proszę o podpowiedź, czy jeśli wpiszę jakieś polecenia w główną pętlę programu to timer1 będzie liczyć w czasie wykonywania tych funkcji?Pytam ponieważ jak do tej pory nie spotkałem się z łączeniem funkcji pracujących w tym samym czasie.

Przykładowy program:

$regfile = "m32def.dat"
$crystal = 8000000
 
Config Portd = Output
       Portd = &B11111111
Config Porta = &B11111111
        Porta = &B11111111
Config Portb = &B11111110
        Portb = &B00000000
Config Portc = Output
        Portc = &B11111111
 
 
Config Timer1 = Timer , Prescale = 256
 
On Timer1 Przerwanie
 
Enable Interrupts
 
Enable Timer1
Timer1 = 34286
 
Dim M As Byte , H As Byte
 
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
 
Config Lcd = 16 * 2
 
Do
 
wait 10
toggle portd.0
Loop
 
 
Przerwanie:
Cls
Locate 1 , 3
Lcd H
Locate 1 , 5
Lcd ":"
Locate 1 , 6
Lcd M
 
Timer1 = Timer1 + 34286
 
Incr M
 
If M = 60 Then
Incr H
M = 0
End If
 
If H = 24 And M = 60 Then
M = 0
H = 0
End If
 
Return




Portret użytkownika matrix

Re: Timer1, a inne funkcje?

Nie ma szans żeby timer liczył jak masz instrukcję wait w pętli głównej. Wait zatrzyma działanie całego procka na określony czas.

Portret użytkownika mirley

Re: Bascom

Raczej się z tym i zgodzę.... sprawdzałeś to w praktyce. Wait wstrzyma działanie pętli głównej, gdyż jest to po prostu zamieniane na rozkazy asemblera nop lub coś podobnego. Jak najbardziej w środku wykonywania waita powinien następować skok do obsługi timera.... tak na czystą logikę patrząc.... sprawdźcie to w praktyce

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

Może bez wait 'ów?

A jeśli w pętli głównej nie będzie wait'ów to nieprzerwie liczenia?Jakiej funkcji użyć do "skoku obsługi timera"?Zwykłe gosub wystarczy czy jakieś deklaracje?Czy można zrobić dwa liczniki (timery)-jeden liczy czas bieżący a drugi do np wyłącznika czasowego, a może da się połączyć te dwie funkcje w jednym timerze?

Portret użytkownika mirley

Timery

Ja robię to tak; konfiguruje timer na najmniejszy odcinek czasu jaki jest mi potrzebny, zwykle to 4ms lub 10ms. Następnie w obsłudze timera robię zmienne dzielniki i ustawiam tylko zmienne flagowe, np co 4ms, co 100ms (jak policzy 25 przerwań ) co 1s (jak policzy 10 sekwencji po 25 przerwań) itd. W pętli głównej piszę natomiast:

do

if F_4ms = 1 then
F_4ms = 0
'''jakies instrukcje
end if

if F_100ms = 1 then
F_100ms = 0
'''jakies instrukcje
end if

'itd

loop

program cały czas kręci się w kółko i kiedyś tam następują skoki do przerwania od timera. Jak zostaną policzone odpowiednie ilości przerwań to zmienna np F_100ms zostanie ustawiona na 1 i przy pierwszym lepszym obiegu do loop zostanie wykonany odpowiedni if. Jednocześnie timer znowu będzie liczył jakby w tle impulsy aby po 100ms znowu ustawić flagę F_100ms

generalnie jest to proste. Sama obsługa przerwania timera ma być jak najprostsza i ma zawierać tylko niezbednie potrzebne instrukcje

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

Pusty lcd

Pomagając sobie trochę projektem "prosty sterownik domowy" z tej strony przerobiłem na coś takiego:

$regfile = "m32def.dat"
$crystal = 8000000
 
Config Portd = Output
       Portd = &B11111111
Config Porta = &B11111111
        Porta = &B11111111
Config Portb = &B11111110
        Portb = &B00000000
Config Portc = Output
        Portc = &B11111111
 
 
Config Timer1 = Timer , Prescale = 256
 
 
 
Enable Interrupts
 
Enable Timer1 : On Timer1 Przerwanie
Timer1 = 34286
 
Dim M As Byte , H As Byte , Flaga_1s As Bit , F_1 As Byte , Dzielnik(1) As Byte
F_1 = 0
 
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
 
Config Lcd = 16 * 2
 
Do
 
 
 
If Flaga_1s = 1 Then
Flaga_1s = 0
Cls
 
Locate 1 , 3
Lcd H
Locate 1 , 5
Lcd ":"
Locate 1 , 6
Lcd M
 
Toggle Portc.6
Wait 1
End If
 
Loop
End
 
 
Przerwanie:
 
 
Timer1 = Timer1 + 34286
 
 
Incr Dzielnik(1)
If Dzielnik(1) = 1 Then
Dzielnik(1) = 0
Set Flaga_1s
End If
 
Incr M
 
If M = 60 Then
Incr H
M = 0
End If
 
If H = 24 And M = 60 Then
M = 0
H = 0
End If
 
Return

Program odlicza tochę za szybko tzn spieszy 3 sek na min.Mam jeszcze jeden program z użyciem config clock który zaś liczy za szybko o 15sek na min.Kolejny ważny problem to jest zbyt częste odświeżanie lcd przez co nie widać dolnej linii wyświetlacza a gurna to tak średnio i miga.Dzięki za dotychczasowe rady i jednocześnie proszę o wskazanie błędu w moim programie.

Oto drugi program:

$regfile = "m32def.dat"
$crystal = 8000000
 
Config Portd = Output
       Portd = &B11111111
Config Porta = &B11111111
        Porta = &B11111111
Config Portb = &B11111110
        Portb = &B00000000
Config Portc = Output
        Portc = &B11111111
 
 
 
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
 
Config Lcd = 16 * 2
 
 
 
 
 
Enable Interrupts
 
 
Config Clock = Soft                  
 
 
Config Date = MDY , Separator = /
 
 
Date$ = "00/00/00"
Time$ = "00:00:00"
 
 
Cls
 
Do
 
  Cls
  Lcd Time$                                                
  Lowerline
  Lcd Date$                                                 
 
Loop
 
End

Portret użytkownika matrix

Re: Timer1, a inne funkcje?

Biorąc na chłopski rozum działanie programu z wait'em i z przerwaniem to myślę tak:
Nawet jeśli podczas działania instrukcji wait procek skoczy do przerwania to i tak wróci w to samo miejsce skąd skoczył. Wyobraźmy sobie sytuację kiedy procek skacze do przerwania w połowie wait 1. Po powrocie z przerwania odliczy resztę tego waita gdzie skończył czyli pół sekundy.

Portret użytkownika zan

Próbowałem bez wait'ów i to

Próbowałem bez wait'ów i to samo, z tym że w drugim programie (tym z config clock)lepiej jest z waitem bo wyświetlacz ładnie świeci i nie miga.Może to wina ustawień fusebitów?Muszę dodać że procek działa na wbudowanym rezonatorze 8mHz.

Portret użytkownika zan

Timer1 śpieszy 3sek/min?

Czy może ktoś wie czemu w moim programie timer1 śpieszy 3sek/min?

Oto fragmenty programu:

'......................................
Dim S As Byte
Config Timer1 = Timer , Prescale = 256
 
Enable Timer1 : On Timer1 Przerwanie
Timer1 = 34286
Enable Interrupts

Locate 1 , 12
Lcd S

  Przerwanie:
 
 
Timer1 = Timer1 + 34286
 
Incr S
 
 
'.................................

Portret użytkownika mirley

Re: Timer

Ma to być tak napisane:

'......................................
Dim S As Byte
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Przerwanie    'tutaj bez timer= ileś
Enable Interrupts
 
Locate 1 , 12
Lcd S
 
 
 
Przerwanie:
Timer1 = 34286     'po cot ten timer = timer1 + ileś
 
Incr S
 
 
'..................

teraz powinno działać dobrze z dokłądnością rezonatora wewnętrznego, która jest kiepska. Przełącz się na kwarc 8MHz i porównaj działanie.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

timer

Mirley, zmieniłem w programie tak jak pisałeś oraz zmieniłem na zewnętrzny rc 8mhz i dalej śpieszy 3sek/min.Może źle ustawiłem fuse bity?Jak powinny wyglądać odpowiednio ustawione fuse bity?

Portret użytkownika mirley

Sprawdź te

Sprawdź te files/ART_fuseM16_04B.gif. Sprawdzałeś na zewnętrznym kwarcu 8MHz? Wrzuć kod dokładnie ten na którym to testujesz

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

Mirley, link który podałeś

Mirley, link który podałeś niedziała.Podpięty jest zewnętrzny 8mhz.
A oto dokładny program na którym testuję.Wszystko działa tak jak chciałem tylko ten timer śpieszy więc narazie w ustawieniach zapisane jest zliczanie 63sek zamiast 60 aby wyrównać błąd.

$regfile = "m32def.dat"                                     ' generated. Take care that the chip supports all fuse bytes.$regfile = "m32def.dat"
$crystal = 8000000
 
 
Config Porta = &B00111111                                   ''''''''''''''''''''''''''''''''''''''''''''
        Porta = &B11111111                                  '  '''''''''''''''''''''''''''''''''''''''''' '  ''   '   '    ''  '       ''    ' '  '' ' '' ' '' '
                                             '              ' '                                '' '''
Config Portb = &B11111110                                   '''                                '''
        Portb = &B11111111                                  ''' kod do pilota uniwersalnego 175'''
                                             '              ' '                                 '''''
Config Portc = Input                                        ''                                 '''
        Portc = &B11111111                                  '''''''''''''''''''''''''''''''''''''''''
                                                            '''''''''''''''''''''''''''''''''''''''''''
Config Portd = &B00000111
        Portd = &B11111111
Config Rc5 = Pinb.0
 
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
 
Config Lcd = 16 * 2
Config Timer1 = Timer , Prescale = 256
 
 
 
 
 
Enable Timer1 : On Timer1 Przerwanie
 
 
Dim S As Byte , M As Byte , H As Byte , D As Byte , Dt As Byte , Mies As Byte , Rok As Byte
Dim Czek10m As Single , Czek20m As Single , Czekaj3 As Single , Czek30m As Single , Czek60m As Single,
Dim Sss As Byte , Czekgrza As Single , Czekpompa As Byte
Dim Wll As Byte , Wyy As Byte , 4s As Byte , Pompa As Byte
 
S = 0
M = 0
H = 1
D = 1
Mies = 1
Rok = 0
Dt = 1
 
 
 
Wll = 0
Wyy = 0
Czek10m = 0
Czek20m = 0
Czek30m = 0
Czek60m = 0
Czekpompa = 0
Czekgrza = 0
Pompa = 0
 
Dim Komenda As Byte , Adres As Byte
Dim W As Single
Dim E As Single
Dim R As Single
 
W = 0
E = 0
R = 0
Enable Interrupts
 
Cursor Off
 
Do
Readeeprom S , 1
Readeeprom M , 2
Readeeprom H , 3
Readeeprom D , 4
Readeeprom Mies , 5
Readeeprom Rok , 6
Readeeprom Dt , 7
 
 
Goto Panel
 
Loop
                                                           :
End
 
 
 
Panel:
 
Deflcdchar 6 , 4 , 12 , 4 , 4 , 4 , 4 , 5 , 32              ' replace ? with number (0-7)
Cls
Lcd "System xenix v 1"
Locate 1 , 15
Lcd Chr(6)
Wait 3
Lowerline
Lcd "Loading"
Wait 1
Goto Pasek
 
 
Goto Menu
 
 
Pasek:
Deflcdchar 5 , 32 , 31 , 31 , 31 , 31 , 31 , 31 , 32        ' replace ? with number (0-7)
Deflcdchar 4 , 32 , 30 , 30 , 30 , 30 , 30 , 30 , 32        ' replace ? with number (0-7)
Deflcdchar 3 , 32 , 28 , 28 , 28 , 28 , 28 , 28 , 32        ' replace ? with number (0-7)
Deflcdchar 2 , 32 , 24 , 24 , 24 , 24 , 24 , 24 , 32        ' replace ? with number (0-7)
Deflcdchar 1 , 32 , 16 , 16 , 16 , 16 , 16 , 16 , 32        ' replace ? with number (0-7)
Deflcdchar 6 , 4 , 12 , 4 , 4 , 4 , 4 , 5 , 32              ' replace ? with number (0-7)
 
Locate 2 , 9
Lcd Chr(1)
Waitms 50
Locate 2 , 9
Lcd Chr(2)
Waitms 50
Locate 2 , 9
Lcd Chr(3)
Waitms 50
Locate 2 , 9
Lcd Chr(4)
Waitms 50
Locate 2 , 9
Lcd Chr(5)
Waitms 50
Locate 2 , 10
Lcd Chr(1)
 Waitms 50
Locate 2 , 10
Lcd Chr(2)
    Waitms 50
Locate 2 , 10
Lcd Chr(3)
        Waitms 50
Locate 2 , 10
Lcd Chr(4)
        Waitms 50
Locate 2 , 10
Lcd Chr(5)
          Waitms 50
Locate 2 , 11
Lcd Chr(1)
        Waitms 50
Locate 2 , 11
Lcd Chr(2)
        Waitms 50
Locate 2 , 11
Lcd Chr(3)
        Waitms 50
Locate 2 , 11
Lcd Chr(4)
        Waitms 50
Locate 2 , 11
Lcd Chr(5)
        Waitms 50
Locate 2 , 12
Lcd Chr(1)
       Waitms 50
Locate 2 , 12
Lcd Chr(2)
        Waitms 50
Locate 2 , 12
Lcd Chr(3)
        Waitms 50
Locate 2 , 12
Lcd Chr(4)
        Waitms 50
Locate 2 , 12
Lcd Chr(5)
        Waitms 50
Locate 2 , 13
Lcd Chr(1)
        Waitms 50
Locate 2 , 13
Lcd Chr(2)
        Waitms 50
Locate 2 , 13
Lcd Chr(3)
        Waitms 50
Locate 2 , 13
Lcd Chr(4)
        Waitms 50
Locate 2 , 13
Lcd Chr(5)
        Waitms 50
Locate 2 , 14
Lcd Chr(1)
        Waitms 50
Locate 2 , 14
Lcd Chr(2)
         Waitms 50
Locate 2 , 14
Lcd Chr(3)
        Waitms 50
Locate 2 , 14
Lcd Chr(4)
        Waitms 50
Locate 2 , 14
Lcd Chr(5)
        Waitms 50
Locate 2 , 15
Lcd Chr(1)
        Waitms 50
Locate 2 , 15
Lcd Chr(2)
        Waitms 50
Locate 2 , 15
Lcd Chr(3)
        Waitms 50
Locate 2 , 15
Lcd Chr(4)
        Waitms 50
Locate 2 , 15
Lcd Chr(5)
Wait 1
 
Cls
Goto Menu
Return
 
Menu:
4s = 0
Cls
Lcd "      Menu"
Do
If 4s = 4 Then Goto Wdd
Loop
 
 
 
Wdd:
Komenda = 0
Do
For Sss = 1 To 1
Do
Deflcdchar 7 , 32 , 32 , 4 , 8 , 31 , 8 , 4 , 32            ' replace ? with number (0-7)
Cls
Lcd "Wl. szyfrowy"
Locate 1 , 14
Lcd Chr(7)
Locate 2 , 1
Lcd "Wl./wyl."
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
                                                 '
                                                '                                                     '
If Pina.6 = 0 Or Komenda = 33 Then Goto Wc
 
If Pina.7 = 0 Or Komenda = 32 Then Goto Czas
 
If Pinc.1 = 0 Or Komenda = 16 Then
4s = 0
Cls
Lcd "Prosze podac kod"                                      '
Locate 2 , 5                                                '
Lcd "dostempu"                                              '
Do
If 4s = 4 Then
Cls
Goto Wddd
End If
Loop
End If
Loop
Next Sss
Loop
 
 
Wddd:
Komenda = 0
 
 
 
 
Do
Locate 1 , 4
Lcd "<"
Locate 1 , 12
Lcd ">"
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
 
If Pinc.4 = 0 Or Komenda = 1 Then Goto 1
 
If Pinc.0 = 0 Or Komenda = 2 Then Goto 2
 
If Pind.4 = 0 Or Komenda = 3 Then Goto 3
 
If Pinc.2 = 0 Or Komenda = 4 Then Goto 4
 
If Pind.7 = 0 Or Komenda = 5 Then Goto 5
 
If Pinc.5 = 0 Or Komenda = 6 Then Goto 6
 
If Pinc.3 = 0 Or Komenda = 7 Then Goto 7
 
If Pind.3 = 0 Or Komenda = 8 Then Goto 8
 
If Pind.6 = 0 Or Komenda = 9 Then Goto 9
 
If Pind.5 = 0 Or Komenda = 0 Then Goto 0
 
If Pinc.1 = 0 Or Komenda = 13 Then Goto Klucz
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Back
 
'        Debounce Pinc.6 , 0 , Back , Sub
'Debounce Pinc.5 , 0 , 6 , Sub
'Debounce Pinc.4 , 0 , 1 , Sub
'Debounce Pinc.3 , 0 , 7 , Sub
'Debounce Pinc.2 , 0 , 4 , Sub
'Debounce Pinc.1 , 0 , Klucz , Sub
'Debounce Pinc.0 , 0 , 2 , Sub
'Debounce Pind.7 , 0 , 5 , Sub
'Debounce Pind.6 , 0 , 9 , Sub
'Debounce Pind.5 , 0 , 0 , Sub
'Debounce Pind.4 , 0 , 3 , Sub
'Debounce Pind.3 , 0 , 8 , Sub
 
 
 
Loop
Return
 
 
 
 
 
 
 
Zle:
 4s = 0
Cls
 
Lcd "!!!Kod dostepu!!"
Lowerline
Lcd "!NIE PRAWIDLOWY!"
Do
If 4s = 4 Then
W = 0
E = 0
R = 0
Cls
Goto Wddd
Loop
End If
 
Return
 
Powit:
4s = 0
Cls
Locate 1 , 1
Lcd "Witam w rezyden-"
Locate 2 , 1
Lcd "cji prez. Adama!"
Do
If 4s = 4 Then
Portd.2 = 0
E = 0
W = 0
R = 0
Cls
Goto Menu
End If
Loop
Return
 
 
Powits:
4s = 0
Cls
Locate 1 , 1
Lcd "Witam prezesa   "
Locate 2 , 1
Lcd "Adama!"
Do
If 4s = 4 Then
Gosub Pasek
Portd.2 = 0
E = 0
W = 0
R = 0
Cls
Goto Menu
End If
Loop
 
Return
 
 
Kodcyf:
If E = 1 Then
Locate 1 , 5
Lcd "X"
End If
 
If E = 2 Then
Locate 1 , 6
Lcd "X"
End If
 
If E = 3 Then
Locate 1 , 7
Lcd "X"
End If
 
If E = 4 Then
Locate 1 , 8
Lcd "X"
End If
 
If E = 5 Then
Locate 1 , 9
Lcd "X"
End If
 
If E = 6 Then
Locate 1 , 10
Lcd "X"
End If
 
If E = 7 Then
Locate 1 , 11
Lcd "X"
End If
Goto Wddd
Return
 
 
Back:
E = 0
W = 0
R = 0
Cls
Goto Wddd
Return
 
6:
 
R = R - 0.999931332
R = R / 4
Incr W
Incr E
Gosub Kodcyf
 
Return
 
 
1:
W = W * 33
Incr E
Gosub Kodcyf
 
Return
 
 
 
 
7:
Incr R
W = W ^ 2
Incr E
Gosub Kodcyf
 
Return
 
 
 
 
4:
R = R / 2
If W = 1088.999023437 Then W = 1089
W = W / 9
Incr E
Gosub Kodcyf
 
Return
 
 
2:
R = R - 6
W = W - 100
Incr E
Gosub Kodcyf
 
Return
 
 
 
5:
R = R * 18
Incr E
Gosub Kodcyf
 
Return
 
 
 
 
9:
R = R ^ 4
Incr E
Gosub Kodcyf
 
Return
 
 
 
 
 
 
Klucz:
R = R - 2
W = W - 20
Incr E
If E = 8 And R = 12 Then
4s = 0
Gosub Powits
End If
 
If E = 7 And W = 2 Then
4s = 0
Gosub Powit
End If
 
If W <> 2 And R <> 12 And E <> 10 Then
4s = 0
Gosub Zle
End If
 
Return
 
 
 
0:
Incr E
 Gosub Kodcyf
 
Return
 
 
 
 
3:
Incr E
Gosub Kodcyf
 
Return
 
 
 
 
 
8:
Incr E
Gosub Kodcyf
 
Return
 
 
 
Wc:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
 
 
 
Cls
Lcd "Wl./wyl."
Locate 1 , 14
Lcd Chr(7)
Lowerline
Lcd "Woda"
 
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
 
If Pina.6 = 0 Or Komenda = 33 Then Goto Woda
 
If Pina.7 = 0 Or Komenda = 32 Then Goto Wdd
 
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto Wl
 
 
 
Loop
Next Sss
Loop
 
 
 
Wl:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "Wl. czasowy"
Locate 1 , 14
Lcd Chr(7)
Lowerline
Lcd "Wyl. czasowy"
 
Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.6 = 0 Or Komenda = 33 Then Goto Wyl
 
If Pina.7 = 0 Or Komenda = 32 Then Goto Wyl
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Wc
 
If Pinc.1 = 0 Or Komenda = 16 Then
Incr Wll
Goto 10mina
End If
 
 
Loop
Next Sss
Loop
Return
 
 
10mina:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
 
Lcd "10min"
Locate 1 , 9
Lcd Chr(7)
Lowerline
Lcd "20min"
 
Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.6 = 0 Or Komenda = 33 Then Goto 20mina
 
If Pina.7 = 0 Or Komenda = 32 Then Goto 60mina
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Wl
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto 10minaa
 
Loop
Next Sss
Loop
 
 
 
10minaa:
Czek10m = 0
If Wll >= 1 Then Portd.1 = 0
 
If Wyy >= 1 Then Portd.1 = 1
 
Do
 
Cls
Lcd " Prosze czekac"
Locate 2 , 6
Lcd "[-"
Locate 2 , 11
Lcd "]"
For Sss = 1 To 2
Do
If Czek10m = 157 Then
Locate 2 , 7
Lcd "--"
End If
 
If Czek10m = 315 Then
Locate 2 , 7
Lcd "---"
End If
 
If Czek10m = 472 Then
Locate 2 , 7
Lcd "----"
End If
 
If Czek10m = 630 Then
Do
If Wll >= 1 Then
Portd.1 = 1
Wll = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
If Wyy >= 1 Then
Portd.1 = 0
Wyy = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
Loop
End If
 
 
 
Loop
Next Sss
Loop
Return
 
 
20mina:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "20min"
Locate 1 , 9
Lcd Chr(7)
Lowerline
Lcd "30min"
 
Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.6 = 0 Or Komenda = 33 Then Goto 30mina
 
If Pina.7 = 0 Or Komenda = 32 Then Goto 10mina
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Wl
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto 20minaa
 
 
Loop
Next Sss
Loop
 
20minaa:
Czek20m = 0
If Wll >= 1 Then Portd.1 = 0
 
If Wyy >= 1 Then Portd.1 = 1
 
 
Do
 
Cls
Lcd " Prosze czekac"
Locate 2 , 6
Lcd "[-"
Locate 2 , 11
Lcd "]"
For Sss = 1 To 2
Do
If Czek20m = 315 Then
Locate 2 , 7
Lcd "--"
End If
 
If Czek20m = 630 Then
Locate 2 , 7
Lcd "---"
End If
 
If Czek20m = 945 Then
Locate 2 , 7
Lcd "----"
End If
 
If Czek20m = 1260 Then
Do
If Wll >= 1 Then
Portd.1 = 1
Wll = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
If Wyy >= 1 Then
Portd.1 = 0
Wyy = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
Loop
End If
 
Loop
Next Sss
Loop
Return
 
 
30mina:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "30min"
Locate 1 , 9
Lcd Chr(7)
Lowerline
Lcd "60min"
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.6 = 0 Or Komenda = 33 Then Goto 60mina
 
If Pina.7 = 0 Or Komenda = 32 Then Goto 20mina
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Wl
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto 30minaa
 
 
Loop
Next Sss
Loop
 
 
30minaa:
Czek30m = 0
If Wll >= 1 Then Portd.1 = 0
 
If Wyy >= 1 Then Portd.1 = 1
 
 
Do
 
Cls
Lcd " Prosze czekac"
Locate 2 , 6
Lcd "[-"
Locate 2 , 11
Lcd "]"
For Sss = 1 To 2
Do
If Czek30m = 472 Then
Locate 2 , 7
Lcd "--"
End If
 
If Czek30m = 954 Then
Locate 2 , 7
Lcd "---"
End If
 
If Czek30m = 1417 Then
Locate 2 , 7
Lcd "----"
End If
 
If Czek30m = 1890 Then
Do
If Wll >= 1 Then
Portd.1 = 1
Wll = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
If Wyy >= 1 Then
Portd.1 = 0
Wyy = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
Loop
End If
 
 
Loop
Next Sss
Loop
Return
 
 
60mina:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "60min"
Locate 1 , 9
Lcd Chr(7)
Lowerline
Lcd "10min"
 
 
Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.6 = 0 Or Komenda = 33 Then Goto 10mina
 
If Pina.7 = 0 Or Komenda = 32 Then Goto 30mina
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Wl
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto 60minaa
 
 
Loop
Next Sss
Loop
 
60minaa:
Czek60m = 0
If Wll >= 1 Then Portd.1 = 0
 
If Wyy >= 1 Then Portd.1 = 1
 
 
Do
 
Cls
Lcd " Prosze czekac"
Locate 2 , 6
Lcd "[-"
Locate 2 , 11
Lcd "]"
For Sss = 1 To 2
Do
If Czek60m = 945 Then
Locate 2 , 8
Lcd "--"
End If
 
If Czek60m = 1890 Then
Locate 2 , 9
Lcd "---"
End If
 
If Czek60m = 2835 Then
Locate 2 , 10
Lcd "----"
End If
 
If Czek60m = 3780 Then
Do
If Wll >= 1 Then
Portd.1 = 1
Wll = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
 
If Wyy >= 1 Then
Portd.1 = 0
Wyy = 0
Cls
Lcd "Gotowe!"
4s = 0
Do
If 4s = 0 Then Goto Menu
Loop
End If
Loop
End If
 
 
Loop
Next Sss
Loop
Return
 
 
Wyl:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "Wyl. czasowy"
Locate 1 , 14
Lcd Chr(7)
Lowerline
Lcd "Wl. czasowy"
 
Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.6 = 0 Or Komenda = 33 Then Goto Wl
 
If Pina.7 = 0 Or Komenda = 32 Then Goto Wl
 
If Pinc.6 = 0 Or Komenda = 17 Then Goto Wc
 
If Pinc.1 = 0 Or Komenda = 16 Then
Incr Wyy
Goto 10mina
End If
 
Loop
 Next Sss
 Loop
Return
 
 
 
 
 
 
Woda:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
 
 
Lcd "Woda"
Locate 1 , 14
Lcd Chr(7)
Lowerline
Lcd "Godz. data"
 
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
If Pina.6 = 0 Or Komenda = 33 Then Goto Czas
 
If Pina.7 = 0 Or Komenda = 32 Then Goto Wc
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto Wod
 
 
Loop
Next Sss
Loop
 
 
 
Wod:
Czekpompa = 0
Czekgrza = 0
Pompa = 0
Cls
Lcd "Napelnianie"
Lowerline
Lcd "zbiornika..."
Pind.0 = 0
Do
If Czekpompa = 80 And Pompa = 0 Then
Cls
Pind.0 = 1
4s = 0
 Pompa = 1
 Cls
Lcd "Zbiornik pelny"
Pinb.7 = 0
End If
 
If 4s = 4 And Pompa = 1 Then
Cls
Lcd "Ogrzewanie"
Lowerline
Lcd "rozpoczete..."
Czekgrza = 0
Pompa = 2
End If
 
If Czekgrza = 1330 And Pompa = 2 Then
Pinb.7 = 1
Cls
Lcd "Gotowe!"
4s = 0
Pompa = 3
End If
 
If 4s = 4 And Pompa = 3 Then Goto Menu
 
Loop
Return
 
 
Czas:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "Godz. data"
Locate 1 , 14
Lcd Chr(7)
Lowerline
Lcd "Wl. szyfrowy"
 
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
If Pina.6 = 0 Or Komenda = 33 Then Goto Wdd
 
If Pina.7 = 0 Or Komenda = 32 Then Goto Woda
 
If Pinc.1 = 0 Or Komenda = 16 Then Goto Cza
 
 
Loop
Next Sss
Loop
 
Return
Cza:
Komenda = 0
 
Do
For Sss = 1 To 2
Do
Cls
Lcd "Czas"
Locate 1 , 6
Lcd H
Locate 1 , 8
Lcd ":"
Locate 1 , 9
Lcd M
Locate 1 , 11
Lcd ":"
Locate 1 , 12
Lcd S
Lowerline
Locate 2 , 6
Lcd D
Locate 2 , 8
Lcd "/"
Locate 2 , 9
Lcd Mies
Locate 2 , 11
Lcd "/"
Locate 2 , 12
Lcd Rok
 
If Dt = 1 Then
Locate 2 , 1
Lcd "Pon"
End If
 
If Dt = 2 Then
Locate 2 , 1
Lcd "Wt"
End If
 
If Dt = 3 Then
Locate 2 , 1
Lcd "Sr"
End If
 
If Dt = 4 Then
Locate 2 , 1
Lcd "Czw"
End If
 
If Dt = 5 Then
Locate 2 , 1
Lcd "Pt"
End If
 
If Dt = 6 Then
Locate 2 , 1
Lcd "Sob"
End If
 
If Dt = 7 Then
Locate 2 , 1
Lcd "Ndz"
End If
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
 
 
 
If Pinc.4 = 0 Or Komenda = 1 Then Goto Sekunda
 
 
If Pinc.1 = 0 Or Komenda = 2 Then Goto Minuta
 
 
If Pind.4 = 0 Or Komenda = 3 Then Goto Godzina
 
 
If Pinc.2 = 0 Or Komenda = 4 Then Goto Dzien
 
 
If Pind.7 = 0 Or Komenda = 5 Then Goto Miesiac
 
 
If Pinc.5 = 0 Or Komenda = 6 Then Goto Rokk
 
 
If Pinc.3 = 0 Or Komenda = 7 Then Goto Dtyg
 
 
If Pinc.6 = 0 Or Komenda = 17 Then
Writeeeprom S , 1
Writeeeprom M , 2
Writeeeprom H , 3
Writeeeprom D , 4
Writeeeprom Mies , 5
Writeeeprom Rok , 6
Writeeeprom Dt , 7
Goto Czas
 
 
 
 
End If
 
 
Loop
Next Sss
Loop
Return
 
 
Sekunda:
Komenda = 0
 
Do
 
 
Locate 1 , 12
Lcd S
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.7 = 0 Or Komenda = 32 Then S = 0
If Pina.6 = 0 Or Komenda = 33 Then S = 0
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
Minuta:
Komenda = 0
 
Do
 
Locate 1 , 9
Lcd M
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.7 = 0 Or Komenda = 32 Then Incr M
If Pina.6 = 0 Or Komenda = 33 Then M = M -1
If M = 61 Then M = 0
If M = -1 Then M = 60
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
Godzina:
Komenda = 0
 
Do
Locate 1 , 6
Lcd H
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.7 = 0 Or Komenda = 32 Then Incr H
If Pina.6 = 0 Or Komenda = 33 Then H = H -1
If H = 25 Then H = 1
If H = 0 Then H = 24
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
 
Dzien:
Komenda = 0
 
 Do
Locate 2 , 6
Lcd D
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
If Pina.7 = 0 Or Komenda = 32 Then Incr D
If Pina.6 = 0 Or Komenda = 33 Then D = D -1
If D = 32 Then D = 1
If D = 0 Then D = 31
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
 
Miesiac:
Komenda = 0
 
Do
 
Locate 2 , 9
Lcd Mies
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
If Pina.7 = 0 Or Komenda = 32 Then Incr Mies
If Pina.6 = 0 Or Komenda = 33 Then Mies = Mies -1
If Mies = 13 Then Mies = 1
If M = 0 Then Mies = 12
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
Rokk:
Komenda = 0
 
Do
 
Locate 2 , 12
Lcd Rok
 
 
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
If Pina.7 = 0 Or Komenda = 32 Then Incr Rok
If Pina.6 = 0 Or Komenda = 33 Then Rok = Rok -1
If Rok = 100 Then Rok = 0
If Rok = -1 Then Rok = 99
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
 
Dtyg:
Komenda = 0
 
Do
 
 
If Dt = 1 Then
Locate 2 , 1
Lcd "Pon"
End If
 
If Dt = 2 Then
Locate 2 , 1
Lcd "Wt"
End If
 
If Dt = 3 Then
Locate 2 , 1
Lcd "Sr"
End If
 
If Dt = 4 Then
Locate 2 , 1
Lcd "Czw"
End If
 
If Dt = 5 Then
Locate 2 , 1
Lcd "Pt"
End If
 
If Dt = 6 Then
Locate 2 , 1
Lcd "Sob"
End If
 
If Dt = 7 Then
Locate 2 , 1
Lcd "Ndz"
End If
 Getrc5(adres , Komenda)
  Komenda = Komenda And &B01111111
 
If Pina.7 = 0 Or Komenda = 32 Then Incr Dt
If Pina.6 = 0 Or Komenda = 33 Then Dt = Dt -1
If Dt = 8 Then Dt = 1
If Dt = 0 Then Dt = 7
If Pinc.6 = 0 Or Komenda = 17 Then Goto Czas
Loop
Return
 
 
 
 
'******************************************************************************
 
 
 
  Przerwanie:
 
 
Timer1 = 34286
 
Incr S
Incr Czek10m
Incr Czek20m
Incr Czek30m
Incr Czek60m
Incr Czekpompa
Incr Czekgrza
Incr Sss
Incr 4s
 
If Sss = 2 Then Sss = 0
 
If Czek10m = 699 Then Czek10m = 0
 
If Czek20m = 1299 Then Czek20m = 0
 
If Czek30m = 1899 Then Czek30m = 0
 
If Czek60m = 3799 Then Czek60m = 0
 
If Czekpompa = 100 Then Czekpompa = 0
 
If Czekgrza = 1399 Then Czekgrza = 0
 
If 4s = 5 Then 4s = 0
 
 
If S = 64 Then
Incr M
S = 0
End If
 
If M = 60 Then
Incr H
S = 0
M = 0
End If
 
 
 
 
 If Dt = 8 Then Dt = 1
 
 
 
 
If H = 25 And M = 60 Then
Incr D
Incr Dt
S = 0
M = 0
H = 1
End If
 
 If Mies = 1 Then
If D = 32 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 2 Then
If D = 29 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 3 Then
If D = 32 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 4 Then
If D = 31 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 5 Then
If D = 32 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 6 Then
If D = 31 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 7 Then
If D = 32 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 8 Then
If D = 32 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 9 Then
If D = 31 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 10 Then
If D = 32 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 11 Then
If D = 31 Then
Incr Mies
D = 1
S = 0
M = 0
H = 1
End If
End If
If Mies = 12 Then
If D = 32 Then
Mies = 1
D = 1
S = 0
M = 0
H = 1
Incr Rok
End If
End If
 
 
 
 
 
Return

Portret użytkownika zan

Kwarc 12mhz

Pomyślałem sobie że podepne 12mhz i zarówno na 12 jak i na 8mhz aby układ działał muszę ustawić takie fusebity:

a myślałem że "int.rc.osc" ustawia się dla rc wewnętrznego a "ext.rc osc" dla zewnętrznego.
Jednak gdy ustawiłem fusy tak:

to aby układ działał musiałem skorzystać z schematu:

a licznik dalej śpieszy.

Portret użytkownika mirley

Re: Timer

Internal oscylator dotyczy wewnętrznego oscylatora i nie ma znaczenia co jest podłączone na zewnątrz. External to zewnętrzny oscylator, external RC to dokładnie coś takiego jak podłączyłeś.

Pisząc żebyś spróbował na zewnętrznym taktowaniu nie chodziło mi o zewnętrzny Rc bo to jeszcze gorzej działa niż wewnętrzny. Chodziło mi o kwarca 8Mhz +dwa kondensatory.

Poza tym twój program do testowania jest za bardzo skomplikowany. Poza tym już czas nauczyć się robić wcięcia w programie, bo nie da się tego analizować. Przerwanie timera jest za skomplikowane.

Zrób program testowy, który ma tylko przerwanie od timera i proste wyświetlanie, bez reszty zbędnych rzeczy. Pomiń miesiące i dni i resztę zmiennych, które modyfikują się w przerwaniu

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

Zrobiłem testowy

Zrobiłem testowy programik:

$regfile = "m32def.dat"
 
$crystal = 8000000 .
 
Config Porta = &B00111111                                   ''''''''''''''''''''''''''''''''''''''''''''
        Porta = &B11111111                                  '  '''''''''''''''''''''''''''''''''''''''''' '  ''   '   '    ''  '       ''    ' '  '' ' '' ' '' '
                                             '              ' '                                '' '''
Config Portb = &B11111110                                   '''                                '''
        Portb = &B11111111                                  ''' kod do pilota uniwersalnego 175'''
                                             '              ' '                                 '''''
Config Portc = Input                                        ''                                 '''
        Portc = &B11111111                                  '''''''''''''''''''''''''''''''''''''''''
                                                            '''''''''''''''''''''''''''''''''''''''''''
Config Portd = &B00000111
        Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , Rs = Porta.5
 
Config Lcd = 16 * 2
 
Config Timer1 = Timer , Prescale = 256
 
Enable Interrupts
 
Enable Timer1 : On Timer1 Przerwanie
 
Dim S As Byte
 
Do
 
Locate 1 , 4
Lcd S
 
Loop
End
 
 Przerwanie:
 
 
Timer1 = 34286
 
Incr S
If S = 60 Then S = 0
Return

Fusebity:

Zewnętrzny kwarc 8mhz z kondensatorami:

A na wyświetlaczu nic niema, jakby wogule procka niebyło.
Może złe fusebity?

Portret użytkownika mirley

Re: Timery

Jasne że LCD nic nie pokazuje przeciesz wysyłasz do niego dane jak tylko procek może.... nie da się tak szybko. Napisz opóźnienie,np:

Do
 
Locate 1 , 4
Lcd S
waitms 250
waitms 250 
Loop
End

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

No i stała się tragedia.Po

No i stała się tragedia.Po ustawieniu fusebitów moja atmega nie kontaktuje.Próbowałem przełączać na wewn. i zewn. kwarc,podpinałem kwarce jakie tylko miałem ( od 8 do 33mhz) ale bascom atmegi nie widzi, a w dodatku at się grzeje.Czy jest inne rozwiązanie czy aby zresetować fusebity muszę robić FUSEBIT DOCTOR?A może to już jego koniec?Może za dużo razy był programowany(ponad 600razy)?Na elektrodzie ktoś opisywał podobny problem i otrzymał taką odpowiedź:
"A czy grzeje Ci się procek, jeżeli podłączasz do niego zasilanie? Bo jeśli padł, to możliwe jest że nastąpiło nieodwracalne zwarcie w środku i powinien się grzać. Przynajmniej ja tak miałem..."

Portret użytkownika mirley

Re: Procek

Szczerze mówiąc to tak nigdy mi się nie stało żeby procek się grzał. Mógł się uszkodzić ale to tylko przypadkiem..... napewno nie za sprawą programowania 600 razy. Jakby to było 5000 razy to może. Może masz zwarcie na którejś linii wejściowej do masy lub zasilania i temu się nagrzewa

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika zan

Kupiłem nową at32

Kupiłem nową at32 i działa w tym samym programatorze więc o zwarciach niema mowy.Proszę kogoś o podanie dokładnie jak mam ustawić fusebity pod at32 i kwarc 8mhz bo sam niechce już próbować bo zablokuje znowu drógą atmege :(

Portret użytkownika mirley

Re: Fusebity

Fusebity masz w artykule na stronie. Dla M16 i M32 jest tak samo

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.