Ви не увійшли.
Проектую на ардуіно нано 328р
На мекетці вхід Rx я закоротив з D2, тобто INT0.
По D2 переривання постійно робить, але імпульс вимірює лише після прийнятого символа 5. (див. скетч)
В мене вимірює, але щось не те. Ще й в буфері щось зайве гуляє..
Якщо хтось може допомогти готов віддячити в межах 500грн
Доброго дня!
Atmega8a, 8mhz, Arduino IDE
У періодичних пакетах (1 пакет на 0,8сек) на вході Rx (швидкість 9600) після певного прийнятого символу (конкретно цифра 5) необхідно порахувати довжину першого імпульсу (не важливо до якого символу він відноситься, важлива довжина саме першого імпульсу після прийнятої 5ки). Прошу знавців ткнути у потрібному напрямку.
Дякую!
#include <HardwareSerial.h>
volatile unsigned long i, dlina, ms3;
volatile bool d;
bool fl;
#define led 13 // светодиод
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(led, OUTPUT);
Serial.attachSerialInterrupt(SerialInterrupt);
attachInterrupt(0, isr, CHANGE);
}
void SerialInterrupt() {
if (UDR0 == '5') d = 1;
}
void isr() {
if (millis() - ms3 > 1000 && fl == 1) fl = 0;
if (fl == 0 && d == 1) {
if (digitalRead(2) == 0 ) i = micros();
else {
dlina = micros() - i;
// if (dlina > 100 && dlina < 110) digitalWrite(led, 1); else digitalWrite(led, 0);
Serial.print("dlina "); Serial.println(dlina);
fl = 1;
d = 0;
ms3 = millis();
}
}
}
void loop() {
}
Нічого не зрозумів... Встановив нову бібліотеку - запрацювало.
Але стояла стара, раніше працювало...
Заработало - та й добре.
Дякую за відповіді!
При виборі плати ардуіно нано все компелюється.
При виборі саме чіпа атмега328 - видає помилку "ошибка коммиляции для atmega328"
Всі інші проекти компилюються норм і на плату ардуіно і на чіп 328, 88, 8 та інші.
Проблема з'явилась при підключенні бібліотеки тм1637...
Доброго дня!
Така проблема:
TM1637 помилка при компиляціі для чіпа атмега328,
хоча для ардуіно нано все норм...
Колись була така проблема для OLED, додатково підключив #include <Wire.h> і все пішло...
Тут гадаю що щось треба вказати саме для чіпа.
Підскажіть будь ласка...
#include <avr/wdt.h>
#include <EEPROM.h>
#include <TM1637.h>
#define CLK A5
#define DIO A4
TM1637 disp(CLK, DIO);
Чітка відповідь! Дякую!
Буду дивитись в напрямку програмної правки або шукати інше апаратне рішення...
Доброго дня!
Роблю проект, де задіян модуль датчика струму.
Вимірювати струм треба до 5а
Програмую на ардуіно іде, використовую бібліотеку EmonLib.
Проблема наступна - при струмі до 1ампера - вимірювання відповідають дійсності,
якщо вище - то вже показники відрізняються від реальних в меншу сторону.
Нагрузка активна без індуктивної частини.
з коефицієнтом в emon1.current(pin, 30); грався в різні боки.
Буду вдячний за пораду
Даташит на ATMega328P, параграф 15 "16-bit Timer/Counter1 with PWM".
Если не хотите разбираться самостоятеьно, обращайтесь, сделаю.
Вернулся опять к этому проекту. Хочу всё таки побороть данный вопрос. Есть пару сотен грн. Если устроит, то готов обратится.
Даташит на ATMega328P, параграф 15 "16-bit Timer/Counter1 with PWM".
Если не хотите разбираться самостоятеьно, обращайтесь, сделаю.
Очень благодарен! Буду иметь ввиду.
Очень благодарен!
А если нужно будет сдвиг инвертировать, т.е. сдвинуть канал А относительно B, это будет так?
OCR1A = 234;
OCR1B = 312;
И встречный вопрос - как поменять сдвиг А относительно B в процессе работы?
Приветствую!
Работаю над проектом для атмега328р + кварц 16мгц (или ардуино нано 3)
Нуждаюсь в создании 2х меандров 50гц со сдвигом друг от друга 5мс (могу приложить осциллограмму, но не пойму как тут это сделать)
Меандры должны быть на разных пинах.
Очень важна именно качественная привязка второго меандра к первому. В loop будет достаточное количество вычислений, поэтому важно, что бы меандры работали независимо от основного кода программы.
Заранее благодарен за помощь!
Не понял о каком файле конфига речь. Но попробуйте вставить эти значения в калькулятор фьюзов по ссылке и аккуратно перенести галочки вручную в свою программу.
Супер!!! Заработало!
ОООЧЕНЬ спасибо!!!
Дуже дякую!!!
Atmega328P кварц 16МГц, загрузчик 512байт(256слов):
E:FD, H:DE, L:FF
а можно файл конфига в hex на почту khalimonav@ukr.net (в TL866 вручную не прописуется)
khalimon пише:Я по всякому пробовал. И от внутреннего кварца в том числе. Мне бы фьюзы у кого то списать с uno...
А в "досках" почему не посмотришь ???
А в досках - это где?
https://www.engbedded.com/fusecalc/
Ext. Crystal Osc., частота чтобы соответствовала частоте кварца.
Как определяете что "не работает"? если залить "блинк", мигает?
У меня на проектной плате светодиод стоит , пару реле и бузер. При запуске проц должен их включать поочерёдно, типа тест проходит.
Но при включении тишина...
Я по всякому пробовал. И от внутреннего кварца в том числе. Мне бы фьюзы у кого то списать с uno...
Приветствую!
Такая проблема.
Есть готовый проект. Скетч писался на ардуино ide 1.8.6 и отлаживался на ардуино нано.
Собрал пробную печатную плату, где использовал голый чип атмега328р pu ( длинный, 28 ног, вставленный в dip панель).
Кварц 16 мгц + 2 конденсатора 22пф. Avcc, vcc, aref на + 5в
Reset через 10к на 5в.
Точное напряжение питания 4.74в ( так задумано и связано с подключением ntc датчиков ).
В ардуино ide выставил плату UNO, скомпелировал hex файл и с загрузчиком и без загрузчика.
Шил программатором TL866 через панель ( НЕ внутрисхемно ). Прошивается нормально.
Не работает никак.
Чувствую, что с фьюзами что то не то делаю.
Не хотелось бы покупать uno для прошивки.
Прошу помощи в запуске голого чипа.
Заранее благодарен!
YK пише:Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные
..
Несколько раз проверил, вроде нормально работает. В течении недели планирую полностью собрать агрегат. Если хоть раз глюканет - нужно будет контрольную сумму впихнуть. За 200грн поможешь?
Вообщем сделал в одну строку приём/передачу - получасовой режим отработал впервые до конца. Но всё же успел на табло увидеть разовый глюк, на работу он не отразился,но всё же присутствовал. Теперь думаю , что контрольную сумму всё же придется использовать.
Ниже мой рабочий текущий вариант
передатчик
if ( millis()-ms8>500) {
if (start==5) {a='5';start=0;}else a = String(start);
StringtoSend=String(timeHour)+";"+String(timeMin)+";"+String(t)+";"+a+":";
Serial.println(StringtoSend);
ms8=millis(); }
приемник
void SerialREAD (){
if (!Serial.available()) return;
String data = Serial.readStringUntil('\n');
str1="";
rr=0;
le=data.length();
for (int qq=0; qq<=le;qq++) {
if (data[qq]==';' || data[qq]==':') {
switch (rr) {
case 0:
timeHour1 = str1.toInt();
break;
case 1:
timeMin1 = str1.toInt();
break;
case 2:
temperatura1 = str1.toInt();
break;
case 3:
start = str1.toInt();
if (start==5) {flagdisplay=4; zvuk=1;start=0;}
break;
}
rr++;
str1="";
}
else str1=str1+data[qq];
}
}
Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные
Если ваш вариант заработает - готов кинуть 200грн(только если вы с Украины), поэтому прошу помочь довести до конца эту часть кода...
char *str; это char*
Сделай
String myStr=str;затем используй
myStr.toInt();моя ошибка в первом примере , я просто наводку давал
Запустил ваш вариант - висит ни на что не реагирует....
Чувство, что цикл while висит...
Вот приёмник:
if (millis()-tim>500) {
SerialREAD ();//чтение данных с силовой платы 1 раз в
tim=millis();
}
....................................
void SerialREAD (){
if (!Serial.available()) return;
String data = Serial.readStringUntil(":");
char *p = data.c_str() ;
char *str;
String myStr=str;
int i=0;
while ((str = strtok_r(p, ";", &p)) != NULL){
switch (i){
case 0:
timeHour1 = myStr.toInt();
break;
case 1:
timeMin1 = myStr.toInt();
break;
case 2:
temperatura1 = myStr.toInt();
break;
case 3:
start = myStr.toInt();
break;
i++;
}
}
if (start==5) {flagdisplay=4; zvuk=1;start=0;}
}
Ниже передатчик
if ( millis()-ms8>500) {
if (start==5) {a='5';start=0;} else a = String(start);
StringtoSend=String(timeHour)+";"+String(timeMin)+";"+String(t)+";"+a+":";
Serial.println(StringtoSend);
ms8=millis();
}
Передавай данные одним пакетом например для простоты в.....
Не могу помять, где ошибка?
Пишет:
request for member 'toInt' in 'str', which is of non-class type 'char*'
ругается на строки синего цвета...
Переменные timeHour1,timeMin1,t, start - у меня обозначены как int. Не могу понять где ошибка??
void SerialREAD (){
if (!Serial.available()) return;
String data = Serial.readStringUntil(":");
char *p = data.c_str() ;
char *str;
int i=0;
while ((str = strtok_r(p, ";", &p)) != NULL){
switch (i)
case 0:
timeHour1 = str.toInt();
break;
case 1:
timeMin1 = str.toInt();
break;
case 2:
t = str.toInt();
break;
case 3:
start = str.toInt();
break;
i++;
}
Ну это не весь код. Возможно в Serial на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно ты будешь получать только гарантированные валидные пакеты
Нашел недоработку в коде передатчика, который мог притормаживать, исправил, проверяю. Если не поможет попробую переделать в строку по вашему способу. По Вашему опыту при моём расстоянии между платами (реально 40-60см) данный способ нормально должен работать?
Передавай данные одним пакетом например для простоты в одной строке с разделением "," или ";" и терминатор в конце например ":"
String toSend=String(timeHour)+";"+String(timeMin)+.....":";ну и на приемнике
String data = Serial.readStringUntil(":"); char *p = data.c_str() ; char *str; int incomeint[5]; int i=0; while ((str = strtok_r(p, ";", &p)) != NULL){ // delimiter is the semicolon Serial.println(str); incomeint[i]=str.toInt(); i++; }
как то так , incomeint будет содержать твои данные,
я пробовал отправлять разделительный символ-результата не было. Отличие у меня было только в том, что передавал с переносом каретки:
Serial.println('s');
Serial.println(timeHour);
Serial.println(timeMin);
Serial.println(t);
Serial.println(start);
на приёме
с=Serial.read();
if (c=='s') {
timeHour1 = Serial.parseInt ();
timeMin1 = Serial.parseInt ();
temperatura1 = Serial.parseInt ();
start = Serial.parseInt ();}
else Serial.flush ();
Будет ли разница при передачи строки? В любом случае попробую варианты... Спасибо!
rs485
Расстояние всего 50см. rs485 действительно улучшит ситуацию?