Bascom - nie działa program

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
ODPOWIEDZ
Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Bascom - nie działa program

Post autor: Spanner » 15 maja 2011, 8:21

Witam, od wczoraj bawię się mikroprocesorową oślą łączką, postanowiłem napisać własny program i napotkałem problem w działaniu. Co prawda wyświetla się zero ale nie reaguje na przyciski. Co zrobiłem nie tak ? Po za tym mam czasem tez taki problem że nie mogę programu wgrać choć jest bez błedów - pojawia się normalnie writing rom ładuje do pięciu kresek i stoi - co jest nie tak?
Pozdrawiam

Kod: Zaznacz cały

Dim Dziesiatki As Byte
Dim Jednostki As Byte
Dim Sek As Byte
Dim Licz As Bit



Config Portb = &B11111111
Portb = &B11111111
Config Portd = &B1111100
Portd = &B1110111
Config Timer0 = Timer , Prescale = 64
On Timer0 Przerwanie
Enable Timer0
Enable Interrupts

Licz = 0
Do
Loop
End
Przerwanie:
Timer0 = 6
If Portd.0 = 0 Then
Licz = 1
If Portd.1 = 0 Then Licz = 0
If Licz = 1 Then
Incr Jednostki
If Jednostki = 25 Then
Jednostki = 0
Incr Dziesiatki
If Dziesiatki = 10 Then
 Dziesiatki = 0
Incr Sek
If Sek = 10 Then
Sek = 0
End If
End If
End If
End If
End If



Portb = Lookup(sek , Tabela)
Return

Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144





Awatar użytkownika
mictronic
-
Posty: 81
Rejestracja: 04 paź 2006, 19:28
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: mictronic » 15 maja 2011, 11:07

Programu nie sprawdzam, widze ze masz problemy z programatorem i to na nim trzeba zwrócić uwage. Co to jest za programator? Jaka wersja BASCOMa? Skonfigurowałeś na pewno jaki używasz programator?

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 15 maja 2011, 12:16

Ten program nigdy nie zadziała prawidłowo. Widać żeś początkujący jesteś, bo ilość błędów jest porażająca.
Wskazówki.
1.Timer przed załadowaniem nowej wartości do niego wskazane by było zatrzymać instrukcją STOP Timer0, a potem po wstawieniu nowej wartości ponownie wystartować START Timer0
2. w podprogramie obsługi przerwania od Timera powinno być jak najmniej instrukcji, a nie cały program jak u ciebie. Czyli ustwienie Timera na nowo, wystartowanie go, ustawienie znacznika programowego i koniec. Reszta powinna robić sie w programie głównym czyli pętli do..loop

Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Post autor: Spanner » 15 maja 2011, 13:21

Mictronic- programator jest właściwie kabelkiem łączącym port LPT z płytką.
Korzystam z takiej płytki - https://elportal.pl/pdf/k10/84_13.pdf
Teraz jakoś udało mi się wgrać gotowy program z kursu, wić przyczyna problemu chyba znikła.
Kayron- tak masz rację jestem początkujący i dlatego właśnie tu piszę żeby znaleźć przyczynę. Wiem że błędy moje mogą być dla Was śmieszne ale trochę wyrozumiałości. Ciekawe czy Wam na początku też wszystko wychodziło.
Staram się iść według kursu MOŁ a tam w wielu programach, np stopera jest pusta nieskończona pętla, a całość programu pod obsługą przerwania.
Czy mógłbyś poprawić mi program albo dać jeszcze jakieś wskazówki bo program dalej odmawia posłuszeństwa.

przykład listingu jednego z ćwiczeń (pusta pętla)

Kod: Zaznacz cały

'C015a      Bardzo prosty stoper 0,1-sekundowy z etykietami
Dim Dziesek As Byte , Sekjed As Byte , Sekdzies As Byte , Minjed As Byte
Dim 100ms As Byte , Ktorywysw As Byte , Licz As Bit
Config Portb = 255 : Portb = &B11111111 : Config Portd = &B1111100 : Portd = &B1111111
Config Timer0 = Timer , Prescale = 64 : Enable Interrupts : Enable Timer0
Dziesek = 0 : Sekjed = 0 : Sekdzies = 0 : Minjed = 0
On Timer0 Co4ms

Do : Loop : End          'to jest główny program - pusta nieskończona pętla

Co4ms:                   'procedura obsługi przerwania od Timera0 wykonywana co 4ms
Timer0 = 6               'załaduj do Timera0,żeby zliczył 250(256-6)impulsów
If Pind.0 = 0 Then Licz = 1       'sprawdź stan S1 i ewentualnie rozpocznij zliczanie czasu
If Pind.1 = 0 Then Licz = 0       'sprawdź stan S2 i ewentualnie zakończ zliczanie czasu
If Licz = 1 Then Gosub Zwiekszlicznik       'tylko wtedy, gdy stoper ma liczyć czas
Gosub Obsluzwyswietlacz  'zawsze co 4ms
Return                   'koniec procedury obsługi przerwania

Zwiekszlicznik:
Incr 100ms               'co 4ms zwiększ wartość licznika o nazwie 100ms
If 100ms = 25 Then       'skróc cykl licznika 100ms właśnie do 100ms
   100ms = 0             'czyli 0,1 sekundy
   Incr Dziesek          'zwiększ stan licznika dziesiatych części sekundy
   If Dziesek = 10 Then  'ten licznik liczy do dziesieciu
      Dziesek = 0        'czyli cykl trwa 1 sekundę
      Incr Sekjed        'co 1 sekundę
      If Sekjed = 10 Then
         Sekjed = 0      'co 10 sekund
         Incr Sekdzies   'zwiększ stan licznika dziesiatek sekund
            If Sekdzies = 6 Then       'liczy do 6 bo minuta ma 60 sekund
               Sekdzies = 0
               Incr Minjed       'co 60 sekund zwiększ stan licznika minut
                  If Minjed = 10 Then Minjed = 0       '0...9 minut
End If : End If : End If : End If : Return

Obsluzwyswietlacz:
Incr Ktorywysw : If Ktorywysw = 4 Then Ktorywysw = 0 : Portd = &B1111111
Select Case Ktorywysw    ' obsługa wyświetlacza
Case 0:                  'wyświetl zawartość licznika jednostek
   Portb = Lookup(dziesek , Tabela) : Portd.3 = 0
Case 1:                  'wyświetl zawartość licznika dziesiątek
   Portb = Lookup(sekjed , Tabela) : Portd.4 = 0 : Portb.7 = 0
Case 2:                  'wyświetl zawartość licznika setek
   Portb = Lookup(sekdzies , Tabela) : Portd.5 = 0
Case 3:                  'wyświetl zawartość licznika tysięcy
   Portb = Lookup(minjed , Tabela) : Portd.6 = 0 : Portb.7 = 0
End Select : Return

Tabela:
Data 192 , 249 , 164 , 176 , 153 , 146 , 

keruseykaryu

Post autor: keruseykaryu » 15 maja 2011, 15:00

kayron pisze:1.Timer przed załadowaniem nowej wartości do niego wskazane by było zatrzymać instrukcją STOP Timer0, a potem po wstawieniu nowej wartości ponownie wystartować START Timer0
Nie trzeba tego robić. Czemu? Bo to proste: prescaler ma podział 64. Jest czasu jak marasu i się licznik równolegle nie zmieni.

Problem z programem jest banalny i przerabiany wiele, wiele, wiele, wiele razy. Zamiast Pin w If wpisałeś Port, a to nie to samo. Kłaniają się podstawy z AVR, które polecam poznać przed napisaniem cokolwiek. No i nie ma debouncera, a to największy błąd.

Spanner
Użytkownik
Posty: 364
Rejestracja: 18 lip 2010, 18:29
Lokalizacja: Bielsko biała

Post autor: Spanner » 15 maja 2011, 15:25

Witam udało mi się uruchomić licznik według twojej Porady, lecz nie wiem dlaczego działa on tylko gdy trzymam przycisk. Jesli nacisnę raz to stan zmiennej licz powinien się na stałe zmienić. Czy dobrzę myślę? co powinienem zrobić by licznik wzrastał po jednorazowym naciśnięciu przycisku?

ODPOWIEDZ