collapse

* Posts Recentes

Fabricação de ferramenta de corte por zordlyon
[Ontem às 00:23]


SCT-013 + i2c eeprom, Gravar e Ler dados. por dennis_boy
[23 de Abril de 2018, 21:43]


Controlar Motor AC por senso
[23 de Abril de 2018, 12:34]


Apresentação do Legendary Urban Hacker por Sarat
[23 de Abril de 2018, 00:24]


Redes LoRa por ralex
[22 de Abril de 2018, 22:53]


Canal de video aulas no youtube! por zkreamer
[22 de Abril de 2018, 21:58]


Nueva en el Foro!!!!!!!! me presento!! por zkreamer
[22 de Abril de 2018, 21:48]


Alguem usa as libs md_max72xx e md_parola ? por vasco
[21 de Abril de 2018, 23:44]


Paineis Fotovoltaicos para Autoconsumo (Kits EDP)? por KammutierSpule
[20 de Abril de 2018, 13:42]


Como repôr posições dos Icones/Pastas no Desktop W8? por senso
[19 de Abril de 2018, 23:55]

Autor Tópico: Interrupções em attiny25  (Lida 1638 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Interrupções em attiny25
« em: 05 de Março de 2011, 20:29 »
boas

estou aqui a tentar usar interrupções externas num attiny25, a minha ideia é usar 2 pushbuttons, um para ligar o led ligado ao pino PB4 e o outro para o desligar.

se eu usar este código, faz o pretendido, acende o LED:

Código: [Seleccione]
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void) {

DDRB |= (1<<PB4);

GIMSK = _BV (PCIE);             // ligar mudança de estado nas interrupções
PCMSK = _BV (PCINT0);             // ligar interrupções no pino INT0
MCUCR = _BV (ISC00);            // detectar mudança estado INT0
sei();                          // ligar interrupções globais

    while(1) {
    }

return 0;
}

ISR (PCINT0_vect)              // Interrupção do Pino PB0 (INT0)
{
   PORTB |= (1<<PB4);
}

mas se usar este, com os 2 pushbuttons, seguindo a mesma lógica de cima já não funciona:
Código: [Seleccione]
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void) {

DDRB |= (1<<PB4);

GIMSK = _BV (PCIE);             // ligar mudança de estado nas interrupções
PCMSK = _BV (PCINT0);             // ligar interrupções no pino INT0
MCUCR = _BV (ISC00);            // detectar mudança estado INT0
PCMSK = _BV (PCINT1);             // ligar interrupções no pino INT1
MCUCR = _BV (ISC01);            // detectar mudança estado INT1
sei();                          // ligar interrupções globais

    while(1) {
    }

return 0;
}

ISR (PCINT0_vect)              // Interrupção do Pino PB0 (INT0)
{
   PORTB |= (1<<PB4);
}

ISR (PCINT1_vect)              // Interrupção do Pino PB1 (INT1)
{
   PORTB &= ~(1<<PB4);
}

o que é que estou a fazer mal?

EDIT: esqueci-me de referir, no segundo código tenho um warning:
Código: [Seleccione]
../t25int.c:26: warning: 'PCINT1_vect' appears to be a misspelled signal handler
« Última modificação: 05 de Março de 2011, 20:38 por CBX »

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: Interrupções em attiny25
« Responder #1 em: 05 de Março de 2011, 21:00 »
Verifica o Hardware se tá tudo bem...

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Interrupções em attiny25
« Responder #2 em: 05 de Março de 2011, 21:05 »
já verifiquei e voltei a verificar, com o hardware não parece haver problema...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.489
  • Helpdesk do sitio
Re: Interrupções em attiny25
« Responder #3 em: 05 de Março de 2011, 22:19 »
Devias dar ouvidos ao compilador, se ele diz que aquilo nao é um vector de interrupcao nao vai gerar código para o mesmo, logo nao funciona, ve o datasheet.
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Interrupções em attiny25
« Responder #4 em: 05 de Março de 2011, 23:52 »
vamos lá ver se estou a perceber as coisas:

ao ler a datasheet vejo que o attiny25 só tem um "Pin Change Interrupt Request", INT0, ou seja qualquer um dos pinos vai apenas "despertar" a mesma interrupção e não dá para fazer o que eu quero com os 2 botões, dai o warning??

Edit: já vi que é assim  ;D
« Última modificação: 05 de Março de 2011, 23:58 por CBX »

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.265
    • Tróniquices
Re: Interrupções em attiny25
« Responder #5 em: 06 de Março de 2011, 00:04 »
A doc do winavr tem uma tabela com as interrupções e respectivos nomes suportadas por cada modelo de AVR.

Tens um pull-up/pull-down nos botões? E debouncing?

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Interrupções em attiny25
« Responder #6 em: 06 de Março de 2011, 00:11 »
tenho pull down, 1.8k, debouncing neste caso acho que não é preciso pois só lá está uma instrução, mesmo que carregue no botão várias vezes não vai mudar o estado.

o meu problema era estar a pensar que "um pino, uma interrupção" mas agora acho que  já percebi a coisa...

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: Interrupções em attiny25
« Responder #7 em: 06 de Março de 2011, 01:07 »
já está tudo a funcionar como eu queria, obrigado a todos pela ajuda:

Código: [Seleccione]
#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void) {

int val;

DDRB |= _BV(PB4);
DDRB &= ~_BV(PB1);
PORTB |= _BV(PB1);

GIMSK = _BV(PCIE);
PCMSK = _BV(PCINT0);
MCUCR = _BV(ISC00);
sei();

    while(1) {

val = PINB & _BV(PB1);

if (val == 0) {
_delay_ms(10);
}
if (val == 0) {
PORTB |= _BV(PB4);
}
}

return 0;
}

ISR (PCINT0_vect)
{
PORTB &= ~_BV(PB4);
}