реклама на сайте
подробности

 
 
> AVR и цифровой штангенциркуль, кто-нибудь пробовал?
//Nikson
сообщение May 5 2007, 21:38
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 26-01-06
Из: Минск, Беларусь
Пользователь №: 13 651



Здравствуйте!
Есть задумка подключить цифровой китайский штангенциркуль к АВРке и сделать некое подобие системы сбора информации о перемещении образца при испытаниях. В Интернете удалось найти зарубежные образцы, описания итд. Например, здесь подробно про протокол обмена: http://www.shumatech.com/support/chinese_scales.htm и здесь http://www.yadro.de/digital-scale/protocol.html

вроде бы всё просто, но при реализации столкнулся с кучей проблем (как со стороны "железа" штангенциркуля, так и со стороны своей программы внутри АВРки).

Если кто-нибудь уже делал что-то подобное или не лень побеседовать на эту тему - напишите плиз, а то похоже что запутался я немного, помощь нужна...

самый пока что основной вопрос - постоянные ли там данные выходят из девайса.... судя по оисанию протокола - там идут два числа - абсолютное положение и относительное.. я же принимаю контроллером полнейшую мешанину из 1 и 0, которые к тому же всё время меняются sad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
//Nikson
сообщение May 5 2007, 23:56
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 43
Регистрация: 26-01-06
Из: Минск, Беларусь
Пользователь №: 13 651



вот пока не спится (2:31) решил добавить немного инфы:

если кратко в двух словах - ловим задний фронт сигнала, пытаемся выловить паузу между посылками (для этого запускаем таймер и по пришедшему переднему фронту смотрим, тикнул таймер или нет... если да - значит дальше можно считывать данные, если нет - снова пытаться поймать паузу)... ну а считываем по задним фронтам тактового сигнала... вроде несложно.... только ловится вот такая ерунда

001111101111110001111001111100001111011111100001
001111011111100001111001111101001111101111110101
101111000000011001111100000000001111000000011101
001111000000010001111000000011001111100000000101
001111100000000101111000000011101111100000000001
001111100000001001111100000000001111000000011001
001111011111100001111001111100101111001111101101
101111000000010101111000000010101111000000011001
001111100000000101111000000010001111000000010101

... в которой распознать двоичный дополнительный код ну никак не удаётся... то ли лыжи не едут.. то ли руки...

а вот и код:

Код
#include "ioavr.h"
#include "intrinsics.h"

#define SCALE_IDLE            1
#define SCALE_SEARCHPAUSE     2
#define SCALE_WAITPAUSE       3
#define SCALE_READDATA        4
#define SCALE_READY           5

unsigned char scale_status = SCALE_IDLE;
bool scale_timer_tick = false;
unsigned int troubles = 0;
unsigned char data[50] = {0x00};
unsigned int i = 0;

volatile unsigned char input1 = 0, input2 = 0, input3 = 0;
volatile unsigned char tcnt1 = 0;

#pragma vector = INT4_vect
__interrupt void INT4_ISR(void)
{
      switch (scale_status)
      {
            case SCALE_SEARCHPAUSE: //on falling edge
            {
                  //configuire pin 6 to be sensitive to rising edge of signal
                  EIMSK &= ~(1<<INT4);
                  EICRB |=  (1<<ISC41) | (1<<ISC40);
                  EIFR  |=  (1<<INTF4);
                  EIMSK |=  (1<<INT4);

                  TCNT1 = 0;                //reset timer counter
                  scale_timer_tick = false; //clear timer flag
                  TCCR1B |= (1<<CS12) | (1<<CS10);      //start timer

                  scale_status = SCALE_WAITPAUSE;

                  break;
            }

            case SCALE_WAITPAUSE: //on rising edge
            {
                  if (scale_timer_tick)
                  {
                        //pause found, prepare to read 48 bits data
                        i = 0;
                        scale_status = SCALE_READDATA;
                  }
                  else
                  {
                        //no pause found
                        ++troubles;             //test
                        scale_status = SCALE_SEARCHPAUSE; //go back to "SEARCH PAUSE" status
                  }

                  scale_timer_tick = false; //clear flag

                  //configuire pin 6 to be sensitive to falling edge of signal
                  EIMSK &= ~(1<<INT4);
                  EICRB |=  (1<<ISC41) | (0<<ISC40);
                  EIFR  |=  (1<<INTF4);
                  EIMSK |=  (1<<INT4);

                  break;
            }

            case SCALE_READDATA: //on falling edge
            {

                  //read data three times to avoid glitches
                  input1 = PINE;
                  __delay_cycles(10);
                  input2 = PINE;
                  __delay_cycles(10);
                  input3 = PINE;

                  if ((input1 & (1<<PINE5)) && (input2 & (1<<PINE5)) && (input3 & (1<<PINE5)))
                        data[i] = 1;
                  else
                        data[i] = 0;

                  ++i;

                  if (i >= 48)
                  {
                        troubles = 0;
                        i = 0;
                        scale_status = SCALE_IDLE; < breakpoint here
                  }


                  break;
            }
      }
}

#pragma vector = TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA_ISR(void)
{
      PORTC = 0xFF;
      tcnt1 = TCNT1;
      scale_timer_tick = true; //set flag
      TCCR1B &= ~((1<<CS12) | (1<<CS10));   //stop timer
      PORTC = 0x00;
}

void init_pins(void)
{
      //pin6 - PORTE4 - clock, pin7 - PORTE5 - data
      DDRE  &= ~((1<<DDE4) | (1<<DDE5));      //pins 6, 7 are set as inputs
      PORTE |=  ((1<<PORTE4) | (1<<PORTE5));  //enable pull-up resistors at pins 6, 7

      //configuire pin 6 to be sensitive to falling edge of signal
      EIMSK &= ~(1<<INT4);
      EICRB |=  (1<<ISC41) | (0<<ISC40);
      EIFR  |=  (1<<INTF4);
      EIMSK |=  (0<<INT4);

      DDRC = 0xFF;
      PORTC = 0x00;
}

void init_scale_timer()
{
      //set timer 1 to 100ms interval
      TCCR1A = 0x00;
      TCCR1B = (1<<WGM12) | (0<<CS12) | (0<<CS10); //CTC Timer1 mode, (OCR1A)
      TCCR1C = 0x00;
      OCR1A = 1210; //310 ms <============================ depend on system clock!
      TIMSK |= (1<<OCIE1A); //enable interrupt from system timer
      TIFR  |= (1<<OCF1A);  //clear flag
}

int main (void)
{

      init_pins();
      init_scale_timer();

      __enable_interrupt();

      for (;;)
      {
            if (scale_status == SCALE_IDLE)
            {
                  scale_status = SCALE_SEARCHPAUSE;
                  EIMSK |=  (1<<INT4);
            }

            __delay_cycles(10000);
      }

      return 0;
}


может свежим взглядом какой косяк заметен?
Go to the top of the page
 
+Quote Post
aesok
сообщение May 6 2007, 09:47
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



С атрибутом "volatile" должны объявляться не те переменые которые используються только в прерываниях (input1, input2, input3), а те которые используються и в прерываниях и в основной программе (scale_status)!!!

Анатолий.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- //Nikson   AVR и цифровой штангенциркуль   May 5 2007, 21:38
- - bgc   программа большая, сразу косяков не видать, может ...   May 6 2007, 06:27
- - _Sam_   м.б. засада в устранении glitch? Кодif ((i...   May 6 2007, 11:03
- - //Nikson   спасиб за советы, но пока что всё равно не работае...   May 6 2007, 12:21
- - _Sam_   Цитатапроцедура "синхронизации" Может си...   May 6 2007, 12:40
- - //Nikson   Цитата(_Sam_ @ May 6 2007, 14:40) Может с...   May 6 2007, 13:03
|- - Dog Pawlowa   Цитата(//Nikson @ May 6 2007, 16:03) кста...   May 6 2007, 14:18
- - Kovrov   Цитата(//Nikson @ May 6 2007, 01:38) Здра...   May 6 2007, 15:38
|- - Dog Pawlowa   Цитата(Kovrov @ May 6 2007, 18:38) А где ...   May 6 2007, 16:20
|- - //Nikson   Цитата(Kovrov @ May 6 2007, 17:38) А где ...   May 6 2007, 16:30
- - sensor_ua   Я бы всё-таки записал и посмотрел внимательно. А п...   May 6 2007, 17:38
- - Nanobyte   А может сначала попробовать собрать интерфейс по п...   May 6 2007, 17:39
- - Pyku_He_oTTyda   Завтра спрошу на работе, где такие штангели покупа...   May 6 2007, 18:11
- - satellite-plus   Цитата(//Nikson @ May 6 2007, 00:38) Здра...   May 7 2007, 05:35
- - //Nikson   спасибо всем, принявшим участие в обсуждении! ...   May 7 2007, 07:37
|- - aleksey_g   Цитата(//Nikson @ May 7 2007, 09:37) спас...   May 7 2007, 11:12
|- - Stas62   Цитата(//Nikson @ May 7 2007, 10:37) спас...   Jun 10 2007, 21:03
- - dem-vr   5 лет назад я подключал эту диковинку к AT90S8515 ...   May 12 2007, 20:43
- - //Nikson   ЦитатаУ меня похожая задача. хочу мерять вес через...   Jun 11 2007, 15:30


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 14:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01416 секунд с 7
ELECTRONIX ©2004-2016