Witam,
od pewnego czasu borykam się z pewną trudnością, a mianowicie obsługą dwóch przerwań zewnętrznych, z czego jedno ma byc wykorzystywane podczas obsługi drugiego.
Projekt to odcięcie zapłonu z zamkiem szyfrowym. Po krótce:
W momencie załaczenia stacyjki na on, ma wyśwoietlać się komenda podania pinu itd, po wpisaniu na tranzystor sterujący przekaźnikiem zostaje wysłany stan wysoki i pompa paliwa dostaje prąd. Jednakże przy wyłaczeniu stacyjki atmega ma przejść w stan power-down(tego jeszcze nie zaimplementowałem), w czasie jazdy ma wyświetlać czas i temp.
O ile funkcje zawarte w mainie działały, o tyle w przerwaniu wszystko głupieje, ale najczęściej przerwanie się nie wykonuje...
Czy ktos mógłby rzucić okiem, czy da się to tak jak to zrobilem wykonać? moj angielski nie jest najlepszy więc coś może przeoczyłem w datasheecie lub pomocy WinAvr.
Przerwanie z klawiatury(kolumny sa podpięte pod bramke and) obsługiwane są przy opadającym zboczu, Przerwanie ze stacyjki przy dowolnej zmienie (z czego będzie zabezpieczenie 60 sekundowe przed przypadkowym zgaśnięciem silnika)
Do oceny właściwie tylko te pliki się przydadza:
main.c:
globals.h:
od pewnego czasu borykam się z pewną trudnością, a mianowicie obsługą dwóch przerwań zewnętrznych, z czego jedno ma byc wykorzystywane podczas obsługi drugiego.
Projekt to odcięcie zapłonu z zamkiem szyfrowym. Po krótce:
W momencie załaczenia stacyjki na on, ma wyśwoietlać się komenda podania pinu itd, po wpisaniu na tranzystor sterujący przekaźnikiem zostaje wysłany stan wysoki i pompa paliwa dostaje prąd. Jednakże przy wyłaczeniu stacyjki atmega ma przejść w stan power-down(tego jeszcze nie zaimplementowałem), w czasie jazdy ma wyświetlać czas i temp.
O ile funkcje zawarte w mainie działały, o tyle w przerwaniu wszystko głupieje, ale najczęściej przerwanie się nie wykonuje...
Czy ktos mógłby rzucić okiem, czy da się to tak jak to zrobilem wykonać? moj angielski nie jest najlepszy więc coś może przeoczyłem w datasheecie lub pomocy WinAvr.
Przerwanie z klawiatury(kolumny sa podpięte pod bramke and) obsługiwane są przy opadającym zboczu, Przerwanie ze stacyjki przy dowolnej zmienie (z czego będzie zabezpieczenie 60 sekundowe przed przypadkowym zgaśnięciem silnika)
Do oceny właściwie tylko te pliki się przydadza:
main.c:
#include "lcd.h"
#include "keyboard.h"
#include "globals.h"
#include "pcf8583.h"
#include "pin.h"
void main(void)
{
writePin();
LCD_ADD = 0xFF;
LCD_PORT = 0xFF;
KEY_ADD = 0xF8;
KEY_PORT = 0x07;
STER_CLR; //odcina zapłon
lcdInit();
i2cSet();
INT_KEY;
INT_IGNIT;
sei();
//resetPcf();
while(1)
{
lcdString("lalala");//przerwanie go nie rusza i wykonuje sie cały czas
}
}
ISR(INT1_vect, ISR_NOBLOCK)
{
pinLoop(); //wprowadzanie pinu (składa się z kilku funkcji);
lcdCommand(CLEAR);
while(1)
{//wyswietlanie godziny i daty na wyświetlaczu
dispClock();
dispCalendar();
lcdCommand(0xCB);
lcdString("T=25C");
//_delay_ms(200);
}
}
ISR(INT0_vect)
{
keyCheck();
KEY_PORT = 0x0F;
}globals.h:
#ifndef __GLOBALS_H__
#define __GLOBALS_H__
#include <avr/io.h>
#include <avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 16000000
#endif
/*********GLOBAL BEGIN**************/
unsigned char sign; //variable for printing signs on LCD during operations
unsigned char button; //variable for giving information about pushing buttons
unsigned char error; //error=0 - wthout errors, error=1 - PIN error, error=2 - PIN change (if passed -> STER_SET)
/*********GLOBAL END****************/
/*********STER BEGIN****************/
#define STER_SET DDRD |= _BV(7); PORTD |= _BV(7)
#define STER_CLR DDRD |= _BV(7); PORTD &= ~_BV(7)
/*********STER END******************/
/*********INTERRUPTS BEGIN**********/
#define INT_KEY MCUCR |= _BV(1);MCUCR &= ~_BV(0);GICR |= _BV(6) //fall
#define INT_IGNIT MCUCR &= ~_BV(3);MCUCR |= _BV(2);GICR |= _BV(7) //changing
/*********INTERRUPTS END************/
#endif