Witam wszystkich,
Stworzyłem schemat do zapłonu motocyklowego z użyciem dwóch transoptorów, wyświetlaczem LCD na sterowniku HD44780 a także dwóch tranzystorów do sterowania cewką (BU931). Jako kwarcu użyłem 24Mhz.
Pierwsza prośba to czy ktoś może mi sprawdzić czy schemat jest prawidłowy.
Teraz mam pytania odnośnie tego schematu, i wykorzystania tutaj języka "C".
Porty "A" jako wyjścia definiuje się za pomocą:
Stan niski na tym porcie wykonuje za pomocą:
Stan wysoki na tym porcie wykonuje za pomocą:
Teraz mam pytanie o przerwanie zewnętrzne, wszędzie gdzie znalazłem dotyczyło to podpięcia pod masę, a u mnie ma być odwrotnie. Sygnał będzie z transoptora kiedy wykryje szczelinę (wówczas przepuści napięcie). I teraz chciałbym to wykorzystać w taki sposób "Jeżeli wykryje napięcie na INT0 wykonaj akcję ...".
Pewnie muszę ustawić INT0 i INT1 na zbocze wzrastające?
Sygnał powinienem przetwarzać jak poniżej (dla INT0).
Czy to powinno być tak:
Pod akcję rozumiem ustawienie niskiego stanu na porcie PA0 ale tylko na 10ms.
Czy takie coś byłoby dobre:
A dla INT1 i PA1 w taki sposób:
Chciałbym również aby TIMER zliczał również ilość przerwań od INT0 przez 1s.
W bascomie timer obsługiwałoby się za pomocą kodu:
A w "C" nie znalazłem żadnego skrawka kodu by sobie "zerknąć".
Jeżeli gdzieś są błędy w moim toku myślenia to proszę o poprawienie.
Stworzyłem schemat do zapłonu motocyklowego z użyciem dwóch transoptorów, wyświetlaczem LCD na sterowniku HD44780 a także dwóch tranzystorów do sterowania cewką (BU931). Jako kwarcu użyłem 24Mhz.
Pierwsza prośba to czy ktoś może mi sprawdzić czy schemat jest prawidłowy.
Teraz mam pytania odnośnie tego schematu, i wykorzystania tutaj języka "C".
Porty "A" jako wyjścia definiuje się za pomocą:
DDRA = 0xFF;Stan niski na tym porcie wykonuje za pomocą:
PORTA = 0x00; Stan wysoki na tym porcie wykonuje za pomocą:
PORTA = 0xff; Teraz mam pytanie o przerwanie zewnętrzne, wszędzie gdzie znalazłem dotyczyło to podpięcia pod masę, a u mnie ma być odwrotnie. Sygnał będzie z transoptora kiedy wykryje szczelinę (wówczas przepuści napięcie). I teraz chciałbym to wykorzystać w taki sposób "Jeżeli wykryje napięcie na INT0 wykonaj akcję ...".
Pewnie muszę ustawić INT0 i INT1 na zbocze wzrastające?
int main(void)
{
DDRA = 0xFF; // port A jako wyjście
GICR = _BV(INT0)|_BV(INT1); // włącz przerwania z INT0 i INT1
MCUCR = (1<<ISC01)|(1<<ISC00); // zbocze narastające
sei(); // przerwania globalne włączone
// kontynuuje program, tutaj np. będzie przesyłanie informacji do HD44780...
return(0);
}Sygnał powinienem przetwarzać jak poniżej (dla INT0).
Czy to powinno być tak:
SIGNAL (SIG_INTERRUPT0)
{
//otrzymalem sygnal wykonaj akcje ta i ta
} Pod akcję rozumiem ustawienie niskiego stanu na porcie PA0 ale tylko na 10ms.
Czy takie coś byłoby dobre:
SIGNAL (SIG_INTERRUPT0)
{
//otrzymalem sygnal ustawiam na porcie PA0 stan niski
PORTA = 0x01;
//po 10ms przestaw na stan wysoki
waitms(10);
PORTA = 0x11;
} A dla INT1 i PA1 w taki sposób:
SIGNAL (SIG_INTERRUPT1)
{
//otrzymalem sygnal ustawiam na porcie PA1 stan niski
PORTA = 0x02;
//po 10ms przestaw na stan wysoki
waitms(10);
PORTA = 0x12;
} Chciałbym również aby TIMER zliczał również ilość przerwań od INT0 przez 1s.
W bascomie timer obsługiwałoby się za pomocą kodu:
Timer1 = 0
Start Timer1
Wait 1
Stop Timer1
A w "C" nie znalazłem żadnego skrawka kodu by sobie "zerknąć".
Jeżeli gdzieś są błędy w moim toku myślenia to proszę o poprawienie.