Mojej walki ciąg dalszy, pamiętam o poprzednich tematach, uczę się i kiedyś do nich wrócę
.
Otóż podłączyłem czujnik wstrząsów do PD3 i chciałem wykrywać wstrząsy przerwaniem. A propos, okazało się że samochodowy 12v świetnie chodzi na 5v, diodki mrugają więc wiem że wstrząsy wykrywa. Wstrząs sygnalizowany jest zwarciem sygnału do masy - i zmierzone że 0 się pojawia.
To co się dzieje dalej nie zależy od czujnika bo zwieranie zworką PD3 do masy daje takie same efekty jak wstrząs na czujniku. A ja już głupieję, przetrzepałem dokumentację procka na wszystkie strony, spróbowałem wszystkiego a on dalej świruje.
Świrowanie objawia się tym że po wywołaniu obsługi przerwania INT1 nie wraca z niego do programu. Obsługa przerwania sprowadzała się do podstawienia 1 pod zmienną wstrzas.
Gdy póbuję to uprościć i nie obsługiwać przerwania ale badać stosowną flagę w GIFR to następuje jakby reset - wyraźnie widać że lcd się inicjalizuje od początku.
W kodzie jak widać pojawiły się dodatkowe instrukcje do lcd, stąd wiem co i gdzie się dzieje. Delay po to, żebym zauważył żę coś się wydarzyło (lub nie).
lcd_zint() wystawia na lcd liczbę jednocyfrową (tu 0/1).
Instrukcje zakomentowane to rózne wersje testowe (albo oryginalne instukcje z programu), tak samo zakomentowywałem ISR. Więcej nie umieszczam bo program jest duży ale ta pętla jest wieczna
i nie powinno się już po niej nic dziać...
Macie jakieś pomysły na to co zrobić z dziwnym zachowaniem procka?
PS: aha, czyszczenie flagi GIFR w przerwaniu też nic nie daje, w manualu jest ze powinna sama się czyścić ale i tak spróbowałem.
PS2: testowane zarówno przy przerwaniu na opadającym zboczu jak i przerwaniu na low level, różnic jakby nie ma...
Otóż podłączyłem czujnik wstrząsów do PD3 i chciałem wykrywać wstrząsy przerwaniem. A propos, okazało się że samochodowy 12v świetnie chodzi na 5v, diodki mrugają więc wiem że wstrząsy wykrywa. Wstrząs sygnalizowany jest zwarciem sygnału do masy - i zmierzone że 0 się pojawia.
To co się dzieje dalej nie zależy od czujnika bo zwieranie zworką PD3 do masy daje takie same efekty jak wstrząs na czujniku. A ja już głupieję, przetrzepałem dokumentację procka na wszystkie strony, spróbowałem wszystkiego a on dalej świruje.
Świrowanie objawia się tym że po wywołaniu obsługi przerwania INT1 nie wraca z niego do programu. Obsługa przerwania sprowadzała się do podstawienia 1 pod zmienną wstrzas.
Gdy póbuję to uprościć i nie obsługiwać przerwania ale badać stosowną flagę w GIFR to następuje jakby reset - wyraźnie widać że lcd się inicjalizuje od początku.
W kodzie jak widać pojawiły się dodatkowe instrukcje do lcd, stąd wiem co i gdzie się dzieje. Delay po to, żebym zauważył żę coś się wydarzyło (lub nie).
lcd_zint() wystawia na lcd liczbę jednocyfrową (tu 0/1).
#include<avr/io.h>
#include<avr/interrupt.h>
#include<stdint.h>
#include<c:/ja/h_lcd.h>
#define F_CPU 1000000
#include<util/delay.h>
#define GLUE(a, b) a##b
#define PORT(x) GLUE(PORT, x)
#define PIN(x) GLUE(PIN, x)
#define DDR(x) GLUE(DDR, x)
#define b(x) (1<<(x))
#define set1 |=
#define set0 &= ~
#define toggle ^=
volatile uint8_t wstrzas=0;
(...)
ISR(INT1_vect){
// lcd_goto(1,0);
lcd_zint(wstrzas);
_delay_ms(500);
wstrzas=1;
// lcd_goto(1,0);
lcd_zint(wstrzas);
_delay_ms(500);
}
(...)
int main(void){
//deklaracja wolnych pinów jako in+pullup
DDRD=0x00;
PORTD=0xff;
DDRA=0x00;
PORTA=0xff;
//deklaracja klawki
DDRC=0x0f;
PORTC=0xff; //pullup + logika negacji
//init drutów
DDRA=0x00;
PORTA=0xff;
lcd_init();
wczytaj_ustawienia();
TCCR1B set0 (b(2));
TCCR1B set1 (b(1)|b(0)); //preskaler64
OCR1A=15625;
MCUCR set0 b(3);
MCUCR set0 b(2);
GICR set1 b(7); //czujnik wstrząsów
prestart:
lcd_cls();
lcd_text("Startujemy?!");
sei();
do{
lcd_goto(0,0);
lcd_zint(wstrzas);
/* if(GIFR&b(7)){
lcd_zint(1);
GIFR set1 b(7); }
else lcd_zint(0);
*/
_delay_ms(500);
_delay_ms(300);
wstrzas=0;
// lcd_rozkaz(0x1c);
//keycheck();
//if(kl[12]==1) setup();
//if(kl_o==13) goto start;
}while(1);
Instrukcje zakomentowane to rózne wersje testowe (albo oryginalne instukcje z programu), tak samo zakomentowywałem ISR. Więcej nie umieszczam bo program jest duży ale ta pętla jest wieczna
Macie jakieś pomysły na to co zrobić z dziwnym zachowaniem procka?
PS: aha, czyszczenie flagi GIFR w przerwaniu też nic nie daje, w manualu jest ze powinna sama się czyścić ale i tak spróbowałem.
PS2: testowane zarówno przy przerwaniu na opadającym zboczu jak i przerwaniu na low level, różnic jakby nie ma...