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

Sergey-Ufa    639
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    159

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

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

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


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

Все привет! Возник такой вопрос. Осваиваю 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    559
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    159

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

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    559

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

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


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

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

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

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    559

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

 

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


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

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

		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 263
14 часа назад, LEVV2006 сказал:

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

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

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

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


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

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

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

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

<_<
 

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

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

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

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


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

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

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

AVR+I2C_DS3132+I2C_EEPROM24c32+I2C_LCD1602b-yyh-ctk

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

Clock.rar

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


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

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

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


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

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

Это как? 

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

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


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

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

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


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

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

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

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

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


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

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

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

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


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

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

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


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

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

 

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

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


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

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

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

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

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

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

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

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

Загрузка...

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

    • Автор: 55nlo
      Нужно написать программу "календарь" на АСМ
      Примерное ТЗ 
       
       
      1    5     по значению R0 (ввода)  в R20 вводим табличные значения        табл.1        
      1    6     по значению R0 (ввода)  в R21 вводим табличные значения        табл.1        
      1    7    NOP     (возможно доп. Команда)                 
      1    8    NOP     (возможно доп. Команда)           
      1    9    значение ОЗУ (адрес Rz) копируем в регистр R18(остаток)                
      1    10    R18(остат) прибавляем R24(лист) результат в R18(остат)                 
      1    11    провер. R18(остат) < 8, то п.12, нет то  R18(остат) -7, результат в R18(остат) и к п.12.                
      1    12    R 18(остат)  копируем в ОЗУ адрес Rz                
      1    13    адрес Rz увеличиваем на 1                
      1                        
      1    14    R19(стр.) увелич. на 1, проверяем Rстр =13.если не равно, п. 15. если  равно, то                 
      1             R19 стр. обнуляем, Rлиста увеличиваем на 1,             
      1            Rлиста если не =13, то к п. 9, если равно 13,             
      1            то  R17(листа) обнуляем и перех к п. 2.5(2-й участок, следующий)            
      1                        
      1    15    R18(ост.)+ 1 = в R18(ост.)                
      1    16    проверяем R18(ост) больше 10, если больше то -10, результат в R18(ост) и в п. 17 нет, то п. 17                
      1    17    значение ОЗУ (адрес Rz  текущий) копируем в R25сравн.                
      1    18    R25(сравн.) увелич на 1                
      1    19    R1(книги) установить значение "2"                
      1    20    NOP           (возможно доп. Команда)     
      1    21    NOP          (возможно доп. Команда)            
      1    22   R18(ост) =R20? если не равно ,то к 23, равно, то R сравн. обнуляем заносим 0 в ОЗУ и к п.13            
      1    23    R18(ост)=R21,если не равно, то к 24,    равно    то R сравн. обнуляем, заносим 0 в ОЗУ и к п.13            
      1    24    R25(сравн.) в ОЗУ (текущий) адрес Rz                
      1    25    R25(сравн.) более 20, то к п. 26. менее.то перех к п. 13                
      1    26    R учета =Rсравн.? да к п. 27 нет к п. 13                
      1    27    R7 обнуляем                
      1    28    R18(остат) копируем в Rморзе                 
      1    29    R7+ Rлиста в R7                
      1    30    проверяем R7  больше 12, если больше то -12, результат в R7 и к п. 31, нет к п. 31                
      1    31    R7  значение конвертируем через таблицу  в R7          табл.1м        
      1    32    Выполняем  прогу "М".                
      1    33    переходим к п.13             
       + ДВЕ ТАБЛИЦЫ ПО 40 СТРОК.   
    • Автор: Dominico
      Необходимо выполнить реверсивный счетчик в 10 разрядов для подключения его к ЦАП 572ПА1, чтобы в итоге получить треугольный ступенчатый сигнал. С программировнием на "ваше высочество", но хочу попробовать. Подскажите пожалуйста, на каком микроконтроллере это можно лучше сделать, и в каком направление "копать"
    • Автор: CUBE
      Не могу запустить асинхронный режим. 
      Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц).  После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. 
      Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. 
      Компилятор Atmel Studio 7
      Шью через Sind Prog 2.1.1 + USBasp 2.0
      Вот код: 
      .macro outi 
       ldi r16, @1 
       out @0, r16 
      .endm 
      .org $000 
      rjmp reset 
      .org $001 
      reti 
      .org $002 
      reti 
      .org $003 
      reti 
      .org $004 
      rjmp timer2_ovf 
      .org $005 
      reti 
      .org $006 
      reti 
      .org $007 
      reti 
      .org $008 
      reti 
      .org $009 
      reti 
      .org $00A 
      reti 
      .org $00B 
      reti 
      .org $00C 
      reti 
      .org $00D 
      reti 
      .org $00E 
      reti 
      .org $00F 
      reti 
      .org $011 
      reti 
      .org $012 
      reti 
      .ORG INT_VECTORS_SIZE 
       
      reset: 
      .equ portout=portd 
      .equ ddrout=ddrd 
      .def led=r17 
      .def mask=r18 
      .def counter=r19 
       outi spl,low(ramend) 
       outi sph,high(ramend) 
       
       outi ddrout, 0xff 
       
       outi tccr2, 0b00000111 
       outi timsk, 1«toie2 
       
        
       
        
       ldi led,1«5 
       ldi mask,1«5 
       sei 
      cycle: 
      cpi counter, 10 
      breq offtim 
       rjmp cycle 
       
      timer2_ovf: 
      inc counter 
       out portout, led 
       eor led, mask 
      reti 
        
      offtim: 
      outi timsk, 0«toie2 
      rjmp asinxron 
       
      asinxron: 
       outi assr, 0b00001000 
      back: 
       in r16, assr 
       cpi r16, 0b00001000 
       brne back 
       
        outi tccr2, 0b00000101 
        outi tcnt2, 0 
        outi ocr2, 0 
        outi timsk, 1«toie2 
       
       
      m1: 
      rjmp m1


      Верх меги на фото слева. 
    • Автор: qwer qwer
      Требуется разработать блок управления сплит-системой с функцией обучения по ИК каналу через RS-485 интерфейс на базе МК STM32. Есть ТЗ и список команд управления. Разработка в 2 этапа: 1-разработка принципиальной электрической схемы с указанием элементов на основе структурной из ТЗ (можно в карандаше), 2-написание ПО для МК STM32 в соответствии с ТЗ и списком команд. Оплата поэтапно. Кому интересно - уточняйте детали и оценивайте стоимость работы.
      Блок управления по ИК каналу Описание.docx
      Команды MODBUS.xlsx
    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip