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

[atmega][BASCOM] Zbocze narastające, opadające - długość

00gtw00 03 Mar 2010 10:43 4021 6
REKLAMA
  • #1 7777158
    00gtw00
    Poziom 15  
    Problem typu jak wykonać np zmianę stanu na porcie w momencie kiedy otrzymujemy na INT0 lub INT1 zbocze narastające i zmiana trwa do momentu kiedy pojawi się zbocze opadające.

    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Pinb.0 = 1 : Portb.0 = 0
    Config Pinb.1 = 1 : Portb.1 = 0
    Config Pinb.2 = 1 : Portb.2 = 0
    Config Pinb.3 = 1 : Portb.3 = 0
    Dim Licznik As Byte
    Enable Interrupts
    Enable Int1
    Config Int1 = Rising
    On Int1 Przerywanie
    Do
    Portb = &B00000000
    Loop
    End
    
    Przerywanie:
             Portb = &B00001111
             Licznik = Licznik + 1
             '>>>PORT MA STAN &B00001111 DOPÓKI NIE NADEJDZIE ZBOCZE OPADAJACE, JAK TO NAPISAC?<<<
             Return
  • REKLAMA
  • #2 7777249
    Dawid_20
    Poziom 17  
    Nie wiem jak to w bascomie nie wnikałem w kod, ale można to zrobić tak że deklarujesz aktywację przerwania jednym zboczem, a po jego wywołaniu zmieniasz tą konfigurację na drugie zbocze (zmiana w rejestrze MCUCR). Albo wywołanie przerwania ustawiasz na dowolną zmianę sygnału i w jakiejś zmiennej przechowujesz stan wcześniejszy i porównujesz
  • REKLAMA
  • #3 7777809
    M. S.
    Poziom 34  
    Najprościej będzie tak:


    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Config Pinb.0 = 1 : Portb.0 = 0
    Config Pinb.1 = 1 : Portb.1 = 0
    Config Pinb.2 = 1 : Portb.2 = 0
    Config Pinb.3 = 1 : Portb.3 = 0
    Dim Licznik As Byte
    Enable Interrupts
    Enable Int1
    Config Int1 = Rising
    On Int1 Przerywanie
    Do
    Portb = &B00000000
    Loop
    End
    
    Przerywanie:
             Portb = &B00001111
             Licznik = Licznik + 1
             Do: Loop Until Pind.3 = 0 'Niestety zatrzymuje to wyjście z obsługi 'przerwania
             Return


    Można też użyć instrukcji BITWAIT bit , SET | RESET z tym samym skutkiem
  • REKLAMA
  • #4 7780118
    janbernat
    Poziom 38  
    W Przerywanie: można wstawić (Chyba) config Int1= falling.
    A potem zmieniać na Rising.
    Ale w głównej pętli stan portb będzie stale kasowany do 0.
    Tak że trzeba by chyba zrobić zmienne temp_0 i temp_1 i podstawiać do Portb.
  • REKLAMA
  • #5 7780791
    00gtw00
    Poziom 15  
    Może przybliżę bardziej zastosowanie. Chodzi mi o program sterujący silnikiem krokowym (w założeniu unipolarnym) z progrmów typu mach3, step2cnc, turbocnc.
    Programy te jak wiadomo podają przez port LPT step i dir. Step czyli krok można wykorzystać jako sterowanie przerywaniem int1 w naszej atmedze. Natomiast dir określa kierunek i przyjmuje stan niski bądź wysoki odpowiadający obrotom.

    To co nasrkobałem po podpowiedziach ale nie działające. Silnik w Step2CNC w zależności od obrotów zmienia to wydawanego dźwięku. W Mach3 rusza na trybie ręcznym przy niskich obrotach:
    Pina.0 to wejście linii DIR z LPT.
    Pinb.0 do Pinb.3 to wyjście do sterowania krokowcem.
    Wejście INT1 to wejście linii STEP z LPT.

    $regfile = "m32def.dat"
    $crystal = 8000000
    
    Config Pinb.0 = 1 : Portb.0 = 0
    Config Pinb.1 = 1 : Portb.1 = 0
    Config Pinb.2 = 1 : Portb.2 = 0
    Config Pinb.3 = 1 : Portb.3 = 0
    Config Pina.0 = 0 : Porta.0 = 0
    Dim Licznik As Byte
    Dim Czas As Byte
    Czas = 4
    Enable Interrupts
    Enable Int1
    Config Int1 = Rising
    On Int1 Krok
    Do
    Portb = &B00000000
    Loop
    End
    
    Krok:
    Config Int1 = Falling
          'LEWO
          If Pina.0 = 1 Then
          Select Case Licznik
          Case 0:
             Portb = &B00001100
             Licznik = Licznik + 1
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          Case 1:
             Portb = &B00000110
             Licznik = Licznik + 1
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          Case 2:
             Portb = &B00000011
             Licznik = Licznik + 1
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          Case 3:
             Portb = &B00001001
             Licznik = 0
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          End Select
          End If
    
          'PRAWO
          If Pina.0 = 0 Then
          Select Case Licznik
          Case 0:
             Portb = &B00001001
             Licznik = Licznik + 1
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          Case 1:
             Portb = &B00000011
             Licznik = Licznik + 1
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          Case 2:
             Portb = &B00000110
             Licznik = Licznik + 1
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          Case 3:
             Portb = &B00001100
             Licznik = 0
             Do : Loop Until Pind.3 = 0
             Config Int1 = Rising
          End Select
          End If
    Return

    Pomóżcie proszę. Jak ktoś ma źródła innych sterowników bardzo proszę o podesłanie, zrozumienie działania cudzych programów pomaga w pisaniu swoich.
REKLAMA