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

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

szeryfff 12 Sie 2011 13:04 3323 20
REKLAMA
  • #1 9817798
    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
  • REKLAMA
  • #3 9817821
    szeryfff
    Poziom 24  
    Ale impulsy drogi, to nie impulsy wtrysku :)
  • #5 9817856
    szeryfff
    Poziom 24  
    Pętla główna:
    Kod: text
    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.
  • REKLAMA
  • #6 9817866
    dondu
    Moderator na urlopie...
    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 :)
  • #7 9817882
    szeryfff
    Poziom 24  
    Tak, wiem, ale T0 zlicza impulsy drogi, a T1 odmierza czas :)
  • #8 9817901
    dondu
    Moderator na urlopie...
    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.
  • REKLAMA
  • #9 9817912
    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.
  • #10 9817920
    dondu
    Moderator na urlopie...
    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.
  • #11 9817993
    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.
  • #12 9818011
    dondu
    Moderator na urlopie...
    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/topic2060973.html#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%.
  • #14 9818397
    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.
  • REKLAMA
  • #15 9818794
    szeryfff
    Poziom 24  
    O, a jak to zrobić? :)
  • #16 9818883
    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
  • #17 9819207
    szeryfff
    Poziom 24  
    A jakie wartości proponujesz wpisać?
    Pozdrawiam
  • #18 9820001
    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.
  • #19 9820563
    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: text
    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: text
    Zaloguj się, aby zobaczyć kod
  • #20 9820624
    drzasiek
    Specjalista CNC
    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ł.
  • #21 9820642
    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?
REKLAMA