WItam, mam problem na który nie mam pomysłu. Na ATMEGA8A robie sterowanie silnikiem krokowymw 3 pozycjach lewo, prawo i stop,i dziala zgodnie z oczekiwaniami. Nastepnie dolaczylem do INT0 wlacznik krańcowy zeby generowal przerwanie i cofal silnikiem wrazie wystapienia przerwania. I tu zaczely sie schody bo podciagam VCC pod INT0 zeby przerwanie generowalo sie przy zwarciu wlacznika krancowego z masa, ale po odpaleniu caly czas sie kreci silnikczek a dopeiro w zwarciu z masą zatrzymuje sie i mozna nim sterować. a powinno byc na odwrót....moglby mi ktos kod przeanalizowac i pomoc??
Dodano po 13 [minuty]:
dodam ze jesli zewre vcc do INT0 przez rezystor to dziala wszytsko tak jak powinno, cos jakby wewnetrzne podciagniecie szwankowalo....
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define T1 (1<<PC0)
#define T2 (1<<PC1)
#define T3 (1<<PC2)
#define T4 (1<<PC3)
#define KROK1 PORTC |= T1; PORTC &=~ (T2|T3|T4)
#define KROK2 PORTC |= T2; PORTC &=~ (T1|T3|T4)
#define KROK3 PORTC |= T3; PORTC &=~ (T1|T2|T4)
#define KROK4 PORTC |= T4; PORTC &=~ (T1|T2|T3)
int main () {
MCUCR |= (1<<ISC01); //ustawiamy reakcje przerwań ze stanu 1->0
GICR |= (1<<INT0); //aktywujemy przerwania na INT0 i INT1
DDRC |= T1 | T2 | T3 | T4; //ustawiamy porty C jako wyjscia do silniczka KROKOWEGO
DDRB &=~ ((1<<PB1)|(1<<PB2)); // piny B ustawiamy jako wejscia od przelacznika kierunku obrotu
DDRD &=~ (1<<PD2); //pin D ustawiamy jako wejscia od przelacznikow krancowych
PORTC &=~ (T1|T2|T3|T4); //wyjsciowo silniczek wylaczony
PORTB |= (1<<PB1)|(1<<PB2); //piny B podciagniete pod VCC
PORTD |= (1<<PD2); //pin D podciagniete pod VCC
sei();
while(1) {
if(!(PINB & 0b00000100)) {
KROK1;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK4;
_delay_ms(10);
KROK1;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK4;
_delay_ms(10);
}
else if(!(PINB & 0b00000010)) {
KROK4;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK1;
_delay_ms(10);
KROK4;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK1;
_delay_ms(10);
}
else {
PORTD &=~ (T1|T2|T3|T4);
}
}
}
ISR(INT0_vect) {
KROK1;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK4;
_delay_ms(10);
KROK1;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK4;
_delay_ms(10);
}
ISR(INT1_vect) {
KROK4;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK1;
_delay_ms(10);
KROK4;
_delay_ms(10);
KROK3;
_delay_ms(10);
KROK2;
_delay_ms(10);
KROK1;
_delay_ms(10);
}
Dodano po 13 [minuty]:
dodam ze jesli zewre vcc do INT0 przez rezystor to dziala wszytsko tak jak powinno, cos jakby wewnetrzne podciagniecie szwankowalo....
