6 690 сообщений в этой теме

Sergey-Ufa    616
13 часа назад, ya.kutier сказал:

#include <mega8.h> , в атмел студии 6.2 почему то ее нет

Это библиотека для CVAVR, а не для Студии

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
serega374    16

Подскажите у меня на Arduino UNO потенциал 1,5 вольта на пинах 1 и 0 (PORTD). Вообще уно использую для удобства подключения пока изучаю программирование ВЛИ. Пишу в Atmel Studio программирую МК и питаю USBasp-ом, у ВЛИ своё питание земли объеденены. Код залит такой:

#define F_CPU  8000000
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
   PORTB=0b0000000;
   PORTD=0b0000000;
 
    while (1) 
    {
    }
}

Из за этого потенциала открывается транзисторы BC847 двух сегментов и я не могу их зажечь. Этот потенциал что это неисправен контроллер? Или если так должно быть как решить проблему аппаратно? Я понимаю что не использовать эти пины самое простое но всё же. Резистор анодный 68 кОм

Скрытый текст

DSC08689.thumb.JPG.270ceb99db9370134777f68e02ebcb0b.JPG

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LEVV2006    158

Как написал так и сразу решил проблему :)

Изменено пользователем LEVV2006

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LEVV2006    158

Все привет! Возник такой вопрос. Осваиваю I2C шину. Для этого использовал эту статью

Подключил по шине часы DS3231. Часы заработали исправно, НО возник такой момент. Если устройство на шине отсутствует то контроллер зависает на строке "while (!TW_READY);". Точнее застревает в цикле. 

Как можно избежать этого момента? Есть какие ни будь приемы?

#define TW_SEND 0x84
#define TW_READY (TWCR & 0x80)
#define TW_STATUS (TWSR & 0xF8)

char I2C_SendAddr(char addr)// Послать адрес шины для подчиненного устройства.
{
   TWDR = addr;               // загрузка адреса устройства
   TWCR = TW_SEND;            // и отправка его
   while (!TW_READY);         // ожидание завершения <-----------------------------------------
   return (TW_STATUS==0x18);  // возврат 1, если устройство найдено, иначе возврат 0
}

И второй вопрос. Пытаюсь подключить микросхему EEPROM 24с32, но тоже не получается. Постоянно выдает значение 255. Как я понимаю из даташита нужно отправлять адрес микросхемы - потом 2 адреса ячейки - а потом данные. 

Скорее всего я не правильно шлю адрес ячейки. Есть ли какой ни будь толковый пример по работе с этой микросхемой?

 

Clock.rar

Изменено пользователем LEVV2006

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
30 минут назад, LEVV2006 сказал:

Как можно избежать этого момента? Есть какие ни будь приемы?

Существует такое понятие, как "таймаут". Это - отсчёт определённого времени и выход по нему из циклов (ну или других операций).
Таймаут можно сделать на таймере, а можно на простом инкременте(декременте) переменной.

Например, написав такой код :

int		timeout_count;
....
....
timeout_count = 100;
while (!TW_READY && --timeout_count)	continue;

мы убережёмся от зависания.

Далее, проверка, вышли по таймауту, или по условию :

if(!timeout_count){		// Вышли по таймауту
  i2c_flag_error = 1;
  return;
}

 

30 минут назад, LEVV2006 сказал:

Постоянно выдает значение 255

Это 0xFF. То, что записано в памяти по-умолчанию.
Может всё работает ? Попробуйте что-нибудь в неё записать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LEVV2006    158

Прием с тайм аутом интересен! Большое спасибо! Его нужно будет добавить в код.

48 minutes ago, Alex said:

Может всё работает ? Попробуйте что-нибудь в неё записать.

Так я записываю и сразу считываю.

#define AT24C32 0xAE 
void I2C_WriteP(char busAddr, char deviceRegister, char data) //Запись
{
	I2C_Start();
	I2C_SendAddr(busAddr);      
	I2C_Write(deviceRegister>>8); 
	I2C_Write(deviceRegister); 
	I2C_Write(data);          
	I2C_Stop();
}

char I2C_ReadP(char busAddr, char deviceRegister) //Чтение
{
	char data = 0;
	I2C_Start();
	I2C_SendAddr(busAddr);      
	I2C_Write(deviceRegister>>8); 
	I2C_Write(deviceRegister); 
	I2C_Start();
	I2C_SendAddr(busAddr+1); 
	data = I2C_ReadNACK();     
	I2C_Stop();
	return data;
}

int main(void)
{
	init_USART();
	stdout = &mystdout;
	I2C_Init();
	while(1)
	{
		I2C_WriteP(AT24C32,1,16);  //Запись
		char Temp=I2C_ReadP(AT24C32,1); //Чтение
		printf("%d\n", Temp);
		_delay_ms(1000);
	}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Первое. После записи должна быть выдержана пауза, согласно даташиту. Обычно это около 5 мс.
Второе. При чтении, после записи адреса, необходимо сделать рестарт (стоп->старт), а не просто старт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LEVV2006    158

Теперь что то начало записываться и читаться! Но пока работает не верно.

Вот что пишется в порт.

7 : 0 : 0 //прочитано с EEPROM
7 : 3 : 3 //реальные часы. 
 

Spoiler

void I2C_WriteP(char busAddr, char deviceRegister, char data)
{
	I2C_Start();
	I2C_SendAddr(busAddr);      
	I2C_Write(deviceRegister>>8); 
	I2C_Write(deviceRegister); 
	I2C_Write(data);           
	I2C_Stop();
}

char I2C_ReadP(char busAddr, char deviceRegister)
{
	char data = 0;
	I2C_Start();
	I2C_SendAddr(busAddr);      
	I2C_Write(deviceRegister>>8); 
	I2C_Write(deviceRegister); 
	I2C_Stop();
	I2C_Start();
	I2C_SendAddr(busAddr+1); 
	data = I2C_ReadNACK();     
	I2C_Stop();
	return data;
}

int main(void)
{
	init_USART();
	stdout = &mystdout;
	I2C_Init();
	//I2C_WriteProtokol(DS3231,MINUTES_REGISTER,DECtoBCD(50));
	I2C_WriteProtokol(DS3231,0x0E,0x00);
	while(1)
	{
		DS_getTime();
		
		I2C_WriteP(AT24C32,1,sec);
		I2C_WriteP(AT24C32,2,min);
		I2C_WriteP(AT24C32,3,hour);
		
		_delay_ms(10);
		
		char secT=I2C_ReadP(AT24C32,1);
		char minT=I2C_ReadP(AT24C32,2);
		char hourT=I2C_ReadP(AT24C32,3);
		
		printf("%d : %d : %d\n", hourT,minT,secT);
		printf("%d : %d : %d\n", hour,min,sec);
		
		_delay_ms(1000);
	}
}

 

Quote

Второе. При чтении, после записи адреса, необходимо сделать рестарт (стоп->старт), а не просто старт.

А это со всеми устройствами надо делать? Или только конкретно с памятью? В даташите протокол отображается так. И стоп только в конце передачи.

image.png.fdcd6e8b9847d1d3a94efee7d8159c6e.png

Изменено пользователем LEVV2006

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Ну, вообще, запись и чтение - разные операции для подчинённых, и между ними должен быть рестарт. Почему в даташите только старт написан - не понимаю... Но, если работает только со стартом, то оставьте только его :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LEVV2006    158

Разобрался! Надо паузы делать между записями. 

		I2C_WriteP(AT24C32,0x00,sec);
		_delay_ms(10);
		I2C_WriteP(AT24C32,0x01,min);
		_delay_ms(10);
		I2C_WriteP(AT24C32,0x02,hour);
		
		_delay_ms(10);

		char secT=I2C_ReadP(AT24C32,0x00);
		char minT=I2C_ReadP(AT24C32,0x01);
		char hourT=I2C_ReadP(AT24C32,0x02);

И думаю надо добавить между чтением для надежности. Но на данный момент работает и так.

Quote

Но, если работает только со стартом, то оставьте только его

Работает как по даташиту. Без стопов. 

Сейчас осталось самое сложное. Прикрутить к этому делу дисплей по I2C :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Starichok    1 220
14 часа назад, LEVV2006 сказал:

Сейчас осталось самое сложное. Прикрутить к этому делу дисплей по I2C

на Си может быть и сложно...

на ассемблере - как два пальца...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546
15 часов назад, LEVV2006 сказал:

Разобрался! Надо паузы делать между записями. 

В 14.12.2017 в 23:40, Alex сказал:

Первое. После записи должна быть выдержана пауза, согласно даташиту. Обычно это около 5 мс.

<_<
 

15 часов назад, LEVV2006 сказал:

И думаю надо добавить между чтением для надежности.

Ни к чему. Чтение с еепрома происходит очень быстро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
LEVV2006    158

Потратил 8 часов. Разобрался с подключением дисплея :). Теперь все работает!!! Пользовался статьями: Сайт1 (самая полезная по описанию команд) и Сайт2 (взял код за основу. Но с ходу он не заработал. Многое правил и самое главное это я возился с инициализацией дисплея.)

Прикреплю файл проекта. Может кому то будет полезно.

AVR+I2C_DS3132+I2C_EEPROM24c32+I2C_LCD1602b-yyh-ctk

Но это только начало проекта! :) Возни ещё много. 

Clock.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dim3740    4

Есть USB-HOST Arduino (+ сам МК) (но вопрос в целом), которая успешно "видит" некоторые подключенные устройства и делает обмен. Но если устройство определяется компом как несколько ЮСБ интерфейсов, то как указать хосту по какому работать?  Какой участок кода смотреть? В Винде это просто выбор мышкой, а тут как? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    348
4 часа назад, dim3740 сказал:

Есть USB-HOST Arduino (+ сам МК) (но вопрос в целом), которая успешно "видит" некоторые подключенные устройства и делает обмен. Но если устройство определяется компом как несколько ЮСБ интерфейсов, то как указать хосту по какому работать?  Какой участок кода смотреть? В Винде это просто выбор мышкой, а тут как? 

Это как? 

USB Host, в отличии от USB Hub, может увидеть ТОЛЬКО ОДНО устройство. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dim3740    4

Физическое устройство, конечно, одно. Но у него же через один разъем ЮСБ можно увидеть несколько портов что-ли... Я пока мало понимаю тут(((( Думаю, надо разбираться что такое дискриптор, но главное, как модифицировать библиотеку, чтоб обратиться к другому порту... хотя бы в какой части кода это анализируется найти.... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    348

HID USB отличается от других классов USB тем, что в дескрипторах в явном виде указан функционал передаваемых данных. Если конечно юзер будет следовать этому протоколу. Что совершенно необязательно. Но это одно устройство. Просто ЕДИНЫЙ массив передаваемых/принимаемых данных парсится в соответствии с дескрипторами устройства.

Парсится массив в приложении юзера, оно обычно в стеке выглядит как функция в main с именем начинающемся с App_...

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dim3740    4

Вроде это не то.... Но спасибо. Вот звуковая юсб карта опоеделяется виндой как аудиоустройство, миди, и даже геймпорт, допустим... Да, ставится 3 драйвера. Но юсб один. Есть библа, которая обеспечивает обмен и рпспознает карту как аудиоустройство. Чем это определяется? Допустим, нужно как миди. 

Изменено пользователем dim3740

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alexeyslav    630

Это называется составное устройство. Нигде в программе не указывается с каким из устройств в составе составного работать, ибо в этом нет смысла - если надо MIDI-порт, то просто ИСПОЛЬЗУЙТЕ его как миди, а не при помощи драйвера звукового устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dim3740    4

Как же мне это раскрутить:(((? Давайте еще раз, если можно... Я думал так: при подключении ЮСБ девайса программа делает к ему некий запрос, считывает и понимает что это за устройство: мышка (HID), МИДИ, аудио и т.п. Далее можно (но не нужно) написать универсальный код, который в зависимости от типа вызывает соответстсвующую программу.  Вы говорите, что если юзер знает, что в этом составном уст-ве есть МИДИ, то сразу обращаться с ним как с МИДИ. Что я имею: если у меня девайс определяется в Винде только как МИДИ - то мой юзб хост работает с ним без проблем. Если как составное (но тоже имеет МИДИ), то совсем не работает. И причина, не в том, что просто надо "сделать МИДИ- как по умолчанию, а не Аудио", а в том, что типовая библиотека не может "пробиться" к МИДИ. Так?

 

Изменено пользователем dim3740

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: Сергей Скопинцев
      Нужно разработать циклическую программу сбора информации от 10 измерительных источников. Период повторения цикла - одна секунда
      Источники:
       М - тензопреобразователь давления. Мостовая схема питается постоянным напряжением, выходной сигнал от 0 до 100 милливольт
       Т, ТМ, ТА- три канала измерения изменения напряжения в диапазоне от 400 до 600 милливольт (тоже нужен мост?)
       ЛМ - анализатор максимума напряжения (от 0 до 5 Вольт) по 10 точкам более-менее распределённых в измерительном цикле. Найденный максимум потом должен участвовать в анализе, постепенно уменьшаясь на 20% каждый цикл
       ВЛ - измерить напряжение на Малой емкости (50 пФ) с помощью емкостного делителя по алгоритму:
                         Снять Землю со средней точки емкостного делителя, подать на емкостной делитель положительный Импульс
                         Замерить нужное нам напряжение в средней точке делителя
                         Снять положительный Импульс с делителя, посадить на землю среднюю точку делителя
      - остальные каналы К7...К10  служебные
      Разрядность данных - 16 двоичных.

      Результаты писать на MicroSD текстовым файлом, на первом месте в строке текущее время в секундах, остальные каналы разделены пробелами
      Порядок каналов:
      Т - М -ТМ - Вл - ЛМ -...
      Коэффициенты усиления по каждому информационному каналу должен иметь возможность изменить оператор по формуле y = Ax + B
      Прибор автономный, питается от + 5 Вольт.
       
    • Автор: Ru_s
      Здравствуйте. Подскажите пожалуйста, возможно ли на attiny13 реализовать такую штуку. Мне в процессе работы программы нужно поменять режим работы таймера/счетчика с fast PWM на обычный счёт, отсчитать длительный промежуток времени и опять вернутся в режим ШИМ. Т.е. я подаю на ногу сигнал ШИМ и когда он в максимальном значении, я его отключаю, и тупо подаю на ногу высокий лог. уровень. В это время Т/С по идее свободен, и мне надо посчитать время работы выхода на максимальном лог. уровне, при достижении какого-то значения времени нужно перевести т/с обратно в ШИМ. Возможно ли это? И как приблизительно это реализовать
    • Автор: Kiraspbkiev Kira
      День Добрый. Есть два вопроса от новичка: 1) Правильная ли схема сделанная мною? 2) если схема верна то как правильно подключить к atmega328p-mu usb на чипе cp2102-grm?
      На схеме колодка JP1 это AVR ISP а JP2 это UART
      С проектированием столкнулся в первый раз, цель узнать что то новое и сделать своими руками:)

    • Автор: ITSpec
      Привет всем. Это мой первый пост здесь  прошу отнестись снисходительно.
      Просматривал ролики на Ютуб и понравилась тема одного из блогеров: "Воруем у китайцев". Идея понравилась и полез на Алиэкспресс поискать какой нибудь конструктор чтобы сплагиатить.
      Выбор пал на этот.

      Схему даже с платы не пришлось перечерчивать она была на странице продавца.

      Основная часть этой схемы обычный мультивибратор, который "перемигивает" параллельно подключенные диоды. Вторая часть схемы служит для музыкального сопровождения и состоит из трех компонентов: музыкальной микросхемы, усилителя звука в виде транзистора и громкоговорителя в виде пьезового зумера.
      Такой микросхемы у меня конечно же небыло и я заменил ее на чип H-83a который не нуждался в усилителе.

      Сразу припаял на него SMD резистор и кнопку для переключения мелодий согласно схеме.

      В оригинальной схеме использовались двухцветные диоды, таких у меня тоже не было и я их заменил на обычные 3 мм двух цветов.
      Зуммер я тоже не нашел заменил динамиком от старой мобилы.

      Открыл EASYEDA и нарисовал схему.

      Потом спроектировал плату.

      После прибегнул к технологии ЛУТ.

      Припаял все элементы. Отсек для батарейки и чип посадил на термоклей.

      Вот фото окончательного устройства.

      Включается устройство от переключателя, а мелодии от кнопки на музыкальном чипе. Если кому-то хочется чтоб мелодия играла при включении вместо кнопки можно впаять перемычку.
      Ссылка на видео как собиралось:
       
    • Автор: Михаил Савин
      Добрый день. Подскажите есть устройство на плате для регулирования дроссельной заслонки от Калины. Довольно специфическое, индивидуальная разработка, аналогов не купить. Основывается на микроконтроллере ATXMEGA128A3U AU 1651. Возможно ли скопировать залитый в него код что бы изготовить данное устройство ? Или это невозможно в принципе ?