Перейти к содержанию
    

Tolyaha

Свой
  • Постов

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

  • Посещение

Весь контент Tolyaha


  1. SPI и Atmega128A

    Стоп машина, а PB1 (SCK) МК куда у Вас подключен????? Он должен быть подключен к входу SCLK АЦП (пин 1). А на вход CLK (пин 2) АЦП можно подать 60кГЦ от другого источника (только не такт от SPI), а можно и не подавать и использвать внутренний генератор АЦП. Схему покажете, меньше вопросов будет. ЗЫ: CS АЦП подключи на общий, и на 15 пине АЦП (DOUT), который должен быть подключен к MISO МК, исправный АЦП по умолчанию будет выдавать 4 Hz частоту.
  2. SPI и Atmega128A

    Если точно SCK отсутствует (а не осцил неправильно настроен), то вариантов 2: - или Вы в программе кроме показанного участка порты перенастраиваете; - или пин у контроллера не работает. Если SPI чувствует FF или 00 ( при закорачивании) значит он включен и вход MISO работает. Проверте осцилом порты SCK и MOSI (PB1, PB2) настраивая их на вывод 0 (может залепуха или пробой пина).
  3. Может проблемы с файлом таблицы векторов типа startup_stm32f2xx.s вы его добавили из библиотеки в проект, а нельзя в отладке проследить на какой адрес прыгает по прерыванию, возможно станет понятно.
  4. Попробуйте в опциях компилятора в настройках препроцессора где defined symbol добавить VECT_TAB_FLASH
  5. Возможно не хватает загрузки адреса таблицы векторов функция NVIC_SetVectorTable();
  6. SPI и Atmega128A

    А как же это? Может не заметили в осциллограф?
  7. SPI и Atmega128A

    Ноль на CS обязательно, если АЦП рабочий, то на выходе данных (17 вывод) будет видна частота около 4 Hz (готовность данных). По умолчанию АЦП работает циклически с частотой 4Hz. Вобще, если работаеш только с одним АЦП по этим линиям связи, то можно CS навсегда запаять на ноль.
  8. SPI и Atmega128A

    а осцыла нету? проверь хоть проц, когда закорачиваеш MISO (вход SPI) на общий должно вместо 0xFF читать 0x00
  9. Xmega ADC

    Еще есть входной ток пина, который производитель допускает до 1мкА, что вызовет ошибку до 0,5 V на 0,5М (можно нарваться).
  10. SPI и Atmega128A

    Попрежнему хочу проверки связи, чтением статус регистра for (i = 0; i < 4;i++) spi_rw(0xFF); _delay_ms(10); /*проверкка связи с АЦП */ spi_rw(0x40);//настройка АЦП для чтения STATUS регистра spi_rw(0xFF);//должно прочитаться 0x80 (AD7792)/0x88 (AD7793)
  11. SPI и Atmega128A

    Давай попорядку, проверим связь и прочитаем статус регистр и сравним с Power-On/Reset = 0x80 (AD7792)/0x88 (AD7793) И просле сброса четырех 0xFF нада выдержать паузу необходимую для сброса 500мкс for (i = 0; i < 4;i++) spi_rw(0xFF); _delay_ms(1); /* настройка АЦП */ spi_rw(0b00010000); spi_rw(0b00010000); spi_rw(0b00000000); spi_rw(0b00101000); spi_rw(0b00000000);
  12. SendByteAD(0xff);// сброс АЦП (4 посылки 0xff) SendByteAD(0xff); SendByteAD(0xff); SendByteAD(0xff); ... // ожидаем 500 mks инициализацию АЦП ... SendByteAD(0x10);//настройка АЦП для записи в CONFIG регистр SendByteAD(0x00);//запись в CONFIG регистр HB (усиление 1) SendByteAD(0x10);//запись в CONFIG регистр LB (1 канал с буфером) SendByteAD(0x08);//настройка АЦП для записи в MODE регистр SendByteAD(0x20);//апись в MODE регистр HB (Single Conversion) SendByteAD(0x01);//запись в MODE регистр LB (Int 70 kHz Clock, 4 ms conversion) ... // ожидаем 5000 mks преобразование АЦП ... SendByteAD(0x58);//настройка АЦП для чтения данных ReadByteAD();//чтение данных АЦП 1 байт ReadByteAD();// чтение данных АЦП 2 байт ReadByteAD();// чтение данных АЦП 3 байт Может поможет вырезка из моей проги.
  13. SPI и Atmega128A

    Прошу прощения пошибся просто по тексту увидел Mega8535, а нада 128, тогда оставте это по старому, а остальное попробуйте #define DD_SS 0 #define DD_MOSI 2 #define DD_MISO 3 #define DD_SCK 1
  14. SPI и Atmega128A

    То что я увидел - нужно обратить внимание на сигнал SS (слейв селект PB4) он переключает режим из мастера в слейв низким уровнем на пине, если настроен как вход, если не собираетесь переключаться, то он не должен быть входом (ниже я настроил его выходом), и для этого АЦП, если вы подключаете SCK без инвертирования я поменял фазу и полярность. Попробуйте скорректированное мной (правда смотрел по быстрому, мог ошибиться проверте по даташиту: void spi_in(void) { #define DDR_SPI DDRB #define DD_SS 0 #define DD_MOSI 2 #define DD_MISO 3 #define DD_SCK 1 #define CPOL 3 #define CPHA 2 #define SPE 6 #define MSTR 4 #define SPR0 0 #define SPIF 7 PORTB |= (1<<DD_SCK)|(1<<DD_MOSI)|(1<<DD_MISO); DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS); DDR_SPI &= ~(1<<DD_MISO); //SPSR |= (1<<SPI2X); SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA); } P.S. А вобще в аврстудии есть инклюдник, описывающий все биты (m8535def.inc) или еще где можно найти и h файл с дефайнами (я думаю обязательно есть в для любой среды программирования)
  15. RCC->CFGR |= RCC_CFGR_SW_HSE; - подключит внешний тактовый вход HSE к системнным тактам SYS CLK RCC->CFGR |= RCC_CFGR_SW;- не допускается по даташиту (см. ниже 11: not allowed) RCC->CFGR|=RCC_CFGR_PLLSRC;- - подключит внешний тактовый вход HSE к умножителю PLL из библиотеки STM: #define RCC_CFGR_SW_HSE ((uint32_t)0x00000001) /*!< HSE selected as system clock */ #define RCC_CFGR_SW ((uint32_t)0x00000003) /*!< SW[1:0] bits (System clock Switch) */ #define RCC_CFGR_PLLSRC ((uint32_t)0x00010000) /*!< PLL entry clock source */ из даташита: Bits 1:0 SW: System clock switch Set and cleared by software to select SYSCLK source. Set by hardware to force HSI selection when leaving Stop and Standby mode or in case of failure of the HSE oscillator used directly or indirectly as system clock (if the Clock Security System is enabled). 00: HSI selected as system clock 01: HSE selected as system clock 10: PLL selected as system clock 11: not allowed Bit 16 PLLSRC: PLL entry clock source Set and cleared by software to select PLL clock source. This bit can be written only when PLL is disabled. 0: HSI oscillator clock / 2 selected as PLL input clock 1: HSE oscillator clock selected as PLL input clock
  16. Так попробуйте, если Ваш МК шимить с открытым коллектором может, а то транзистор нада добавлять.
  17. Так для такого применения и мое предложение прокатит, правда это только теоретически, но минимум элементов:
  18. Так как Вы скоркее всего прикрутите к МК этот усилитель, предлагаю вместо R1 параллельно несколько резисторов разных номиналов только подсоединенных не на общий, а к нескольким портам МК. когда порты МК в третьем состоянии получаем усиление 1, далее на один порт выдаем нулевой потенциал - усиление 2, на второй - 4 и т.д (разные комбинации - разное усиление зависит от задачи). 4 разряда - 16 уровней. Про ШИМ сразу не заметил как-то. ШИМ можно на R1 подать вместо общего (только ШИМ нада с открытым коллектором 0 или высокоомное состояние) и кондер параллельно R2 чтобы постоянная времени R2С была в несколько раз (десятков раз, от этого зависит пульсация на выходе) больше периода ШИМ, соответственно частота пропускаемая усилителем в несколько раз ниже частоты ШИМ, если постоянный ток то можно, а для звука уже не хватит частоты ШИМ Вашего МК.
  19. если 20 есть, то RD, WR, CS, BUSY, CONVST и DB0...DB13 соединяем с МК (19 из 20 один свободный). Только даташит прийдется освоить, если нужно работоспособную схему создать. H/S SEL подключаем на питание (програмный выбор каналов), SL3, SL4 на общий, остальные не трогаем.
  20. Тогда 14 линий данных, RD и CONVST прийдется подключать к МК полюбому, нада минимум 16 портов или дополнительный регистр (микросхему) применять. Пример подключения и описание сигналов есть в Datasheet (ссылка на него есть на указанной Вами страничке).
  21. UART STM32

    Помоему нужно сформировать прерывание по нажатию кнопки (изменению сигнала на пине ) и там начать передачу первого байта передать, а остальные уже по вашей технологии через окончание передачи. Можно при помощи DMA (автоматом все нужные байты передадутся из памяти в UART). Можно послать первый байт там, где формируется message_must_send=1, если передатчик пуст, а если он занят, то сработает прерывание завершения передачи и дальше Ваш метод сработает. Я думаю невозможно, это осуществляется аппаратно нужно чтобы передача пошла и остановилась (сперва передатчик должен быть загружен, а когда он опустошится и не загрузятся новые данные, тогда и возникнет это прерывание).
  22. Вот ссылка вроде ниче не раскидано во вкладке Design support все и доки есть и библиотеки с примерами кода например STM32F10x standard peripheral library.
  23. Можно взять самый дешовый микроконтроллер с АЦП. 1. С резисторного делителя мерять управляющие 0-10В (подобрать чтобы выходной код АЦП был 0-255). 2. Формировать ШИМ сигнал на управление симистором периодом 255*10=2550ms (255 полупериодов сети) и длительностью в зависимости от принятого кода АЦП 0-255. Получится то, что Вам хочется. PS можно принимать с компа сразу код 0-255 через RS232 (UART) без дополнительной аналоговой платы
×
×
  • Создать...