Em muốn xác định chiều quay động cơ và nhân xung encoder nên em đã đưa 2 kênh A,B của encoder về 2 ngắt ngoài 6,7 của mega128.
chế độ ngắt là anychange (nếu theo em hiểu và làm là ngắt cả cạnh lên và cạnh xuống) nên ta sẽ có mỗi kênh sẽ x2 encoder, 2 kênh sẽ x4 encoder mà thôi.
cụ thể như sau:

trong ngắt kênh A, em sẽ kiểm tra mức logic của kênh A nếu =1 thì là ngắt cạnh lên, và =0 là ngắt cạnh xuống ==> từ đó đối chiếu với kênh B ta sẽ được chiều quay, và nhân 4 lần encoder như code sau đây.
nhưng nếu anychange hiểu như thế này thì em lại nghĩ khác.
Any logical change on INT1 generates a interupt reques (bất cứ 1 sự thay đổi nào trên chân INT1 sẽ tao ra một yêu cầu ngắt) như vậy thì không chỉ có ngắt rising và falling mà còn thêm 2 ngắt thay đổi mức logic nữa chứ. vd khi có cạnh lên thì sẽ có 2 yêu cầu ngắt (1 của rising và 1 của logic thay đổi từ 0->1) Dựa vào đó ta có thể x8 encoder không.
và hình như em cũng nghe có ai nói là có thể x8 encoder rồi. nhưng ko biết cánh làm.
các anh tư vấn giúp em thử.
chế độ ngắt là anychange (nếu theo em hiểu và làm là ngắt cả cạnh lên và cạnh xuống) nên ta sẽ có mỗi kênh sẽ x2 encoder, 2 kênh sẽ x4 encoder mà thôi.
cụ thể như sau:
trong ngắt kênh A, em sẽ kiểm tra mức logic của kênh A nếu =1 thì là ngắt cạnh lên, và =0 là ngắt cạnh xuống ==> từ đó đối chiếu với kênh B ta sẽ được chiều quay, và nhân 4 lần encoder như code sau đây.
interrupt [EXT_INT6] void ext_int6_isr(void)
{
if ((kenh2==1)&&(kenh1==1)) encoder++;
if ((kenh2==0)&&(kenh1==0)) encoder++;
if ((kenh2==1)&&(kenh1==0)) encoder--;
if ((kenh2==0)&&(kenh1==1)) encoder--;
}
interrupt [EXT_INT7] void ext_int7_isr(void)
{
if ((kenh1==1)&&(kenh2==0))encoder++;
if ((kenh1==0)&&(kenh2==1))encoder++;
if ((kenh1==1)&&(kenh2==1)) encoder--;
if ((kenh1==0)&&(kenh2==0)) encoder--;
}
{
if ((kenh2==1)&&(kenh1==1)) encoder++;
if ((kenh2==0)&&(kenh1==0)) encoder++;
if ((kenh2==1)&&(kenh1==0)) encoder--;
if ((kenh2==0)&&(kenh1==1)) encoder--;
}
interrupt [EXT_INT7] void ext_int7_isr(void)
{
if ((kenh1==1)&&(kenh2==0))encoder++;
if ((kenh1==0)&&(kenh2==1))encoder++;
if ((kenh1==1)&&(kenh2==1)) encoder--;
if ((kenh1==0)&&(kenh2==0)) encoder--;
}
Any logical change on INT1 generates a interupt reques (bất cứ 1 sự thay đổi nào trên chân INT1 sẽ tao ra một yêu cầu ngắt) như vậy thì không chỉ có ngắt rising và falling mà còn thêm 2 ngắt thay đổi mức logic nữa chứ. vd khi có cạnh lên thì sẽ có 2 yêu cầu ngắt (1 của rising và 1 của logic thay đổi từ 0->1) Dựa vào đó ta có thể x8 encoder không.
và hình như em cũng nghe có ai nói là có thể x8 encoder rồi. nhưng ko biết cánh làm.
các anh tư vấn giúp em thử.
Comment