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

[atmega32][Bascom] jak zmierzyc czas otwarcia wtrysku w aucie?

szeryfff 12 Sie 2011 13:04 2993 20
  • #1 12 Sie 2011 13:04
    szeryfff
    Poziom 24  

    Koledzy,
    mam mały problem, gdyż mój pomysł na zliczanie czasu otwarcia wtrysku nie bardzo się sprawdza. W tej chwili robię to tak, że w czasie 0,5s w pętli sprawdzam czy na pinie do którego jest podłączony sygnał wtrysku jest stan wysoki, jeżeli jest, to zwiększam zmienną "wtrysk".
    Działa to w miarę dobrze, ale jak np. wcisnę przycisk, co wiąże się z wykonaniem jakiegoś kodu, to wtedy pętla zliczająca impulsy wtrysku wykonuje się mniej razy, co wprowadza przekłamanie.
    Czy można w jakiś prosty sposób pozbyć się tego błędu?
    Timer1 używam do odmierzania 0,5s, a Timer0 zlicza impulsy drogi.
    Pozdrawiam

    0 20
  • #3 12 Sie 2011 13:10
    szeryfff
    Poziom 24  

    Ale impulsy drogi, to nie impulsy wtrysku :)

    0
  • #5 12 Sie 2011 13:22
    szeryfff
    Poziom 24  

    Pętla główna:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Tak to mniej więcej wygląda:) I chodzi o to, że jak wcisnę któryś z przycisków, to w czasie 0,5s główna pętla wykonuje się mniej razy, czyli pojawiają się przekłamania w spalaniu.
    Aha, program pisany w BascomAVR.

    0
  • #6 12 Sie 2011 13:26
    dondu
    Moderator Mikrokontrolery Projektowanie

    Drobna uwaga porządkowa. W temacie zaznaczaj język - niestety Bascom to nie moja specjalność :)

    Generalnie od takich rzeczy są timery i przerwania. Wtedy nie ma żadnych problemów z tym, że coś się opóźnia lub że coś tracisz.

    Sorry, Bascom ... ale na pewno zaraz się ktoś znajdzie i pomoże :)

    0
  • #7 12 Sie 2011 13:31
    szeryfff
    Poziom 24  

    Tak, wiem, ale T0 zlicza impulsy drogi, a T1 odmierza czas :)

    0
  • #8 12 Sie 2011 13:35
    dondu
    Moderator Mikrokontrolery Projektowanie

    szeryfff napisał:
    Tak, wiem, ale T0 zlicza impulsy drogi, a T1 odmierza czas :)

    Jest jeszcze T2.
    Nie wiem jak używasz T1, ale jeżeli tylko do generowania przerwania co 0,5sek to rozrzutność :)
    Zawsze można zwiększyć częstotliwość przerwań np. 100, czy 1000 krotnie i wykorzystać timer także do innych celów, odmierzając w jego przerwaniu różne odcinki czasowe do różnych celów.

    0
  • #9 12 Sie 2011 13:38
    szeryfff
    Poziom 24  

    Próbowałem użyć T2, przerwanie np. co 1ms, ale to powodowało reset co kilka sekund, nie wiem dlaczego :/
    Dlatego też nie zwiększyłem częstotliwości przerwań od T1.

    0
  • #10 12 Sie 2011 13:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    szeryfff napisał:
    Próbowałem użyć T2, przerwanie np. co 1ms, ale to powodowało reset co kilka sekund, nie wiem dlaczego :/
    Dlatego też nie zwiększyłem częstotliwości przerwań od T1.

    Oj, to jeżeli, aż takie masz problemy, to jednak radziłbym pokazać cały schemat oraz program.

    0
  • #11 12 Sie 2011 14:00
    szeryfff
    Poziom 24  

    Programu się wstydzę, bo jest bardzo "prostacki", i pewnie zagmatwany :)
    Wydaje mi się że te resety wynikały z tego, że przerwanie od T0 (które może się pojawiać nawet co ok 0,3s) "nakładało" się z przerwaniem od T2, chociaż takie coś chyba nie powinno mieć miejsca:)
    A może do odmierzania 0,5s użyć DS1307? Bo mam przygotowaną płytkę pod niego, gdybym kiedyś chciał do układu dołożyć zegarek :) Wtedy T1 mógłbym wykorzystać jako licznik impulsów.

    0
  • #12 12 Sie 2011 14:05
    dondu
    Moderator Mikrokontrolery Projektowanie

    szeryfff napisał:
    Programu się wstydzę, bo jest bardzo "prostacki", i pewnie zagmatwany :)

    Oj, nie masz czego. Wstydzić to ja się muszę, ale nie Ty: https://www.elektroda.pl/rtvforum/viewtopic.php?p=9802830#9802830


    szeryfff napisał:
    Wydaje mi się że te resety wynikały z tego, że przerwanie od T0 (które może się pojawiać nawet co ok 0,3s) "nakładało" się z przerwaniem od T2, chociaż takie coś chyba nie powinno mieć miejsca:)

    Tak to nie może mieć miejsca, obstawiam błąd w programie.
    Ale oczywiście mogą być także przyczyny w schemacie.


    szeryfff napisał:
    A może do odmierzania 0,5s użyć DS1307? Bo mam przygotowaną płytkę pod niego, gdybym kiedyś chciał do układu dołożyć zegarek :) Wtedy T1 mógłbym wykorzystać jako licznik impulsów.

    Nie wiem jakie masz dalsze plany do tego układu, ale jeżeli tylko to co opisałeś, sam mikrokontroler wystarczy i jeszcze będzie się nudził w 95%.

    0
  • #14 12 Sie 2011 16:22
    Mundi1970
    Poziom 24  

    Z tego co widzę to interesuje cię tylko zliczanie impulsów na PA2 (wtrysk). Jeżeli istnieje jeszcze możliwość zamiany portów, to PA2 można przełączyć na któryś z portów obsługujących przerwanie INTx (na ale wszystkie masz zajęte :) PD2, PD3 lub PB2).

    EDIT:

    szeryfff napisał:
    Próbowałem użyć T2, przerwanie np. co 1ms, ale to powodowało reset co kilka sekund, nie wiem dlaczego :/
    Dlatego też nie zwiększyłem częstotliwości przerwań od T1.


    Może na początek spróbuj zwiększyć pojemność stosów.

    0
  • #15 12 Sie 2011 18:30
    szeryfff
    Poziom 24  

    O, a jak to zrobić? :)

    0
  • #16 12 Sie 2011 18:58
    Mundi1970
    Poziom 24  

    Wielkość stosów możesz ustawić w menu Options -> Compiler -> Chip HW Stack, Soft Stack i Framesize (ustawienia domyślne to 32,24,24). Można też dopisać na początku programu:

    $HWSTACK = wartość
    $SWSTACK = wartość
    $FRAMESIZE = wartość

    gdzie wartość to ilość bajtów przeznaczona na stos. Link

    0
  • #17 12 Sie 2011 20:28
    szeryfff
    Poziom 24  

    A jakie wartości proponujesz wpisać?
    Pozdrawiam

    0
  • #18 12 Sie 2011 23:40
    Mundi1970
    Poziom 24  

    Na początek żeby sprawdzić czy program poprawnie działa możesz dać po 100 bajtów na stos (lub więcej, DOTYCZY ATMEGI32 Z 2KB SRAM :)). Jak się okaże że wszystko działa, wypadało by wykorzystać narzędzie Stack Analyser do określenia wielkości stosu program.

    0
  • #19 13 Sie 2011 10:37
    rs07
    Poziom 20  

    Witaj.
    Ja też kiedyś zrobiłem podobny komputerek i pracuje nieźle, choć nie mia tak wielu funkcji. Wydaje mi się że powinieneś liczyć impulsy wtrysku w przerwaniu bo to zapewnia prawidłowe liczenie.
    Mój jest na Atmedze8. Ja impulsy z jednego wtrysku liczę w przerwaniu od INT0 a funkcja wygląda tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Obsluga_int0: 'Przerwanie od wtrysku PORTB.2
    Do
    Incr Petle_wtrysk
    If Pinb.1 = 0 Then 'Sprawdzenie czy stacyjka włączona
    Disable Interrupts
    Exit Do
    End If
    Loop Until Pind.2 = 1
    Return
    Kod: select_listing
    Zaloguj się, aby zobaczyć kod

    0
  • #20 13 Sie 2011 11:04
    drzasiek
    Specjalista - Mikrokontrolery

    Nie znam Bascoma więc nie wiem co Robią pokazane programy ale jest prosty sposób na to.
    Ustawiasz jeden Timer tak aby zgłaszał przerwanie (np od przepełnienia) co 1 ms (czy jaką tam sobie dokładność chcesz).
    Timer sobie zasuwa i zgłasza przerwania, w przerwaniu sprawdzasz stan jakiegoś Pinu i jeśli wtrysk jest otwarty to dodajesz licznik ms a jeśli się okaże że zamknięty to przepisujesz wartość licznika do jakiejś globalnej zmiennej, ustawiasz flagę że jest nowy pomiar a licznik ms zerujesz.
    Całą obsługę przycisków dajesz w pętli głównej programu więc nic nie będzie kolidowało.
    W pętli głównej sprawdzasz też flagę czy jest nowy pomiar, jeśli jest to przeliczasz odpowiednio, wyświetlasz i zerujesz flagę i potem pętla sobie zasuwa i robi swoje aż do kolejnego ustawienia flagi czyli kolejnego nowego pomiaru.
    Może jest prostszy sposób, trzeba by się zastanowić. Ale ja bym to tak zrobił.

    0
  • #21 13 Sie 2011 11:13
    szeryfff
    Poziom 24  

    Standardowo było 32,8,24, ustawiłem na 100, zobaczymy co z tego wyjdzie :)

    drzasiek, tak chciałem zrobić, ale jak wspomniałem wcześniej, program mi się resetował. Może po zmianie wielkości stosów będzie dobrze:)

    rs07, a co to Pind.2?

    0