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

2313, zapamiętywanie zmierzonej wartości i odnoszenie się do

maciejbilu 25 Lis 2009 11:54 946 4
REKLAMA
  • #1 7306298
    maciejbilu
    Poziom 11  
    Witam szanownych.
    Procesorek Attiny2313, bascom.
    Jak zrobić, aby Attinka po uruchomieniu z czytała (ALE TYLKO RAZ przy URUCHOMIENIU !) z PIND.2 szerokość PWM oraz zapamiętała ją. Następnie w docelowym Do - Loop, w odniesieniu do zapamiętanej wartości, kiedy wykryje tą wartość (lub niższą) na PIND.2 zasygnalizowała to LEDem np. na SET PORTB3.
    Próbowałem, przed Do-Loop, poleceniem Gosub, ale nie działa. Wygląda to ta jakby timery się kłóciły.

    Będę wdzięczny za podpowiedzi.

    P.S. Prosiłbym w miarę łopatologicznie :-).

    Maciek
  • REKLAMA
  • #2 7306577
    Freddy
    Poziom 43  
    Zamieść swój kod źródłowy, spróbujemy pomóc.
  • REKLAMA
  • #3 7306587
    walek33
    Poziom 29  
    W procedurze main przed pętlą (never ending) piszesz co chcesz. Wykona się tylko raz.
  • REKLAMA
  • #4 7306603
    korrus666
    Poziom 40  
    Tylko jeszcze musisz wstrzymać wykonywanie programu dopóki nie zmierzysz tej wartości. Zatem polecam użyć jakiejś flagi wstrzymującej wykonywanie programu do czasu zmierzenia impulsu. Zrobić to na przerwaniu np i po zmierzeniu flagę ustawiać tak aby program poszedł dalej.
  • #5 7306642
    maciejbilu
    Poziom 11  
    Witam,
    Zerknijcie proszę.
    Chodzi o funkcję 2.

    
    Config Portd.4 = Input
    
    Config Portb.7 = Output
    Config Portb.6 = Output
    Config Portb.5 = Output
    Config Portb.4 = Output
    Config Portb.3 = Output
    Config Portb.2 = Output
    Config Portb.1 = Output
    Config Portb.0 = Output
    Config Int0 = Rising
    Config Int1 = Rising                                        '
    
    Config Timer1 = Timer , Prescale = 1                        'timer1 - funkcja 1
    Config Timer0 = Timer , Prescale = 1                        'timer0 - funkcja 1
    
    Enable Int0
    Enable Int1
    Enable Timer1
    Enable Timer0
    Enable Interrupts
    
    'dla funkcji 1
    Dim A As Byte
    Dim E As Word
    Dim F As Word
    Dim X2 As Word
    
    'dla funkcji 2
    Dim M As Byte
    Dim G As Byte
    Dim H As Word
    Dim I As Word
    Dim X1 As Word
    
    'ta zmienna w ktora zapiszemy wartosc
    Dim Z As Word
    
    
    
    
    'INT0 - dla funkcji 1 (na wejściu PD2)
    On Int0 Signal0
    Start Timer0
    Load Timer0 , 0
    
    'INT1 - funkcja 2   (na wejściu PD3)
    On Int1 Signal1
    Start Timer1
    Load Timer1 , 0
    
    'jednorazowe wywolanie tylko rpzy uruchomieniu lub resecie
    Gosub Pomiar1
    
    'Początek programu
    Do
    
    
    If A = 1 Then
    
    ' tu będzie pierwsza funkcja -> włącz LED gdy X2 > 1410
    ' druga funckja -> włączaj LED gdy X1 dojdzie do wartości wcześniej zmierzonej i zapamiętanej
    If X2 <= Z Then
    Set Portb.2
    End If
    
    If X2 > Z Then
    Reset Portb.2
    End If
    
    End If
    
    Loop
    
    
    
    
    
    
    '********* Pomiar_czasu ************
    
    'początek pomiaru dla funkcji 1 PIND2
    Signal0:
    X2 = 0
    E = 0
    F = 0
    
    If Pind.2 = 1 Then
    E = Timer0
    Bitwait Pind.2 , Reset
    F = Timer0
    X2 = F - E
    
    If X2 > 1410 Then                                           'jezeli impuls dluzszy niz 1,5 ms
    Set Portb.3                                                 'zapalam diode
    End If
    
    If X2 < 1410 Then                                           'jezeli impuls dluzszy niz 1,5 ms
    Reset Portb.3                                               'zapalam diode
    End If
    
    End If
    
    Return
    
    
    'funkcja 2  PIND3
    
    Signal1:
    X1 = 0
    G = 0
    H = 0
    
    If Pind.3 = 1 Then
    G = Timer1
    Bitwait Pind.3 , Reset
    H = Timer1
    X1 = H - G
    
    End If
    
    Return
    
    
    'procedura do jednorazowego wykonania
    
    Pomiar1:
    Disable Int0
    Disable Int1
    Z = 0
    G = 0
    H = 0
    
    If Pind.3 = 1 Then
    G = Timer1
    Bitwait Pind.3 , Reset
    H = Timer1
    Z = H - G
    
    End If
    Enable Int0
    Enable Int1
    Load Timer0 , 0
    
    Return
    
    
    End
    


    Po wgraniu tego kodu, wygląda to następująco:
    LED dla funkcji 2 zapala się przy wł. zasilania na 1 sek i gaśnie.
    LED dla funkcji 1 chaotycznie miga (powinna zapalać się i gasnąć na żądanie). Wgrana sama tylko funkcja 1 działa bez zarzutu.

    Od razu odpowiem na pytanie - impulsy pwm generowane są przeze mnie i wchodzą na wejścia PIND.2 oraz PIND.3

    Dzięki śliczne
REKLAMA