logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Czy INPUTBIN zatrzymyje licznik TIMER0 ?

TomekMus 20 Lis 2009 22:36 1469 8
REKLAMA
  • #1 7287886
    TomekMus
    Poziom 17  
    Witam

    Pytanie 1:
    Zrobiłem coś takiego że jeśli odebrano znak to jest wygenerowane przerwanie Urxc następnie przed instrukcją INPUTBIN uruchamiam przerwanie Timer0 jako licznik czasu który chcę wykorzystać do przeterminowania czasu odebranego znaku.
    bo INPUTBIN B(1), 6 oczekuje na 6 bajtów. Jak wysyłam całe 6bajtów to działa poprawnie, a jeśli bym wysłał np mniej niż 6 to chcę zmienić stan na lini gdzie jest podłączona dioda.

    Pytanie 2:
    Czy komenda enabled timer0 i start timer0 - czymś się różni odnosząc się do użycia polecenia Load Timer0?
    Chodzi mi o to iż jak ładuje Load Timer0 = 125 to jak użyje którejś z tych koment to coś zmiania?



    Enable Interrupts
    
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Przerwanie
    Enable Timer0
    Load Timer0 = 125
    Stop Timer0
    
    Enable Urxc
    On Urxc Odebrano_znak , Nosave
    
    Dim B(6) As Byte
    Dim I As Byte
    Dim Licz_8ms As Byte
    Dim Flaga As Bit
    Const Ile = 6
    
    Reset Flaga
    
    Do
      'to do testów czy dana odebrane są prawidłowe
      If Flaga = 1 Then
        For I = 1 To Ile
          Print I ; ": " ; Chr(b(i))
        Next I
        Reset Flaga
      End If
    Loop
    End
    
    
    Przerwanie:
      Load Timer0 = 125
      Incr Licz_8ms
    
      If Licz_8ms = 125 Then
        Licz_8ms = 0
        Toggle Porte.7 'zmianu stanu lini na której jest podłączona dioda w celu weryfikacji
                            'działania programu 
      End If
    Return
    
    Odebrano_znak:
      Disable Urxc
       Load Timer0 = 125      'Pytanie nr 2 - czy uszę tego użyć?   
       Start Timer0              'czy lepiej Enabled
           Inputbin B(1) , 6
        Stop Timer0              'czy lepiej disabled
        Set Flaga
      Enable Urxc
    Return
  • REKLAMA
  • Pomocny post
    #2 7288553
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 7289942
    TomekMus
    Poziom 17  
    OK Dzięki!

    Lecz mój kod ma gdzieś błąd bo ponieważ powinien działać tak:

    Próba 1:
    Wysyłam 6 bajtów i wszystko jest OK.

    Próba 2:
    Wysyłam np. 5 bajtów i komenda INPUTBIN czeka na ostatni bajt nr.6 i jeśli minie czas oczekiwania czyli odmierza go TIMER0 1s to zostaje zmieniony stan lini z diodą.
    I w obecnej sytuacji nie działa mi to. Gdzie mam błąd?
  • #5 7290626
    TomekMus
    Poziom 17  
    16MHz

    A mam 3 razy bo nie wiem w kt orym miesjcu mam blad
  • REKLAMA
  • #6 7290742
    xury
    Specjalista automatyka domowa
    No to przy 16 Mhz początkowa wartość Timer0 powinna mieć wartość 131 i wtedy otrzymujemy przerwanie dokładnie co 8ms. Dane z "pomocnika AVR"
    Ale to nie istotne. Wydaje mi się, że istotna jest obsługa przerwania od UART, bo jest w niej parametr "NOSAVE" i być może to powoduje problem.
    Taką obsługę stosujemy tylko jeśli chcemy ustawić flagę.
    Co do Load Timer0 to wydaje mi się, że wystarczy tylko raz w podprogramie obsługi UARTa.
    Ale teraz zauważyłem, że nie masz skonfigurowanego pinu e.7 więc może to jest problem ? Wydaje mi się, że to wyjście, a nic o tym nie ma w Twoim programie ?
  • REKLAMA
  • #7 7291445
    TomekMus
    Poziom 17  
    Tak e.7 nie dodałem do listingu na forum ale mam skonfigurowane to akurat to szczegół nie istotny.

    Kombinowałem we wszystkie strony i INPUTBIN x, b - WSTRZYMUJE TIMER0 !!!!!

    Jak ktoś podważa moją teze to proszę dowody nie takie że tak ma być i już tylko dajcie kod taki co zadziała a ja już wiem że nie da się tego zrobić.

    Problem jest taki patrząc na przykład działa ideowo, lecz w praktyce albo AVR nie może w przerwaniu uruchomić drugiego przerwania albo twórcy BASCOM przeoczyli taką możliwość podczas kompilacji.

    Przeczytałem już dwie książki na temat BASCOM i odwiedziłem setki przykładów tak więc taki postawiłem wniosek. :(
  • Pomocny post
    #8 7291994
    xury
    Specjalista automatyka domowa
    No to zrób to inaczej. Zastosuj bufor i sprawdzaj czy w buforze masz 5 bajtów, a po pewnym czasie czy jest 6 bajtów. Dopiero potem je odbieraj przez Inputbin. Oczywiście za pomocą rożnych wyrażeń np. stosując Select Case.
  • #9 7292635
    Konto nie istnieje
    Poziom 1  
REKLAMA