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

[Mega8][BASCOM] compare1a i ICP1

madart 12 Cze 2008 22:21 4060 8
REKLAMA
  • #1 5240526
    madart
    Poziom 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:
    $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
  • REKLAMA
  • Pomocny post
    #2 5240539
    ZbeeGin
    Poziom 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.
  • REKLAMA
  • #3 5240582
    madart
    Poziom 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
    $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 5240682
    ZbeeGin
    Poziom 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.
  • REKLAMA
  • #5 5240693
    madart
    Poziom 26  
    To nie dobrze :( Będę musiał użyć w takim razie T0 do compare.
    A timer1 zapomniałem usunąć :D
  • REKLAMA
  • #6 5241214
    ZbeeGin
    Poziom 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 5241421
    madart
    Poziom 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?
    $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 5243182
    ZbeeGin
    Poziom 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:

    $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 5243324
    madart
    Poziom 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:
    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:
    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;
REKLAMA