N

Вопрос мастерам или ардуино Шредингера.

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

Есть задача, опрашивать несколько ардуино по I2C с целью вывести полученное на дисплей.
Рабочий код прикладываю, подсоединял по мануалу пробовал подтягивать SCL и SDA резисторами на 1,5кОм.
Вопрос в следующем.
Почему то поле некоторого времени слейв перестает определятся.
Скан видит любую перефирию I2C кроме ардуинки

Код (C++):

Код мастера

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x26,16,2);
#include <Wire.h>
char co = 0 ;

void setup() 
  {
 
  Wire.begin();        // join i2c bus (address optional for master)
  lcd.init();
  lcd.backlight();
  Serial.begin(9600);  
  }
 
void loop() 
  {
     
     Wire.requestFrom(0x10, 4,true);
     lcd.setCursor(0,0);
     while (Wire.available()) 
        { 
          co = Wire.read(); 
          Serial.print(co);         
          lcd.print(co);   
        }
        delay(200);
    
   
     Serial.print(" ");
     
     Wire.requestFrom(0x10, 7,true);    // request 6 bytes from slave device #8
     lcd.setCursor(4,0);
     while (Wire.available()) 
        { 
          co = Wire.read(); 
          Serial.print(co);         
          lcd.print(co);   
        }
   
  Serial.print("\n");
  delay(200);
  lcd.clear();
}



Код (C++):

Код слейва


01 #include <Wire.h>
02
03 byte stat = true;
04
05 char c[4] = {'N','O',' ',' '};
06 float x = 322.345;
07 void setup() {
08  Wire.begin(0x10);
09  pinMode(13, OUTPUT);
10  Serial.begin(9600);
11  Wire.onRequest(requestEvent);
12 }
13
14 void loop() {
15  digitalWrite(13, LOW);
16  delay(100);
17
18 }
19
20 void requestEvent() {
21  if (stat == true)
22  {
23
24  Wire.write(c,sizeof c);
25  stat = false;
26  }else
27  {
28  char outstr[7];
29  dtostrf(x,7, 3, outstr);
30  Wire.write(outstr,sizeof outstr);
31  stat = true;
32  }
33  digitalWrite(13, HIGH);
34
35
36
37
38 }

 

0

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


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

Перепиши код в AVR Studio и все будет работать

0

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


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

Перепиши код в AVR Studio и все будет работать

Буду пробовать, вы думаете это из за кривого компилятора?

0

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, Nikita kozlovtcev сказал:

кривого компилятора

Скорее из-за кривого кода

0

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


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

Скорее из-за кривого кода

а ну тогда как AVR студия поможет?))

0

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, Nikita kozlovtcev сказал:

как AVR студия поможет?

Поможет разобраться с работой контроллера, в частности интерфейса TWI (I2C, но назван по другому). Вот как его запустишь, так и виснуть перестанет.

С какой целью выбран I2C?

0

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


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

Поможет разобраться с работой контроллера, в частности интерфейса TWI (I2C, но назван по другому). Вот как его запустишь, так и виснуть перестанет.

Так то на асемблере запускал.

А на си не писал раньше, из за этого и проблемы.

0

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, Nikita kozlovtcev сказал:

Так то на асемблере запускал

Так и напиши на асме, там же код короткий совсем. Почему именно I2C?

0

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


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

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

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

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

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

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

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

Загрузка...

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

  • Сообщения

    • Что все на коп пошли? ))  r3 поставил переменник тх регулирует от 8мА до 22 мА ...чуйка на монету 15 см хотя баланс сводил по разному (3ч просидел) сводил от 30мВ и више толку 0 ... Также  RX подключал по разному но всегда 8228Hz 0 mv хотя мд работает.... Также надеюсь ктонибуть ответит ..
    • Токовое зеркало меньше влияет на характеристики унч чем повторитель в кун, собирал 2 варианта и отслушивал разница не в пользу тз. Если ми говорим от чего больше профита.
    • А при чём здесь тема, которая где-то у вас? Здесь, на Паяльнике, эта тема о конкретном усилителе - о "торчибасе" - с 1-го поста надо было читать, а не с куска, выдернутого откуда-то из середины.  Вообще-то я не для того выкладывал эту схему(хотя это всего -лишь картинка из симулятора), чтобы кто-то её уродовал в силу своего недопонимания её нюансов. Если не понимаешь того, что даёт токовое зеркало, и нет под рукой "букваря", карандаша и клочка бумаги, чтобы посчитать - спроси  
    • кренки просадку под нагрузкой будут давать, и унч в голодании будет, кно нибуть видел чтоби в оконечник стаб ставили, всегда идет прямо с диодов вся мощ питания ни виходние транзюки или микри
    • Хотел бы получить квалифицированный совет по поводу процесса и результатов моих измерений формы цифрового сигнала. Имееются значительные базовые знания цифровой электроники но практически нулевой опыт. Есть некое цифровое(?) устройство, для которого мне хотелось бы задокументировать форму сигнала. Есть дешевый китайский тестер.
      Вначале все довольно ясно, 


      но когда начинаю менять масштаб оси времени, то выглядит так, как будто, во-первых, импульсы идут пачками

      , а потом, что эти "пачки" чередуются полярностью. 

      потом бОльшими пачками:



      И напоследок пачки как бы чередуются с одиночными сигналами не совсем прямоугольной формы (последние 4 фото имеют один и тот же масштаб времени)




      Да и начальные импульсы строго говоря не совсем прямоугольные - верхняя часть имеет спад -- вначале было подозрение что это просто проблема с осциллографом, но потом вспомнил, что у него есть калибровочный сигнал, который не имел такой проблемы. Так как я никогда не использовал осциллограф, то полагаю, что может, что не учитываю. По идее, этот прибор должен выдавать "модифицированный прямоугольный сигнал 100Гц и длительностью сигнала 2мсек". Но мне видятся некие несоответствия для разных масштабов времени:
      почему для <= 10мсек все сигналы двуполярные а дла 20мсек чередуются полярностью?
      почему для 20мсек пачки просто чередуются, а для 50мсек группируются в бОльшие пачки одной полярности?
      почему ширина пачек для 0.2сек и для 0.5сек практически одинаковая?
      похоже ли что для некоторых 0.5сек фото пачки действительно чередуются с одиночными импульсами более растянутыми? Фактически на основании того что я вижу это не совсем цифровой сигнал, кроме того, видны множественные огрехи на разных фото. Либо
      проблема с очень простым осциллографом, либо с процессом измерения, либо (ощущение, что) сам прибор очень простой и не обеспечивает 
      качественного сигнала. А может, дело просто в том, что сигналы, организованные в пачки разной полярности, нельзя увидеть при большем разрешении времени из-за синхронизации осциллографа, установленной по уровню, но этот уровень одной полярности, так что осциллограф просто "пропускает" отрицательные пачки?
  • Похожие публикации

    • Автор: Wyfinger
      Всем привет.
      Существуют ли готовые модули для измерения мгновенных значений тока и напряжения (ток до 100 А, напряжение до 250 вольт)?
      Т.е. измерять нужно с частотой 1000-5000 герц, точность 14-16 бит, связь по SPI лучше всего.
      Вообще нужно хотя-бы 4 канала по току и 4 по напряжению. Но лучше, чтобы можно было на одну шину ставить несколько модулей, расширяя количество каналов.
      Обрабатывать данные собираюсь на STM32F104 (хотя с ним никогда не работал) или Arduino Due, но это не важно.
      Понятно что можно взять АЦП и шунт или делитель напряжения, но хотелось бы готовый модуль и уже с оптической развязкой.
      Подскажите если кто сталкивался.
       
    • Автор: StasRadeon
      Люди добрые, помогите кто может!
      потому что имею HD44780 + PCF8547, хотел сделать i2c library.
      скажите пожалуйста где делаю неправильно.
      прикрепляю PrintScreen от Proteus ISIS

      #include <htc.h> #define _XTAL_FREQ 4000000 //******************************************************** #pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) #pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled) #pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled) #pragma config LVP = ON // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled) // CONFIG2 #pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V) #pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off) //******************************************************** #define LCD_DISPLAYMODE 0x08 #define pic_frq 16000 // controller frequenc #define i2c_frq 400 // #define gen_frq (((pic_frq / i2c_frq) / 4) - 1) void i2cByteWrite(char, char, char); void i2cTxData(char); void LCD_dat(char); void LCD_cmd(char); void LCD_clr(void); void LCD_int(void); void LCD_str(char *); void LCD_ROMstr(const char *); void LCD_posyx(char,char); void LCD_hex(char); void i2c_init(); //////////// Main ////////////////////////////////// void main(void){ char msgStart[] ="LCD Work"; unsigned char num = 0; OSCCON = 0b00110000; //4Mhz TRISC = 0b11111111; PORTC = 0x00; i2c_init(); LCD_int(); // ------------------------------------------------------ LCD_str(msgStart); // LCD_dat(' '); LCD_dat('!'); // ------------------------------------------------------ LCD_posyx(1,0); // LCD_ROMstr("12345"); while(1){ LCD_posyx(0,14); // LCD_hex(num++); // __delay_ms(1000); // 1000msec } } void i2c_init() { TRISC3 = 1; TRISC4 = 1; SSPSTAT = 0b10000000; // Slew rate disabled SSPCON = 0b00101000; //(0x28) SSPEN = 1, I2C Master mode, clock = FOSC/(4*(SSPADD+1)) SSPCON2 = 0b00000000; // SSPADD = gen_frq; } // ----------------------------------------------------------- void i2cByteWrite(char addr, char cont, char data){ SEN = 1; // Start condition while(SEN); // if (Start condition) i2cTxData(addr); // i2cTxData(cont); // i2cTxData(data); // SSPIF = 0; // PEN = 1; // Stop condition while(PEN); // Stop condition } void i2cTxData(char data){ SSPIF = 0; // SSPBUF = data; // while(!SSPIF); // } // ----------------------------------------------------------- void LCD_dat(char chr){ i2cByteWrite(0xA0, 0x80, chr); __delay_us(60); // 60 usec } // ----------------------------------------------------------- void LCD_cmd(char cmd){ i2cByteWrite(0xA0, 0x00, cmd); if(cmd & 0xFC) // __delay_us(60); // 60usec else __delay_ms(3); // 3msec } // ----------------------------------------------------------- void LCD_clr(void){ LCD_cmd(0x01); //Clear Lcd } void LCD_posyx(char ypos, char xpos){ unsigned char pcode; switch(ypos & 0x03){ // case 0: pcode=0x80;break; // 1line case 1: pcode=0xC0;break; // 2line case 2: pcode=0x94;break; // 3line case 3: pcode=0xD4;break; // 4line } LCD_cmd(pcode += xpos); // } // ----------------------------------------------------------- void LCD_str(char *str){ while(*str) // LCD_dat(*str++); // } // ----------------------------------------------------------- void LCD_ROMstr(const char *str){ while(*str) // LCD_dat(*str++); // } // ----------------------------------------------------------- void LCD_hex(char c){ const char hexch[] ="aaaa"; LCD_dat(hexch[c >> 4]); // LCD_dat(hexch[c & 0xF]); // } // ----------------------------------------------------------- void LCD_int(void){ __delay_ms(100); // LCD_cmd(0x28); // 4 bit mode LCD_cmd(LCD_DISPLAYMODE | 0x00); // Display on Cursor=0 Blink=0 LCD_cmd(0x06); // Entry Inc/Dec=1 Shift=0 LCD_cmd(0x01); // Clear Display }

    • Автор: Ittido
      Добрый день. Пытаюсь сделать конвеер для аппаратного TWI модуля ATMega8. Контроллер в режиме мастера периодически работает с 4 разными устройствами на шине. LCD1602 висит также на шине I2C. Инициализация проходит информация на LCD выводится. Далее идёт процесс опроса времени с DS3231. Время передаётся но в конце при передаче СТОП на линию І2С. СТОП не проходит. Логический анализатор показывает на линии SCL - 1, SDA - 0. В регистре статуса F8. Ожидание ни к чему не приводит. Продолжение кода тоже. Как с этим бороться может кто сталкивался.
    • Автор: POlSS0N
      Хочу сделать, чтобы контроллер опознавал самостоятельно факт подключения к линии i2c внешних устройств.
      Предполагаю периодически рассылать запросы на запись по каждому адресу и записывать, пришло ли подтверждение или нет, после чего сразу прерывать работу стоп-битом.
      Возникает вопрос - как поведет себя другой контроллер, если он подтвердит готовность принять некие данные а в результате вместо тактов он получит стоп-бит?
      Может, в стандарте i2c есть общепринятый метод опроса адресов?
    • Автор: Alexey_Zhigalo
      Здравствуйте!
      Имею в наличии 7-ми дюймовый экран от портативного DVD плеера.

      На фото ресивер на процессоре (чипе) mx88v462.
      В поисках в интернете для Arduino готовых библиотек не нашел.
      Но натолкнулся на странички на форуме,
      http://radiokot.ru/f...068630#p2068630
      http://radiokot.ru/f...p?f=61&t=105858
      Изначально не мог даже перенести библиотеки из Avr Studio в Arduino.
      На форуме, добрый человек помог, за что ему большое спасибо..
      http://forum.amperka...иблиотеки.6538/
      Код для Arduino: //не правильно работает
      mx88v462_2.zip
      Код для Avr Studio: //работает на Atmega16
      MX88V462.zip
      Разница между проектами в том что разделен файл на *.cpp и *.h
      Но на Arduino код не работает, а точнее не совсем правильно, дисплей не инициализируется...
      Код для Avr точно рабочий, так как создал проект в Avr Studio для Atmega16, скомпилировал, получил hex файл, залил той же ArduinoЙ.
      MX88V462.zip
      И результат:


      Но проблема, перенесенная библиотека для Arduino не работает, дисплей не инициализируеться...
      Ресивер для дисплей работает по протоколу I2C.
      В проекте в Avr Studio реализован программный I2C, что и написано на форуме автора данной библиотеки.
      http://radiokot.ru/f...068630#p2068630
      http://radiokot.ru/f...p?f=61&t=105858
      В проекте для Arduino было опробовано и программный I2C и при помощи Wire.
      Но дисплей не инициализируется..
      Потом в Proteus подключил Atmega328 и Atmega16.
      В Atmega328 залил hex файл скомпилированным в Aruino IDE // тот что не правильно работает
      В Atmega16 залил hex файл, тот с которым инициализировался дисплей и вывел текст.
      Подключил осциллограф к SDA SCL обеих микроконтроллеров.
      Chanel A - желтый -> SDA Atmega328
      Chanel B - синий -> SCL Atmega328
      Chanel C - красный -> SDA Atmega16
      Chanel D - зеленый -> SCL Atmega16
      И проблема в том, что сигналы не совпадают, скважность и сам сигнал.
      Частота кварцов выставлена одинаковая, 16M


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