Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Mega8][BASCOM] compare1a i ICP1

madart 12 Jun 2008 22:21 3943 8
  • #1
    madart
    Level 26  
    Nie bardzo wiem dlaczego wogóle to nie chce wykonać podprogramu po otrzymaniu na noge ICP1 czyli portb.0 opadajacego zbocza. Nic się nie dzieje, co robię nie tak?
    Mój program:
    Code:
    $regfile = "m8def.DAT"
    
    $crystal = 8000000
    $baud = 9600

    Config Portc = Output
    Set Portc.2
    Reset Portc.1
    Reset Portc.0

    Config Pinb.0 = Input

    Config Timer1 = Counter , Edge = Falling , Capture Edge = Falling

    On Capture1 C1
    Enable Interrupts
    Enable Timer1



    Do

    Loop
    End


    C1:

    Set Portc.0
    Wait 1
    Return
  • Helpful post
    #2
    ZbeeGin
    Level 39  
    Napisałeś Enable Timer1. Licznik Timer1 ma nie tylko jedno przerwanie. Każde zdarzenie ma swoje źródło przerwań i trzeba je włączyć.

    :arrow: Help w temacie ENABLE.
  • #3
    madart
    Level 26  
    No i pomogło :)
    A jak to wygląda z compare1a ? oc1a to nazwa zamienna, ale po wpisaniu do nie wartości z jaką ma być porównany licznik t1 podprogram sie nie uruchomil
    Code:
    $regfile = "m8def.DAT"
    
    $crystal = 8000000
    $baud = 9600

    Config Portc = Output
    Set Portc.2
    Reset Portc.1
    Reset Portc.0

    Config Pinb.0 = Input

    Config Timer1 = Counter , Edge = Falling , Capture Edge = Falling , Compare A = Disconnect

    On Oc1a C1
    Enable Interrupts
    Enable Timer1
    Enable Oc1a

    Pwm1a = 10

    Do

    Loop
    End


    C1:

    Set Portc.0
    Wait 1
    Return
  • #4
    ZbeeGin
    Level 39  
    A dlaczego włączasz dalej Timer1 skoro jest to źródło odpowiadające przepełnieniu licznika?

    Skoro używasz już trybu ICP to użycie trybu COMPARE - o ile mnie pamięć nie myli - nie jest możliwe.
  • #5
    madart
    Level 26  
    To nie dobrze :( Będę musiał użyć w takim razie T0 do compare.
    A timer1 zapomniałem usunąć :D
  • #6
    ZbeeGin
    Level 39  
    Nie będziesz musiał. Tryb ICP będzie współgrał z możliwością porównania przez COMPARE. Właśnie sprawdziłem na AVR Studio - przechwytywanie jak i przerwanie z OC1A działają razem.
    Ewentualnie należy odpowiednio ustawić kierunek pracy portu do którego podłączony jest ICP1.
  • #7
    madart
    Level 26  
    Właśnie byłem trochę zdziwiony, bo mam program w C do propeller clocka w którym tak jest zrobione :) Gdy port nie będzie używany to też muszę go przestawić czy nie? Potrzebuje tylko w programie obsłużyć to porównanie i wtedy wyświetlić lub nie wskazówkę.

    edit:
    Coś nie moge dojść z tym compare1a do skutku.
    Jakieś rady?
    Code:
    $regfile = "m8def.DAT"
    
    $crystal = 8000000
    $baud = 9600

    Config Portc = Output
    Set Portc.2
    Reset Portc.1
    Reset Portc.0

    Config Pinb.0 = Input

    Config Timer1 = Counter , Edge = Falling , Capture Edge = Falling , Compare A = Disconnect , Clear Timer = 1
    compare1a = 100
    On Compare1a C1
    Enable Compare1a
    Enable Icp1
    Enable Interrupts


    Do

    Loop
    End


    C1:
    Set Portc.0
    Wait 1
    Return
  • #8
    ZbeeGin
    Level 39  
    A co Tobie niby nie chodzi w tym proramie? Ja przed chwilą skompilowałem i uruchomiłem w trybie symulacji następujący kod:

    Code:
    $regfile = "m8def.DAT"
    
    $crystal = 8000000
    $baud = 9600

    Config Timer1 = Counter , Edge = Falling , Compare A = Disconnect , Clear Timer = 1
    Compare1a = 100
    On Compare1a C1
    Enable Compare1a
    Enable Interrupts

    Config Pinb.0 = Input
    Config Portc = Output
    Set Portc.2
    Reset Portc.1
    Reset Portc.0

    Do
    Loop

    C1:
      Set Portc.0
      Wait 1
      Return

    I działa - Timer1 zlicza i kasuje się sam, zmienia się stan PC.0... :?

    Oczywiście impulsów na T1 się nie da podać tak z "palca" poprzez kolorowe diodki w symulatorze, ale da się skorzystać z zakładki Interrupts a tam z opcji Pulse.
  • #9
    madart
    Level 26  
    Wgrałem to do siebie i jak dioda nie świeciła tak nie świeci. Tak jakby nie było przerwania od compare1a.
    Ale obeszłem się inaczej. Compare1a pracuje mi normalnie razem z icp1 gdy timer1 = timer, i tak to zostawie. A cała idea jest taka:
    Timer1 dostaje przerwanie od icp1 i zaczyna liczyc czas do nastepnego przerwania. I tak co 50 obrotów.I to jest czas obrotu zegara. Ten czas dziele przez 60 i mam czas trwania jednej pozycji i jej położenie. Teraz przy pomocy compare1a porównuje każdą pozycję z czasem odczytanym z RTC i jeśli wskazówka ma znajdować się na pozycji aktualnej to wtedy jest wyświetlana. Albo coś w tym stylu :D
    Narazie on icp1 wygląda tak:
    Code:
    Stop Timer1
    
    Timer1 = 0
    Start Timer1

    'Set Portc.0
    Incr Y
    If Y = 50 Then
    X = capture1
    X = X / 60
    Y = 0
    End If

    Compare1a = X

    Nie wiem do końca czy to tak ma być, jestem w fazie testów :D
    Ale to chyba jednoznaczne z takim zapisem w C:
    Code:
    SIGNAL (SIG_INPUT_CAPTURE1) 
    
    {
    TCCR1B&=0b11111000; //zatrzymaj timer
    TCNT1=0;         //wyzeruj timer liczacy czas obrotu
    TCCR1B|=0b00000010; //wlacz timer

    y++;
    if(y==50)
    {x=ICR1;            //przepisz z rejestru przechwytywania czas obrotu
    x=x/60;
    y=0;}            //oblicz ile taktów zegara przypada na jedna działke

    OCR1A=x;