• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

shematehnik

Members
  • Публикации

    104
  • Зарегистрирован

  • Посещение

Репутация

1 Обычный

О shematehnik

  • Звание
    Осваивающийся
  • День рождения 11.10.1987

Контакты

  • ICQ
    0

Информация

  • Пол
    Мужчина
  • Интересы
    Электроника, программирование, музыка
  • Город
    Беларусь
  1. Глюк Stm8S003 Или Ошибка В Коде?

    Делюсь решением проблемы, может найдется еще такой бедолага, у которого возникнет такая же проблема Наконец-то нашел причину. Все просто до смеха. Попробовал читать регистры ADC_DRH и ADC_DRL в обратной последовательности и все стало работать правильно без влияния каналов друг на друга. Видимо чтение регистра ADC_DRH запускает следующее преобразования, а тем временем я еще забираю оставшуюся часть значения из ADC_DRL. Пришел к такому выводу чисто в отладке. В IAR есть такое окно Live Watch, где можно почти в реальном времени видеть состояние любого регистра или переменной. Так вот настроил на одном входе 0 В, а на другом 3.3В. По логике должны быть поочередно в регистрах ADC_DRH и ADC_DRL значения 0x00:0x00 и 0x03:0xff соответственно или близкие к ним. Так и было на самом деле. Но что самое прикольное, в переменных, куда я читал результат были совсем другие значения. Потом вычитал два регистра как один 16-битный (в IAR не было такого дефайна): adc_ain6 = *(unsigned int*)&ADC_DRH Значения стали записываться правильные. Потом попробовал наоборот читать ADC_DRL сразу, потом ADC_DRH и все также хорошо работало. Странно, почему же в мануале написали порядок чтения наоборот... Кстати, возникла мысль, что после чтения регистра ADC_DRH у меня возникает следующее прерывания до того, как я прочитаю ADC_DRL . Но в отладке такого замечено не было. До сих пор не совсем точно понимаю почему напряжения смешивались..
  2. Глюк Stm8S003 Или Ошибка В Коде?

    Сегодня осциллографом проверил пин, на котором генерируется ШИМ и который является одним из входов AIN. АЦП в сканирующем режиме вносит не хилые помехи в ШИМ-сигнал, о чем собственно и писали в документации, что нельзя AIN использовать в качестве выходов Долбаный stm8
  3. Глюк Stm8S003 Или Ошибка В Коде?

    Оставил сканирующий режим АЦП. Влияние режима на цифровые входы "на глаз" не замечено) Пусть будет пока так. В схему внести изменения не могу, это готовое устройство со своей прошивкой. Просто нужно изменить алгоритм работы. Все равно тогда не понятно: как в сканирующем режиме открытия "ворот" хватает на заряд конденсатора? Ведь суть одна и та же, просто каналы мультиплексируются аппаратно. Я бы на месте производителя лучше вообще убрал этот одиночный режим, а в режиме сканирования добавил возможность самому создавать набор нужных каналов.
  4. Глюк Stm8S003 Или Ошибка В Коде?

    Оптимизацию я отключил пока: // 27 // 28 for(unsigned long int delay = 0; delay < 0xfff; delay++); ??adc_conv_1: CLRW X LDW S:?w1, X LDW S:?w0, X ??adc_conv_2: LDW X, S:?w0 CPW X, #0x0 JRNE L:??adc_conv_3 LDW X, S:?w1 CPW X, #0xfff ??adc_conv_3: JRNC L:??adc_conv_4 CALL L:?inc32_l0_l0 JRA L:??adc_conv_2 Сделал запуск АЦП по внешнему триггеру от таймера 1 с периодом запуска 20 мс, вроде все работает отлично, но это в режиме "Single scan mode" Сейчас попробую сделать запуск от таймера, но с ручным переключением каналов, т.е. "Single mode". Попробовал, такая же беда, как и без таймера Вообщем ST Electronics где-то накосячили... Видимо режим Single mode предназначен только для одного входа, но в то же время нет других режимов, которые позволяли сканировать только выбранные входы, можно только сразу все, что неудобно из-за такой вот вещи: When using scan mode, it is not possible to use channels AIN0 to AINn in output mode because the output stage of each channel is disabled when it is selected by the ADC multiplexer. А это как раз мой случай, когда другие AIN используются как цифровые выходы... Мда.. еще ни с одним контроллером не было столько секаса. Видно сильно торопились выпустить самый дешевый мк.
  5. Глюк Stm8S003 Или Ошибка В Коде?

    Вот максимально упростил программу для работы только с АЦП. Проблема пока осталась. #include <iostm8s003f3.h> #include <intrinsics.h> unsigned int adc_ain5, adc_ain6; void adc_init(){ CLK_PCKENR2 |= 0x08; //Включаем тактирование АЦП (по умолчанию вкл) //Отключение триггеров Шмитта по всем каналам //ADC_TDRL = 0xff; //ADC_TDRH = 0xff; ADC_CR1_bit.SPSEL = 0x07; //Предделитель Fosc/18 ADC_CR1_bit.CONT = 0; //Одиночный режим конвертирования ADC_CSR_bit.EOCIE = 0; //Выключить прерывания по завершению преобразования ADC_CSR_bit.AWDIE = 0; //Выключить прерывания watchdog ADC_CR2 = 0; ADC_CR2_bit.ALIGN = 1; //Правое выравнивание результата преобразования ADC_CR1_bit.ADON = 1; ADC_CR1_bit.ADON = 1; } void adc_conv(){ //Выбор канала if(ADC_CSR_bit.CH != 5) ADC_CSR_bit.CH = 5; else ADC_CSR_bit.CH = 6; for(unsigned long int delay = 0; delay < 0xfff; delay++); //начало преобразования ADC_CR1_bit.ADON = 1; //ждем окончания преобразования while(!ADC_CSR_bit.EOC); //сброс флага окончания ADC_CSR_bit.EOC = 0; //Забираем результат if(ADC_CSR_bit.CH == 5){ adc_ain5 = ADC_DRH << 8; adc_ain5 |= ADC_DRL; } else { adc_ain6 = ADC_DRH << 8; adc_ain6 |= ADC_DRL; } } void main() { adc_init(); while(1){ adc_conv(); } }
  6. Глюк Stm8S003 Или Ошибка В Коде?

    //****************************************************************************** //Инициализация АЦП //****************************************************************************** void adc_init(){ //Отключение триггеров Шмитта по всем каналам ADC_TDRL = 0xff; ADC_TDRH = 0xff; ADC_CR1_bit.SPSEL = 0x07; //Предделитель Fosc/18 ADC_CR1_bit.CONT = 0; //Одиночный режим конвертирования ADC_CSR_bit.EOCIE = 0; //Выключить прерывания по завершению преобразования ADC_CSR_bit.AWDIE = 0; //Выключить прерывания watchdog ADC_CR2 = 0; ADC_CR2_bit.ALIGN = 1; //Правое выравнивание результата преобразования CLK_PCKENR2 &= ~0x08; //Выключаем тактирование АЦП (по умолчанию вкл) adc_stage = ADC_STG_INIT; } //****************************************************************************** //Запуск преобразований АЦП //****************************************************************************** char adc_start(){ //Включаем тактирование АЦП CLK_PCKENR2 |= 0x08; //Если нет списка каналов, то не запускаемся if(adc_channels_list.list == NULL) return 0; else { adc_channels_list.current = adc_channels_list.list; ADC_CSR_bit.CH = adc_channels_list.current->channel; } ADC_CSR_bit.EOCIE = 1; //Включить прерывания по завершению преобразования ADC_CR1_bit.ADON = 1; //Первая установка бита выводит из спящего реж. ADC_CR1_bit.ADON = 1; adc_stage = ADC_STG_STRT; return 1; } .............. //****************************************************************************** //Обработка результатов измерения АЦП //****************************************************************************** #pragma vector=ADC1_EOC_vector __interrupt void adc_conv_done(void){ //Завершение преобразования if(ADC_CSR_bit.EOC){ ADC_CSR_bit.EOC = 0; if(adc_channels_list.list){ //Считываем показания АЦП и запоминаем их в переменную *adc_channels_list.current->variable = ADC_DRH; *adc_channels_list.current->variable <<= 8; *adc_channels_list.current->variable |= ADC_DRL; //Выбираем следующий канал АЦП adc_channels_list.current = adc_channels_list.current->next_channel; ADC_CSR_bit.CH = adc_channels_list.current->channel; } } //Запуск следующего преобазования ADC_CR1_bit.ADON = 1; } Схема тут не добавляется
  7. Глюк Stm8S003 Или Ошибка В Коде?

    Задержка тоже не помогает. Можно было бы попробовать применить режим сканирования, но у меня другие входы AIN работают в цифровом режиме
  8. Глюк Stm8S003 Или Ошибка В Коде?

    Пробовал в SPSEL записывать максимально возможное значение. Все равно это не помогло. Пробовал один и тот же канал выбирать подряд по 10 раз, потом второй (ну грубо говоря сразу 10 раз один канал сканировать потом другой), но все равно показания "прыгают". На первый канал подключена клавиатура с 5-ю кнопками, которая представляет собой делитель напряжения и в зависимости от нажатой кнопки соотношение меняется, а соответственно и напряжение на входе АЦП разное. В исходном состоянии все кнопки отпущены и вход подтянут к земле резистором 1МОм. На второй вход АЦП поступает с делителя выходное напряжение источника. Так вот с этого входа максимальное показание достигает где 500 отсчетов, причем при вращении потенциометра показания АЦП периодически проходят через 0 и снова нарастают. Или может показывать 500 единиц, но если при этом на втором канале АЦП нажать кнопку, то показания могут на несколько сотен уменьшиться. По отдельности что клавиатура, что измеритель выходного напряжения работают отлично...
  9. При написании программы под контроллер STM8S003 столкнулся с такой проблемой. Когда я работаю с одним каналом АЦП, то все работает правильно, измеренные показания соответствуют действительности. Но когда начинаю сканировать два канала, то они влияют на показания друг друга и в результате я получаю какой-то бред, вместо правильных показаний. По отдельности они работают отлично. Режим выбрал "Single mode". Запускаю преобразования битом ADON. По прерыванию EOC забираю значение из регистра данных, выбираю следующий канал в ADC_CSR_bit.CH и снова битом ADON запускаю новое преобразование. Что не так я делаю или есть какой-то заводской глюк. Другие режимы мне не подходят.
  10. Не работает SPI на модуле USCI_B в микроконтроллере MSP430F249. А если более конкретно, то после того, как записываю данные в регистр передачи UCB1TXBUF, флаг UCB1TXIFG в регистре UC1IFG не устанавливается. Пока железа под рукой не имею, поэтому проверяю программу в протеусе. Вот исходный код инициализации: void spi_init(){ //Настройка ножек, связанных с SPI gpio_port_init(SPI_CS_PORT); spi_so_clk_init(TEMP_SENS_SO); spi_so_clk_init(TEMP_SENS_CLK); //Переводим USCI в состояние сброса и сбрасываем настройки регистра UCB1CTL1 = UCSWRST; //Источник тактирования USCI выбираем SMCLK UCB1CTL1 |= UCSSEL_2; //Передача по переднему фронту, прием по заднему //CLk в нуле при неактивном состоянии //MSB первый //8-битный режим //Режим мастера //3-проводной режим //Синхронный режим SPI UCB1CTL0 = UCMST | UCMSB | UCSYNC; //Выставляем частоту работы SPI = 1MHz UCB1BR0 = 16; UCB1BR1 = 0; //Сброс всех флагов ошибок UCB1STAT = 0; //Запускаем USCI UCB1CTL1 &= ~UCSWRST; //Запретить прерывания по приему и передаче UC1IE &= ~(UCB1TXIE | UCB1RXIE); //Сброс флагов прерываний UC1IFG &= ~UCB1RXIFG; } Вот код передачи данных: spi_select(sensor_num); //Передаем произвольные данные UCB1TXBUF = 0x00; //Дожидаемся завершения передачи while(!(UC1IFG & UCB1TXIFG)); //Дожидаемся приема первого байта while(!(UC1IFG & UCB1RXIFG)); //Забираем первый байт значения температуры temperature = UCB1RXBUF; temperature <<= 8; //Передаем произвольные данные UCB1TXBUF = 0xFF; //Дожидаемся завершения передачи while(!(UC1IFG & UCB1TXIFG)); //Дожидаемся приема первого байта while(!(UC1IFG & UCB1RXIFG)); //Забираем второй байт значения температуры temperature |= UCB1RXBUF; spi_unselect(sensor_num); Кто знает в чем проблема?
  11. Определение Установки Соединения Hc-07 Bluetooth

    Если я не хочу менять настройки модуля, то я просто отправляю необходимы данные по UART и они передаются на комп? А если модуль не вышел из AT-режима?
  12. Здравствуйте! Кто работал с модулем подскажите: как проверить установил ли модуль соединение с устройством? В документации смог найти только то, что он при подаче питания сразу входит в режим приема АТ-команд, при этом должен мигать светодиод. А если мне не нужно производить никакие настройки, как понять что модуль установил соединение. Пока только это можно определить по постоянно светящемуся светодиоду. Может быть есть какая-то команда? И я что-то не понял как перейти в режим передачи данных...
  13. 500$ всего лишь?) Что-то не верится даже...
  14. Станок для гибки проволоки А в рублях как выразить это "много"?
  15. Ребята, подскажите пожалуйста, сколько будет стоить примерно разработка схемы платы управления, ее изготовление и программирование, а также написание программы под windows для станка, имеющего 6 сервоприводов?