По инету, где описывают прерывание (включая видеоуроки), говорят, что подтягивающий резистор и само прерывание нужно подключать на общий провод.
Но когда закинул мелкую прогу на ATtiny2313A (с 2-я прерываниями), прерывание на общем проводе не работали, а на VCC работали.
На 8515 и 8535 работает нормально. ))
Подскажите плз, что это за прикол. Почему так? Может что-то упустил из даташита?
Для точности даю код и видео, как работает:
http://www.youtube.com/watch?v=JBMInzEEQog
CODE
#include <tiny2313a.h>
#include <delay.h>
// Speed
int speed = 1000;
// GoTo left
void toLeft(void)
{
if (PORTB.0 == 1) {
PORTB = 0b10000000;
delay_ms(speed);
}
PORTB = PORTB >> 0b1;
}
// GoTo right
void toRight(void)
{
PORTB = PORTB << 0b1;
if (PORTB.7 == 1) {
delay_ms(speed);
PORTB = 0b00000001;
}
}
interrupt[3] void changeType()
{
PORTD.0 ^= 1;
}
interrupt[2] void changeSpeed()
{
speed -= 100;
if (speed < 100) {
speed = 1000;
}
}
// Main
void main(void)
{
DDRB = 0xFF;
PORTB = 0x01;
DDRD = 0b00001101;
PORTD = 0b00000001;
MCUCR = 0b00001010;
GIMSK = 0b11000000;
#asm("sei");
while (1) {
delay_ms(speed);
if(PORTD.0 == 1) { toLeft(); }
else { toRight(); }
}
}
#include <delay.h>
// Speed
int speed = 1000;
// GoTo left
void toLeft(void)
{
if (PORTB.0 == 1) {
PORTB = 0b10000000;
delay_ms(speed);
}
PORTB = PORTB >> 0b1;
}
// GoTo right
void toRight(void)
{
PORTB = PORTB << 0b1;
if (PORTB.7 == 1) {
delay_ms(speed);
PORTB = 0b00000001;
}
}
interrupt[3] void changeType()
{
PORTD.0 ^= 1;
}
interrupt[2] void changeSpeed()
{
speed -= 100;
if (speed < 100) {
speed = 1000;
}
}
// Main
void main(void)
{
DDRB = 0xFF;
PORTB = 0x01;
DDRD = 0b00001101;
PORTD = 0b00000001;
MCUCR = 0b00001010;
GIMSK = 0b11000000;
#asm("sei");
while (1) {
delay_ms(speed);
if(PORTD.0 == 1) { toLeft(); }
else { toRight(); }
}
}
P.S.
Возможно для кого-то будет казаться вопрос смешным, то учтите, что только второй день как влез в эту "дребедень".