Pracuję nad elektronicznym układem wyprzedzenia zapłonu.
Układzik elektroniczny z programem typu:
działa bez problemu, ale jak już "skomplikowałem program to ni hu hu"
Zachowuje się tak jakby nigdy nie występowała jedynka na PINC0, 1, 2.
Jak najlepiej wyłapać to zdarzenie
W załączniku układ elektroniczny.
A teraz kod:
Na wejścia In1-In2 są podłączone bezpośrednio przerywacze zapłonu (bez kondensatorów). Przerywacz cały czas jest " w powietrzu" daje zero w momencie kiedy powienien nastąpić zapłon.
Licznik T1 jest używany przeze mnie do przyspieszenia zapłonu.
Licznik T2 do określenia prędkości obrotowej silnika.
Wejścia z Kanapki(wymienna płytka, na rysunku z NANDami teraz z uP) mam podpięte pod PC0-PC2 wyjścia analogicznie PD0-PD2.
Pod ostatnie trzy piny portu D mam podpięte diody do testów, zawsze mogę sobie półapkę wpisać czy coś.
Układzik elektroniczny z programem typu:
PORTD=~PINC działa bez problemu, ale jak już "skomplikowałem program to ni hu hu"
Zachowuje się tak jakby nigdy nie występowała jedynka na PINC0, 1, 2.
Jak najlepiej wyłapać to zdarzenie
W załączniku układ elektroniczny.
A teraz kod:
#define F_CPU 12800000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
volatile unsigned int wej_z_przer, wyj_na_cylindry, Temp_przepT2,przepT2,zawT2,faza,cylinder,
przyspieszenie ;
int oblicz_T1 (int przep, int zaw)
{
int wynik;
if (przep>3) {faza=4;}
if (przep<3) {zaw=(przep*255)+zaw;}
if (zaw>624)
{
faza=4;
}
if (zaw<624 && zaw>=312)
{
wynik=(int)((65535-(((zaw-312)*(5.5))+1525))+0.5);
}
if (zaw<312 && zaw>=174)
{
wynik=(int)((65535-(((zaw-174)*(5.17))+812))+0.5);
}
if (zaw<174)
{
wynik=(int)((65535-(zaw*(4.66))+0.5));
}
return wynik;
}
SIGNAL (SIG_OVERFLOW1)
{
PORTD=~_BV(cylinder);
}
SIGNAL (SIG_OVERFLOW2)
{
Temp_przepT2++;
}
int main(void)
{
faza=1;
DDRD=0xFF; //PORT D jako wyjście
DDRC=0x00; //PORT C jako wejście
PORTC=0x00; //podciągnij do zera sygnal z przerywacza "1"
TIMSK=_BV(TOIE1)|_BV(TOIE2); //opcja przerwania T1 i T2
TCCR1A=0x00;
TCCR1B=_BV(CS10)|_BV(CS11); //prescaler ck/128
TCCR2=_BV(CS22)|_BV(CS21)|_BV(CS20); //prescaler ck/1024
sei(); //uruchomienie przerwań
while(1) //pętla nieskończona
{
PORTD=_BV(5);
if ((PINC0) && faza==1) // Jeśli pierwszy cylinder
{
TCNT2=0x01; //Uruchom T2 wpisujac wartosc poczatkowa 1
faza=2;
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
PORTD=_BV(6);
}
if ((PINC1) && faza==2) // Jeśli drugi cylinder
{
faza=3; //faza oczekiwania na pierwszy czas T2
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
PORTD=_BV(7);
}
if ((PINC0) && faza==3) // Jeśli pierwszy cylinder
{
przepT2=Temp_przepT2;
zawT2=TCNT2;
TCNT2=0x01;
Temp_przepT2=0x00;
przyspieszenie=oblicz_T1(przepT2,zawT2);
TCNT1=przyspieszenie;
cylinder=0x05;
}
if ((PINC1) && faza==3) // Jeśli drugi cylinder
{
cylinder=0x03;
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
TCNT1=przyspieszenie;
}
if ((PINC2) && faza==3) // Jeśli trzeci cylinder
{
cylinder=0x04;
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
asm("nop"); //uniknecie wachan napiecia na styku
TCNT1=przyspieszenie;
}
if (faza==4) //przy prędkości oborotowej do 1198 lub awarii nie przyspieszaj zaplonu.
{
PORTD=~PINC;
}
}
}
Na wejścia In1-In2 są podłączone bezpośrednio przerywacze zapłonu (bez kondensatorów). Przerywacz cały czas jest " w powietrzu" daje zero w momencie kiedy powienien nastąpić zapłon.
Licznik T1 jest używany przeze mnie do przyspieszenia zapłonu.
Licznik T2 do określenia prędkości obrotowej silnika.
Wejścia z Kanapki(wymienna płytka, na rysunku z NANDami teraz z uP) mam podpięte pod PC0-PC2 wyjścia analogicznie PD0-PD2.
Pod ostatnie trzy piny portu D mam podpięte diody do testów, zawsze mogę sobie półapkę wpisać czy coś.