• Welcome to LusoRobótica - Robótica em Português.
 

fazer uma plotter com uma hp

Started by pmj_pedro, 19 de June de 2012, 00:19

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

pmj_pedro

Quote from: senso on 23 de June de 2012, 22:51
Não estás a perceber.
Do encoder, metes por exemplo canal A no pino INT0, e o canal B metes num qualquer outro pino do micro, depois a interrupção fica algo assim:

ISR(INT0_vect){

if((ENCBPIN & (1<<ENC1B)) == 0){
encoderA++;
}
else {
encoderA--;
}
}


tou a perceber, ai so estas a testar quando o canal A passa de 0 para 1, mas deu para perceber o que estavas a dizer
obd

senso

Isso depende se queres ler os encoders em "modo" x1, x2 ou x4, para a utilização do meu caso o x1 chega.
Avr fanboy

pmj_pedro

Quote from: senso on 23 de June de 2012, 23:01
Isso depende se queres ler os encoders em "modo" x1, x2 ou x4, para a utilização do meu caso o x1 chega.

Se gerar a interrupçao quando o canal A muda, entao devo ficar em 'modo' 2x
Para ficar em 4x tinha de ser os dois canais a gerar interrupçoes?

pmj_pedro

tou a tentar aprender a lidar com interrupçoes no arduino, mas nao estou a ter sucesso.

#include <avr/interrupt.h>

int main(){
  pinMode(13,OUTPUT);
  digitalWrite(2,HIGH);
  cli();
  EICRA = (0<<ISC01) | (1<<ISC00);  // logical change
  EIMSK = (1<<INT0);                // external enable
  EIFR = (0<<INTF0);                // clean flag
  sei(); // Enable all interrupts

while (1) {  }
}

ISR(PCINT0_vect){
  digitalWrite(13, !digitalRead(13));   // toggle LED pin
  EIFR = (0<<INTF0);
}


Nunca fiz isto em avr, so no pic32 e acho que era deste estilo

edit:
quero fazer isto sem usar as funçoes attachinterrupt ...

senso

Não precisas de mexer em nenhuma flag, isso dá asneira, nos pics é que tens de andar a limpar flags á mão, nos avr's não.
Aconselho-te a leres a datasheet, está lá tudo explicadinho.
E que sinal estás a dar no pino INT0?
Se for um botão, que tem montes de bounce o led pode acabar por ficar no mesmo estado e não vês as várias vezes que ele faz o toogle por ser tão rápido, e o arduino aceita isso do main()?
Avr fanboy

pmj_pedro

#50
sim posso escrever programar no ardunio IDE, como se fosse C, ele aceita o main em vez do setup e do loop

eu fiz esse bocado de codigo pelo datasheet, mas nao sei o que esta a falhar. Nao é um botao, é msm um um cabo que esta ligado ao pin2 e depois tanto ponho no gnd como tiro, acho que o pull up interno esta activo

o erro deve ser do vector, exprimentei por 0x002, INT0 ... e nd

edit:
   agr para testar pus um Serial.print e nao vejo nd na consola

zedlav

Boas.

Vais ter de trocar o nome do vector de PCINT0_vect para INT0_vect pois é este que estás a activar no teu código.
Para consulta: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

pmj_pedro

Quote from: zedlav on 24 de June de 2012, 19:37
Boas.

Vais ter de trocar o nome do vector de PCINT0_vect para INT0_vect pois é este que estás a activar no teu código.
Para consulta: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

obrigado, ja esta a funcionar, so nao percebo é pk a interupçao so funciona das primeiras vezes.
Tou a usar um cabo ligado ao pin2, que tem uma resitencia pull-up de 10k, e vou ligando e desligando do gnd, da primeira vez que faço activa a interrupçao umas 4 vezes, e depois nao funciona mais

#include <avr/interrupt.h>

int main(){
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  pinMode(2,INPUT);
  digitalWrite(2,HIGH);
  cli();
  EICRA = (0<<ISC01) | (1<<ISC00);  // logical change
  EIMSK = (1<<INT0);                // external enable
  EIFR = (0<<INTF0);                // clean flag
  sei(); // Enable all interrupts

while (1) {  }
}

ISR(INT0_vect){
  digitalWrite(13, !digitalRead(13));   // toggle LED pin
  Serial.print('+');
}

zedlav

O problema está na função Serial.print penso eu. Mas não sou a melhor pessoa para falar sobre a lib do arduino.
Mas seguindo isto parece ser esse o problema: http://code.google.com/p/arduino-pinchangeint/wiki/Usage#Serial.print%28%29_Inside_an_ISR

pmj_pedro

Quote from: zedlav on 24 de June de 2012, 22:02
O problema está na função Serial.print penso eu. Mas não sou a melhor pessoa para falar sobre a lib do arduino.
Mas seguindo isto parece ser esse o problema: http://code.google.com/p/arduino-pinchangeint/wiki/Usage#Serial.print%28%29_Inside_an_ISR

era isso, resolveu o problema, obgd

pmj_pedro

#55
ate hoje estive convencido que isto https://dl.dropbox.com/u/31280811/IMG_20120715_014042.jpg (09864+0029) era um optical enconder, mas nao encontro nunhuma informçao na net, nao sei qual das patas sao a alimentao e o canal, nem a que ddp alimentar

como posso descubrir?

edit:https://dl.dropbox.com/u/31280811/IMG_20120715_015443.jpg

Hugu

#56
isso parece mais uma ponte..  ??? (apenas uma opiniao, pk n faço ideia..pk nunca vi tal coisa!)


pmj_pedro

#57
Quote from: Hugu on 15 de July de 2012, 02:14
isso parece mais uma ponte..  ??? (apenas uma opiniao, pk n faço ideia..pk nunca vi tal coisa!)

passa uma fita no meio, tenho quase a certeza que é uma optical enconder, mas nao sei como ligar e tenho medo de estraga-lo

acho que ja descubri, nao é igual mas deve de ter o msm pin-out : http://mckgyver.pbworks.com/f/Agilent_Optical_Encoders.pdf

Hugu

Quote from: pmj_pedro on 15 de July de 2012, 02:30
Quote from: Hugu on 15 de July de 2012, 02:14
isso parece mais uma ponte..  ??? (apenas uma opiniao, pk n faço ideia..pk nunca vi tal coisa!)

passa uma fita no meio, tenho quase a certeza que é uma optical enconder, mas nao sei como ligar e tenho medo de estraga-lo

acho que ja descubri, nao é igual mas deve de ter o msm pin-out : http://mckgyver.pbworks.com/f/Agilent_Optical_Encoders.pdf

ya! é isso tudo! ainda fui pesquisar ao site a Agilent mas n tive sorte.. :P

pmj_pedro

esta aqui a impressora que estou a modificar:


mas o motor to papel, nao faz a pcb mover uniformente, as vezes desliza mais para um lado outras, nao se move tanto para a frente

ja ando a procura de uma soluçao a uns dois dias, mas ainda nao consegui resolver, alguem tem uma sujestao?