Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[atmega8][bascom] pomiar czasu trwania impulsu poprzez ICP1

27 Sie 2009 17:18 4137 2
  • Poziom 10  
    Witam

    Mam za zadanie zrobic pomiar czasu wtrysku w ms poprzez przerwanie ICP1

    Niestety po wielu bojach z rejestrami Tccr1B Tccr1A oraz Timsk i innymi , program nie dziala jak potrzeba w Proteusie

    Czytalem w dataszicie ze licznik T1 musi byc ustawiony w trybie TOP i musie byc wlaczony Noise Canceler , wszelkie ustawienia WGM nie dzialaja :/

    Bardzo prosze o pomoc co w tym programie trzeba zmienic dodac aby dzialalo

    z gory bardzo dziekuje


    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portc.3 , E = Portd.3 , Rs = Portd.2
    '---------- u
    Dim Xl As Word
    Dim Xh As Word
    Dim X As Word
    Dim Dlw As Word
    Dim Dlw1 As Word
    Dim Dlw2 As Word
    Dim F As Bit
    Config Timer1 = Timer , Prescale = 256
    Cursor Off
    Config Pinb.0 = Input
    Enable Interrupts
    Tccr1b.6 = 1 'zbocze narastajace


    '---------------------------------------------------------------------------------------------------
    On Capture1 Wtrysk
    Glowny:

    Enable Capture1
    Start Timer1

    Do



    Loop Until Timer1 = 31250 '1s
    Disable Capture1
    Stop Timer1
    Timer1 = 0

    Goto Glowny

    '------------------------------------------------------------------------------------
    Wtrysk:

    Xh = Icr1h
    Xl = Icr1l

    Shift Xh , Left , 8
    X = Xl + Xh
    Locate 1 , 1
    Lcd ; "A:" ; X ; " "

    Set F
    Tccr1b.6 = 0

    If F = 1 Then

    Dlw1 = Icr1h
    Dlw2 = Icr1l

    Shift Dlw1 , Left , 8

    Dlw = Dlw1 + Dlw2
    Dlw = Dlw - X '
    Locate 2 , 1
    Lcd ; "B:" ; Dlw ; " "
    Reset F
    Tccr1b.6 = 1

    End If


    Return

    '----------------------------------------------------------------------------------
  • Pomocny post
    Poziom 38  
    Ponieważ tzw. casting w BASCOMie jest nieco zbyt prosto zrobiony to proponuję zrezygnować z:
    Dim Xl As Word
    Dim Xh As Word
    A w przerwaniu pobierać zawartość z rejestru ICR za pomocą specjalnie generowanej dla tego celu zmiennej typu Word: Capture1.

    Pętlę Do..Loop zamieniłbm na sprzętowe porównywanie i kasowanie licznika przez CTC. Niech takimi rzeczami zajmują się przerwania.

    Stosowanie LCD i jemu podległych instrukcji w przerwaniach jest bezsensowne i już wiele klawiatur zostało startych przy pisaniu opisów dlaczego tak się nie robi.

    Przerwania włącza się dopiero gdy wszelkie niezbędne konfiguracje zostaną już wykonane.
  • Poziom 10  
    Dziekuje za podpowiedz

    Teraz przerwania dzialaja poprawnie tylko nie moge zinterpretowac zmiennej Capture

    Jest ustawiony prescaler na 256

    Zalozenie bylo takie ze do Rejestru ICR1 w momencie przerwania zostaje wpisane to Co jest w TCNT1

    Tylko po zastosowaniu zmiennej capture1 po taktowaniu nozki ICP impulsem ok np 32 ms ,widac jakby ta zmienna sie przepelniala

    Zaobserwowalem ze przy pomiarze impulsu 4ms trzeba tylko podzielic roznice przez (32000/8000000)*100=4 ms , do 8ms w miare poprawnie wskazuje przy zamianie na R typu single i zamianie na string ##.&&



    $regfile = "m8def.dat"
    $crystal = 8000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portc.3 , E = Portd.3 , Rs = Portd.2
    '----------------------------------------------------------------------------------
    Dim A As Word
    Dim B As Word
    Dim R As Word
    Dim F As Bit
    Config Timer1 = Timer , Prescale = 256
    Cursor Off
    Config Portb.0 = Input
    Config Portb.1 = Output
    Enable Interrupts
    Tccr1b.6 = 1 'zbocze narastajace
    '----------------------------------------------------------------------------------
    F = 1
    On Capture1 Wtrysk
    Glowny:

    Timer1 = 0
    Start Timer1
    Enable Capture1

    Do

    Locate 1 , 1
    Lcd ; "A:" ; A ; " "
    Locate 2 , 1
    Lcd ; "B:" ; B ; " "
    Locate 2 , 10
    Lcd ; "R:" ; R ;

    Loop


    '----------------------------------------------------------------------------------
    Wtrysk:
    If F = 1 Then
    Portb.1 = 1
    A = Capture1
    Reset F
    Tccr1b.6 = 0

    Else

    Portb.1 = 0
    B = Capture1
    R = B - A
    Tccr1b.6 = 1
    Timer1 = 0
    Set F
    End If


    Return