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.

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

12 Sie 2011 13:04 3092 20
  • 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
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 24  
    Ale impulsy drogi, to nie impulsy wtrysku :)
  • 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.
  • 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 :)
  • Poziom 24  
    Tak, wiem, ale T0 zlicza impulsy drogi, a T1 odmierza czas :)
  • 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.
  • 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.
  • 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.
  • 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.
  • 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%.
  • 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.
  • Poziom 24  
    O, a jak to zrobić? :)
  • 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
  • Poziom 24  
    A jakie wartości proponujesz wpisać?
    Pozdrawiam
  • 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.
  • 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
  • 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ł.
  • 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?