Bascom Osso chodzi??? długie

Oct 20, 2005 3 Replies

Witam postanowilem sie troszke pobawic w bascomie51 ale zwykle pisze w asm i zatrzymałem sie na poważnym problemie niestety... jest sobie przerwanie



Przerwanie_t1: Load Timer1 , 65534 If Licznik_klaw = 12 Then



Licznik_klaw = 0 Stop Timer0 Disable Timer1 Enable Int0 Enable Int1 Set P3.2 Set P3.3 Else Incr Licznik_klaw End If Return



na słowie "Return" program stoi bardzo długo (sprawdzilem na symylatorze) pare tysiecy cykli maszynowych



moje pytanie co robie źle? bo czekanie w obsłudze przerwania pare tys cykli to jest niedopuszczalne i bezsensowne



oto cały program:



$crystal = 4194000 Set Tcon.0 Set Tcon.2 On Int0 Przerwanie_int0 On Int1 Przerwanie_int1 On Timer0 Przerwanie_t0 On Timer1 Przerwanie_t1 Config Timer0 = Timer , Gate = Internal , Mode = 1 Config Timer1 = Timer , Gate = Internal , Mode = 1 Dim A As Byte Dim Licznik_klaw As Byte Dim Licznik_podprogramu As Byte Declare Sub Demko0 Declare Sub Demko1 Declare Sub Demko2 Declare Sub Demko3 Declare Sub Demko4



Enable Int0 Enable Int1 Enable Interrupts



A = 255 P1 = 0 Licznik_podprogramu = 0 Licznik_klaw = 0 Do Select Case Licznik_podprogramu Case 0 : Call Demko0 Case 1 : Call Demko1 Case 2 : Call Demko2 Case 3 : Call Demko3 Case 4 : Call Demko4 End Select



Loop



Przerwanie_int0: Disable Int0 Load Timer1 , 65534 Start Timer1 Disable Int1



Enable Timer1



A = A - 20



Return


Przerwanie_t1: Load Timer1 , 65534 If Licznik_klaw = 12 Then



Licznik_klaw = 0 Stop Timer0 Disable Timer1 Enable Int0 Enable Int1 Set P3.2 Set P3.3 Else Incr Licznik_klaw End If Return



Przerwanie_int1: Disable Int1 Load Timer1 , 65534 Start Timer1



Disable Int0 Enable Timer1 Incr Licznik_podprogramu If Licznik_podprogramu = 5 Then Licznik_podprogramu = 0 End If



Return


Przerwanie_t0:



Return



Sub Demko0 anl p1,#00000001b Waitms A cpl p1.0 End Sub



Sub Demko1 anl p1,#00000010b Waitms A cpl p1.1 End Sub



Sub Demko2 anl p1,#00000100b Waitms A cpl p1.2 End Sub



Sub Demko3 anl p1,#00001000b Waitms A cpl p1.3 End Sub



Sub Demko4 anl p1,#00010000b Waitms A cpl p1.4 End Sub



End



Pozdrawiam AzaZeL



Bylo jakies slowo kluczowe ktore pozwalalo na 'szybkie' obslurzenie przerywania w symulatorze. Zobacz w helpie. Cos takiego jak $sim czy cos...

pozdr. LB

ale tu nie chodzi o symulator tylko o układ działajacy jeżeli w praktyce w przerwaniu siedzi tyle czasu a chyba tak jest bo mi sie dzwine rzeczy dzieja to to jest jakas paranoja....

AzaZeL

AzaZeL <AzaZeL snipped-for-privacy@poczta.onet.pl> napisał(a):

Witaj :) To nie jest "jakaś paranoja" tylko ... niedokładna znajomość środowiska Bascom8051 :( Twoje przerwanie od T1 wykonuje się w ~100 cyklach , ale ... . Załóżmy , że w poniższym przykładzie przy wykonywaniu się funkcji WAIT, po 100 uS nastąpiło przerwanie od T1: .. Waitms 10 'wykonuj pustą pętlę przez 10 ms cpl P1.0 .. Symulator obsłuży przerwanie , dokończy działanie WAIT(czyli po Return w przerwaniu T1 , jeszcze kilkadziesiąt tyś. cykli do wykonania) i zatrzyma się na kolejnej linii czyli "cpl P1.0".ZaREMuj wszystkie WAIT-y lub użyj dyrektywy "$sim" i dopiero sprawdź.Też się daaaaawno temu , nabrałem na "ten numer" ;-)

Pozdrawiam Piotrek

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required