естесссенно установил все, что положено установить
проверил компиляцию программы - выдает ошибки только на rtc. нашел старые ветки качнул библиотеку RTCdue-master
#ifndef _RTCdue_h_
#define _RTCdue_h_
// Code by JeeLabs http://news.jeelabs.org/code/
// Released to the public domain! Enjoy!
// Edited by Oskari Rauta.
// i2c functionality adapted from DS1307 library of Henning Karlsen - no more wire.h needed
// Due now supported and calculation of
// day of week now works. 3/16/2013
#include <Arduino.h>
// Simple general-purpose date/time class (no TZ / DST / leap second handling!)
#define DS1307_ADDR_R 209
#define DS1307_ADDR_W 208
#define SECONDS_PER_DAY 86400L
#define SECONDS_FROM_1970_TO_2000 946684800
class DateTime {
public:
DateTime (uint32_t t =0);
DateTime (uint16_t year, uint8_t month, uint8_t day,
uint8_t hour =0, uint8_t min =0, uint8_t sec =0);
DateTime (const char* date, const char* time);
uint16_t year() const { return 2000 + yOff; }
uint8_t month() const { return m; }
uint8_t day() const { return d; }
uint8_t hour() const { return hh; }
uint8_t minute() const { return mm; }
uint8_t second() const { return ss; }
uint8_t dayOfWeek() const;
// 32-bit times as seconds since 1/1/2000
long secondstime() const;
// 32-bit times as seconds since 1/1/1970
uint32_t unixtime(void) const;
protected:
uint8_t yOff, m, d, hh, mm, ss;
};
// RTC based on the DS1307 chip connected via I2C and the Wire library
class RTC_DS1307 {
public:
RTC_DS1307(const uint8_t data_pin = PIN_WIRE_SDA, const uint8_t sclk_pin = PIN_WIRE_SCL);
void begin(void);
void adjust(const DateTime& dt);
void settime(const DateTime& dt);
uint8_t isrunning(void);
DateTime now(void);
private:
uint8_t _scl_pin;
uint8_t _sda_pin;
uint8_t _burstArray[8];
void _sendStart(byte addr);
void _sendStop(void);
void _sendAck(void);
void _sendNack(void);
void _waitForAck(void);
uint8_t _readByte(void);
void _writeByte(uint8_t value);
void _burstRead(void);
uint8_t _readRegister(uint8_t reg);
void _writeRegister(uint8_t reg, uint8_t value);
uint8_t _decode(uint8_t value);
uint8_t _encode(uint8_t value);
};
// RTC using the internal millis() clock, has to be initialized before use
// NOTE: this clock won't be correct once the millis() timer rolls over (>49d?)
class RTC_Millis {
public:
static void begin(const DateTime& dt) { adjust(dt); }
static void adjust(const DateTime& dt);
static DateTime now();
protected:
static long offset;
};
#endif
// Code by JeeLabs http://news.jeelabs.org/code/
// Released to the public domain! Enjoy!
// Edited by SomeRandomGuy to implement support for the Arduino Due on 1/19/2013
// Edited more by Oskari Rauta. Due now supported and calculation of day of week now works. 3/16/2013
#include "RTCdue.h"
// utility code, some of this could be exposed in the DateTime API if needed
const uint8_t daysInMonth [] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //has to be const or compiler compaints
// number of days since 2000/01/01, valid for 2001..2099
static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) {
if (y >= 2000)
y -= 2000;
uint16_t days = d;
for (uint8_t i = 1; i < m; ++i)
days += *daysInMonth + i - 1;
if (m > 2 && y % 4 == 0)
++days;
return days + 365 * y + (y + 3) / 4 - 1;
}
static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) {
return ((days * 24L + h) * 60 + m) * 60 + s;
}
////////////////////////////////////////////////////////////////////////////////
// DateTime implementation - ignores time zones and DST changes
// NOTE: also ignores leap seconds, see http://en.wikipedia.org/wiki/Leap_second
DateTime::DateTime (uint32_t t) {
t -= SECONDS_FROM_1970_TO_2000; // bring to 2000 timestamp from 1970
ss = t % 60;
t /= 60;
mm = t % 60;
t /= 60;
hh = t % 24;
uint16_t days = t / 24;
uint8_t leap;
for (yOff = 0; ; ++yOff) {
leap = yOff % 4 == 0;
if (days < 365 + leap)
break;
days -= 365 + leap;
}
for (m = 1; ; ++m) {
uint8_t daysPerMonth = *daysInMonth + m - 1;
if (leap && m == 2)
++daysPerMonth;
if (days < daysPerMonth)
break;
days -= daysPerMonth;
}
d = days + 1;
}
DateTime::DateTime (uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec) {
if (year >= 2000)
year -= 2000;
yOff = year;
m = month;
d = day;
hh = hour;
mm = min;
ss = sec;
}
static uint8_t conv2d(const char* p) {
uint8_t v = 0;
if ('0' <= *p && *p <= '9')
v = *p - '0';
return 10 * v + *++p - '0';
}
// A convenient constructor for using "the compiler's time":
// DateTime now (__DATE__, __TIME__);
// NOTE: using PSTR would further reduce the RAM footprint
DateTime::DateTime (const char* date, const char* time) {
// sample input: date = "Dec 26 2009", time = "12:34:56"
yOff = conv2d(date + 9);
// Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
switch (date[0]) {
case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break;
case 'F': m = 2; break;
case 'A': m = date[2] == 'r' ? 4 : 8; break;
case 'M': m = date[2] == 'r' ? 3 : 5; break;
case 'S': m = 9; break;
case 'O': m = 10; break;
case 'N': m = 11; break;
case 'D': m = 12; break;
}
d = conv2d(date + 4);
hh = conv2d(time);
mm = conv2d(time + 3);
ss = conv2d(time + 6);
}
uint8_t DateTime::dayOfWeek() const {
// CalendarSystem = 1 for Gregorian Calendar
uint16_t year = yOff + 2000;
uint8_t result, month = m;
if ( month < 3)
{
month = month + 12;
year -= 1;
}
result = (d + ( 2 * month ) + int(6 * ( month + 1 ) / 10) +
year + int(year / 4) - int(year / 100) +
int(year / 400) + 1 ) %7;
return result == 0 ? 7 : result;
}
uint32_t DateTime::unixtime(void) const {
uint32_t t;
uint16_t days = date2days(yOff, m, d);
t = time2long(days, hh, mm, ss);
t += SECONDS_FROM_1970_TO_2000; // seconds from 1970 to 2000
return t;
}
////////////////////////////////////////////////////////////////////////////////
// RTC_DS1307 implementation
RTC_DS1307::RTC_DS1307(const uint8_t data_pin, const uint8_t sclk_pin) {
_sda_pin = data_pin;
_scl_pin = sclk_pin;
pinMode(_scl_pin, OUTPUT);
}
void RTC_DS1307::begin(void) {
uint8_t _reg = _readRegister(0);
_reg &= ~(1 << 7);
_reg |= (0 << 7);
_writeRegister(0, _reg);
}
void RTC_DS1307::_sendStart(byte addr)
{
pinMode(_sda_pin, OUTPUT);
digitalWrite(_sda_pin, HIGH);
digitalWrite(_scl_pin, HIGH);
digitalWrite(_sda_pin, LOW);
digitalWrite(_scl_pin, LOW);
shiftOut(_sda_pin, _scl_pin, MSBFIRST, addr);
}
void RTC_DS1307::_sendStop(void)
{
pinMode(_sda_pin, OUTPUT);
digitalWrite(_sda_pin, LOW);
digitalWrite(_scl_pin, HIGH);
digitalWrite(_sda_pin, HIGH);
pinMode(_sda_pin, INPUT);
}
void RTC_DS1307::_sendNack(void)
{
pinMode(_sda_pin, OUTPUT);
digitalWrite(_scl_pin, LOW);
digitalWrite(_sda_pin, HIGH);
digitalWrite(_scl_pin, HIGH);
digitalWrite(_scl_pin, LOW);
pinMode(_sda_pin, INPUT);
}
void RTC_DS1307::_sendAck(void)
{
pinMode(_sda_pin, OUTPUT);
digitalWrite(_scl_pin, LOW);
digitalWrite(_sda_pin, LOW);
digitalWrite(_scl_pin, HIGH);
digitalWrite(_scl_pin, LOW);
pinMode(_sda_pin, INPUT);
}
void RTC_DS1307::_waitForAck(void)
{
pinMode(_sda_pin, INPUT);
digitalWrite(_scl_pin, HIGH);
while (_sda_pin==LOW) {}
digitalWrite(_scl_pin, LOW);
}
uint8_t RTC_DS1307::_readByte(void)
{
pinMode(_sda_pin, INPUT);
uint8_t value = 0;
uint8_t currentBit = 0;
for (int i = 0; i < 8; ++i)
{
digitalWrite(_scl_pin, HIGH);
currentBit = digitalRead(_sda_pin);
value |= (currentBit << 7-i);
delayMicroseconds(1);
digitalWrite(_scl_pin, LOW);
}
return value;
}
void RTC_DS1307::_writeByte(uint8_t value)
{
pinMode(_sda_pin, OUTPUT);
shiftOut(_sda_pin, _scl_pin, MSBFIRST, value);
}
uint8_t RTC_DS1307::_readRegister(uint8_t reg)
{
uint8_t readValue=0;
_sendStart(DS1307_ADDR_W);
_waitForAck();
_writeByte(reg);
_waitForAck();
_sendStop();
_sendStart(DS1307_ADDR_R);
_waitForAck();
readValue = _readByte();
_sendNack();
_sendStop();
return readValue;
}
void RTC_DS1307::_writeRegister(uint8_t reg, uint8_t value)
{
_sendStart(DS1307_ADDR_W);
_waitForAck();
_writeByte(reg);
_waitForAck();
_writeByte(value);
_waitForAck();
_sendStop();
}
void RTC_DS1307::_burstRead(void)
{
_sendStart(DS1307_ADDR_W);
_waitForAck();
_writeByte(0);
_waitForAck();
_sendStop();
_sendStart(DS1307_ADDR_R);
_waitForAck();
for (int i=0; i<8; i++)
{
_burstArray[i] = _readByte();
if (i<7)
_sendAck();
else
_sendNack();
}
_sendStop();
}
uint8_t RTC_DS1307::_decode(uint8_t value)
{
uint8_t decoded = value & 127;
decoded = (decoded & 15) + 10 * ((decoded & (15 << 4)) >> 4);
return decoded;
}
uint8_t RTC_DS1307::_encode(uint8_t value)
{
uint8_t encoded = ((value / 10) << 4) + (value % 10);
return encoded;
}
uint8_t RTC_DS1307::isrunning(void) {
return !(_readRegister(0)>>7);
}
void RTC_DS1307::adjust(const DateTime& dt) {
_writeRegister(0, _encode(dt.second()));
_writeRegister(1, _encode(dt.minute()));
_writeRegister(2, _encode(dt.hour()));
_writeRegister(4, _encode(dt.day()));
_writeRegister(5, _encode(dt.month()));
_writeRegister(6, _encode(dt.year()-2000));
}
void RTC_DS1307::settime(const DateTime& dt) {
_writeRegister(0, _encode(dt.second()));
_writeRegister(1, _encode(dt.minute()));
_writeRegister(2, _encode(dt.hour()));
}
DateTime RTC_DS1307::now(void) {
_burstRead();
uint8_t ss = _decode(_burstArray[0]);
uint8_t mm = _decode(_burstArray[1]);
uint8_t hh = _decode(_burstArray[2]);
uint8_t d = _decode(_burstArray[4]);
uint8_t m = _decode(_burstArray[5]);
uint16_t y = _decode(_burstArray[6]) + 2000;
return DateTime (y, m, d, hh, mm, ss);
}
////////////////////////////////////////////////////////////////////////////////
// RTC_Millis implementation
long RTC_Millis::offset = 0;
void RTC_Millis::adjust(const DateTime& dt) {
offset = dt.unixtime() - millis() / 1000;
}
DateTime RTC_Millis::now() {
return (uint32_t)(offset + millis() / 1000);
}
////////////////////////////////////////////////////////////////////////////////
#######################################
# Syntax Coloring Map For RTC
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
DateTime KEYWORD1
RTC_DS1307 KEYWORD1
RTC_Millis KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
year KEYWORD2
month KEYWORD2
day KEYWORD2
hour KEYWORD2
minute KEYWORD2
second KEYWORD2
dayOfWeek KEYWORD2
secondstime KEYWORD2
unixtime KEYWORD2
begin KEYWORD2
adjust KEYWORD2
settime KEYWORD2
isrunning KEYWORD2
now KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################
проверил , вроде все почти работает как надо. за исключением мелочей
по рекомендациям незабвенного нашего Пухлявого ставлю время
rtc.adjust(DateTime( 2012, 06, 10, 12, 45, 12));
все ок, но
rtc.adjust(DateTime( 2012, 09, 10, 12, 45, 12));
ругается :
ds1307:13:28: error: invalid digit "9" in octal constant
rtc.adjust(DateTime( 2012, 09, 10, 12, 45, 12));
^
exit status 1
invalid digit "9" in octal constant
спрашивается с какого рожна ему не нравятся не okt цифры в переменной типа uint8_t
мне для коррекции 1307 по ntp надо ставить только время и я дополнил библиотеку методом settime и он делает то что мне надо, но вот только не выделяет в тексте программы, хотя я его вписал в keywords. почему так не пойму...
и наконец при прошивке через Progamming port надо пальцевать кнопки res и erase,тк оно почемутто автоматом не стирает перед записью, а native вообще не нашел драйверов...
Да понятно почему в окте нет цыфыр больше 7 :) я не мог понять причем тут окт
победил rtc
тут еще проблема нарисовалась - ethernet шильд на 5100 без изменений программы работавшей на меге не взлетает. Есть подозрения, что проблема с библиотекой SPI
Победил
тк у мну еще и сд висит то обязательно
SPI.begin(10);
SPI.begin(4);
Также для работы на меге инициализировал пины 4 и 10 на выход и прописывал в них 1. также принудительно пином ресеттил шильд.на дуэ это все не нужно и более того нельзя.
очередная проблема- не взлетает sd шильдовая и от отдельного модуля. Предполагаю, что из-за того, что ноги флешки соединены через делитель для адаптации к 5v сигналам. На модуле стоят 3.3к четыре резюка. Надо будет их снять , замкнуть и проверить без них. Думаю заработает.
Спасибо, попробую. А по железу что Вы используете для sd и DUE
Да типовые схемы, собственно. Можно и китайские модули SD, главное, чтобы в MISO модуль не гадил (есть некоторые неправильные, которые MISO не отпускают, когда CS в высоком). SdFat - работает чётко, я полностью на него перелез, отказавшись от штатной SD. А под STM32 - SDIO под STM32GENERIC пользую.
это известный модуль который срал в мисо и после этого перестал :) и плсле ЭТОГО долго и счстливо работает впаре с эзермодулем красным на 5100.
вроде снял и заменил перемычками резюки 3.3к и на библе sdFAT взлетело на стандартных примерах, но четто библа сильно перегруженная... разбираюсь... очень интересно можно ли? Делать произвольный поиск по файлу
по-одному работают вместе нет. Причем железячно они подключены, когда программно по одному инциируются и запускаются. А вот запустить обе сразу никак. CS сидят на 10 и 4 пинах. Используются красный зэрнет на W5100 и доработаннный модуль для SD ( убраны резисторы согласования с 5v и проведена доработка по мисо см картинку выше).
что прикольно - все инициализируется, зернет отрабатывает все правильно, по карте драйвер выдает правильную инициализацию и все не читает и не пишет...
AGregator 2.8.4
My IP adress: 192.168.88.234
My gateway: 192.168.88.254
My subnet mask: 255.255.248.0
My dns Server: 77.37.255.30
******************* NTP correction END ********************
И вот казалось бы нарисовал и зафгачил ПЕЧАТКУ фоторезистом, а там долбаная тресчинка и то не всегда видна и не всегда звонится на обрыв , a выглядит, как глюки библиотеки с дуёвым spiаем
и тут же взлетает эзернэт ибо это был CS
и SD инитится и даже фолдеры видит
AGregator 2.8.4_003
IP adress: 192.168.88.234
gateway: 192.168.88.254
subnet mask: 255.255.248.0
dns Server: 77.37.255.30
******************* NTP correction START********************
ask ntp.....ntp ok.....
Seconds since Jan 1 1900 = 3790178691
Unix time = 1581189891
The UTC time is 22:24:53
The local time is 1.1.2000,22:24:53
******************* NTP correction END ********************
SD card initialized.
List of files on the SD.
index1.htm
test.txt
modul/
chiller/
Done!
01012000.csv
modul/********.*** doesn't exist.
error: create Folder1/file1.txt failed
остается только перерихтовать с библы SD на SDfat создание файлов и запись в них лога, и миграция на дую свершится ....
ЗЫ дата правильная еще не выставлена и почему-то у этой заразы по-прежнему надо пальцАми стирать старую паршивку
Подскажите плз какой контекст искать, или ткните в тему, а то искал по-всякому , много чего нарыл, а про нестирание автоматом флеша призаливке ничего найти не смог...
Ага спасибо, я видел уже гдетто про добавление резистора, однако решил, что, если после прошивки она ресеттится сама, то у мнея несмотря на старую ревизию ок и добавлять не стал. А что же оно связано с erase получается?
кстати эта зараза все равно на эзернете и sdFat одновременно не работает. По очереди запросто. Как только я объявляю
SPI.begin(10);
SPI.begin(4);
sd не инитится, зернет не отдает клиенту, хотя адрес и проч принимает.
и наконец ТУТ , после дискуссии с нашим незабываемым Пухлявым выясняется несомненный успех после инициализации каждой линии SS интерфейса SPI
кстати, на ресетный мосфет впаял 10кОм, ничего не изменилось, все так же надо эрасить память перед прошивкой...
Нихрена не выходит каменный цветок
аппаратно езернет и sd подключены к SPI, у зернета ss-10 у sd-4 . MOSI у sd не гадит ибо 13 нога буфера подключена к ss а не к земле, как у оригинальнойсхемы. В таком варианте на меге все работает.
на дуе:
инициируется зернет (красная плата на w5100) и обращается по сетке за временем, получает время то есть в сеть ходит
потом если сказать SD.begin , то sd начинает работать, но отрубается w5100
если до sd.begin(10) и sd.begin(4) инициировать 10 как выход, то w5100 не запускается.
если инициировать только 4 как выход, то w5100 запускается, sd нет
Нашли непонятно что, которое уже и использовать не рекомендуется. Вся инициализация SS - это pinMode(pin,OUTPUT), это должна делать прикладная сторона, просто патамушта.
Я уже писал, что под Due юзаю SdFat, есть параллельно и другие устройства на SPI, вроде MCP23S17. Ethernet, правда, не юзаю уже давно. Но вы правы в одном - для Due надо подбирать библиотеки, не все взлетают.
когда же на 10 пине ss сигнал шины SPI , то уровень единицы выше 1.5 вольта не поднимается... и что прикольно, на 4 пине ss болтается между 3.2 и 1.5 , не опускаясь до нуля. При этом выводы пустые, я с них все снял.
и еще раз, блинк на этих ногах болтается как положено меду 3.2 и нулем
когда же на 10 пине ss сигнал шины SPI , то уровень единицы выше 1.5 вольта не поднимается... и что прикольно, на 4 пине ss болтается между 3.2 и 1.5 , не опускаясь до нуля. При этом выводы пустые, я с них все снял.
и еще раз, блинк на этих ногах болтается как положено меду 3.2 и нулем
в общем DUE и два устройства на SPI (W5100-красный и SD-с буфером) заработали.
решение получилось такое:
0- аппаратно - доработать модуль SD , убрать резисторы толерантности с MISO-SCK-MOSI-SS, завести 13 ногу буфера с земли на CS. далее подключение обычное MOSI-MISO-CSK на оба модуля, CS-w5100 на 10, CS-SD на 4, reset на reset w5100. земли на земли, питание 5v. (на обоих модулях есть собственный понижатель на 3.2).
возвращаясь к теме топика, DS1307 цепляется к I2C обычно с резисторами 4.7-6.8 кОм и питанием 3.2
бибилиотеки
//#include <SPI.h> //объявляется внутри Ether и SPI наверно можно убрать.
#include <Ethernet.h>
#include <EthernetUdp.h> //для моих нужд
#include "SdFat.h"
#include "RTCdue.h"
1- SS пины не инициализируем!!! только объявляем
#define W5100_CS 10 // порт управления сетевой платой
#define SD_CS 4 // порт управления SD картой
2- инициализация w5100 совсем простая (приведен мой случай, когда после инита я получаю время)
if (!SD.begin(SD_CS)) {
Serial.print("SD card on port "); Serial.print(SD_CS); Serial.println(" initialization failed!");
return;
}
Serial.println("SD card initialized.");
cout << F("\nList of files on the SD.\n"); //поток надо раньше организовать
SD.ls(LS_R);
cout << F("Done!\n");
//***************************************** проверка или создание лог файла для модулей ****************
{ String tmp = "modul/" + log_fileName() ;
char log_name[tmp.length()+1];
tmp.toCharArray(log_name, sizeof(log_name));
if (SD.exists(log_name)) {
Serial.print("SUCCESS - Found ");Serial.print(log_name);Serial.println(" file.");
} else {
Serial.print(log_name); Serial.println(" doesn't exist.");
if (!file.open(log_name, O_WRONLY | O_CREAT)) { //file надо раньше объявить
Serial.print(log_name); Serial.println(" create failed");
} else {Serial.print(log_name); Serial.println(" create sucess");
logstring = "Date,Time";
for (byte i = 0; i <54 ; i++){
logstring += ",";
logstring += tpa_name[tpa[i][0]-1];
logstring += "-";
logstring += tpa[i][1];
logstring += ",,,";
}
file.println(log_name);
file.close();
Serial.println(logstring);
Serial.print("SUCCESS - log file Created ");Serial.print(log_name);Serial.println(" file.");
}
}
}
4- если обращаемся к W5100 то так
SPI.begin(W5100_CS);
SPI.setClockDivider(W5100_CS,10); // по необходимости
client_mod = server_mod.available();
if (client_mod) {
//******************************выдаем страницу**********************
client_mod.stop();
Serial.println(" disconnected status OK");
}
SPI.end();
то есть обязательно закрываем сессию работы по SPI, иначе SD перестает работать
если дать команду SPI.begin(4) для SS SD-карты, то сигнал SS перестает падать до нуля и SD не работает.
если инитить SS-10 как выход, то перестает подниматься SS-10 до 3.2v и перестает работать W5100.
к сожаление такой способ не подходит для выдачи страницы web-браузеру , или выгрузки например лог-файла, когда требуется одновременная работа из SD в буфер и из буфера в client.write(buf,len_buf);
почему такая срань с сигналами непонятно, может кто подскажет, я пока буду пользоваться тем, что нарыл, исследовать буду если время появится... надо смотреть, как в библиотеках инитятся пины SS
и, несмотря на впаянный на ресетовый мосфет резистор, автоматический erase при перепрошивке так и не появился...
может быть вскорости выложу полное решение, но , предварительно :
дуе, эзернет на аппаратном spi на cs-10, и sd на софтверном spi на библе sdFat на произвольных пинах дуи заработали совместно
то есть стандартный пример вэб сервера и приаатаченый к нему пример ридврайт из библы sdFat на софтверном spi !!! Взлетели вместе. Не забываем прописать в нужном месте sdfat.h единичку , посмотрев пример софтверного spi.
клиент.врайт выводит в бравзер полученное из sd.read
респект за подсказку нашему давнему другу, который перестал сюда приходить.
товарищ и друг модератор извини, но это запостилось дважды (почемутто). Прошу раннее это прибить. СЛАВА ЭТОМУ !!!
стало мало оперативы на меге и решил попробовать дую
маладец, чо :)
естесссенно установил все, что положено установить
проверил компиляцию программы - выдает ошибки только на rtc. нашел старые ветки качнул библиотеку RTCdue-master
проверил , вроде все почти работает как надо. за исключением мелочей
по рекомендациям незабвенного нашего Пухлявого ставлю время
все ок, но
ругается :
потому что надо писать не "09", а просто 9 - это ведь число, а не строчка, зачем в ней лидирующий ноль?
А первый ноль в цифре зарезервирован под восьмеричные цифры
ага, спасибо, я не знал про лидирующий ноль и восьмеричные ... написал как у Пухлявого, а ОН оказался неправ :)
может быть и по двум другим вопросам просветите ?
ага, спасибо, я не знал про лидирующий ноль и восьмеричные ... написал как у Пухлявого, а ОН оказался неправ :)
дело в том, что его строчка 06 будет работать, причем без ошибок, а вот ваша 09 - нет :) Догадайтесь почему...
нет,
по второму вопросу - меня абсолютно не трогает подсветка синтаксиса в ИДЕ. никогда не интересовался.
А третий вопрос я вообще не понял, вероятно потому, что у меня нет Дуе...
Да понятно почему в окте нет цыфыр больше 7 :) я не мог понять причем тут окт
победил rtc
тут еще проблема нарисовалась - ethernet шильд на 5100 без изменений программы работавшей на меге не взлетает. Есть подозрения, что проблема с библиотекой SPI
Победил
тк у мну еще и сд висит то обязательно
SPI.begin(10);
SPI.begin(4);
Также для работы на меге инициализировал пины 4 и 10 на выход и прописывал в них 1. также принудительно пином ресеттил шильд.на дуэ это все не нужно и более того нельзя.
очередная проблема- не взлетает sd шильдовая и от отдельного модуля. Предполагаю, что из-за того, что ноги флешки соединены через делитель для адаптации к 5v сигналам. На модуле стоят 3.3к четыре резюка. Надо будет их снять , замкнуть и проверить без них. Думаю заработает.
не взлетело. Теперь как и на эзершильде инициализация sd происходит , а файл не создается, имеющийся не читается.
чтотто у меня ощущение, что для дуи нужна специяльная библиОтека
Для работы с SD на Due я использую SdFat.
Спасибо, попробую. А по железу что Вы используете для sd и DUE
Спасибо, попробую. А по железу что Вы используете для sd и DUE
Да типовые схемы, собственно. Можно и китайские модули SD, главное, чтобы в MISO модуль не гадил (есть некоторые неправильные, которые MISO не отпускают, когда CS в высоком). SdFat - работает чётко, я полностью на него перелез, отказавшись от штатной SD. А под STM32 - SDIO под STM32GENERIC пользую.
Оода
это известный модуль который срал в мисо и после этого перестал :) и плсле ЭТОГО долго и счстливо работает впаре с эзермодулем красным на 5100.
вроде снял и заменил перемычками резюки 3.3к и на библе sdFAT взлетело на стандартных примерах, но четто библа сильно перегруженная... разбираюсь... очень интересно можно ли? Делать произвольный поиск по файлу
очень интересно можно ли? Делать произвольный поиск по файлу
Насколько я помню - нет. Надо, как обычно - читать, искать. Можно реализовать поиск алгоритмом Бойера-Мура, например - будет меньше операций чтения.
Ну да читать искать. А вот например найти (по некоторому правилу) позицию отначала 237-ю и от неёзаписать 4 байта...
Ну да читать искать. А вот например найти (по некоторому правилу) позицию отначала 237-ю и от неёзаписать 4 байта...
Всё зависит от вводных. Так то всё решаемо.
... просто при работе с обычной библиотекой я никак не мог писать в позицию seek не открыв файл неописанным в обычной документации к либе способом.
https://arduino.ru/forum/programmirovanie/vopros-po-biblioteke-sd
потом с любезной подсказкой b707 этот вопрос был решен.
вот собственно более полный вопрос возможно в этой либе найти контент в файле и изменить его...
... просто при работе с обычной библиотекой я никак не мог писать в позицию seek не открыв файл неописанным в обычной документации к либе способом.
https://arduino.ru/forum/programmirovanie/vopros-po-biblioteke-sd
потом с любезной подсказкой b707 этот вопрос был решен.
вот собственно более полный вопрос возможно в этой либе найти контент в файле и изменить его...
Как обычно - открываете файл с флагами на чтение и запись, и вперёд - seekSet и прочее.
Не не взлетают одновременно эзернет и SD
по-одному работают вместе нет. Причем железячно они подключены, когда программно по одному инциируются и запускаются. А вот запустить обе сразу никак. CS сидят на 10 и 4 пинах. Используются красный зэрнет на W5100 и доработаннный модуль для SD ( убраны резисторы согласования с 5v и проведена доработка по мисо см картинку выше).
что прикольно - все инициализируется, зернет отрабатывает все правильно, по карте драйвер выдает правильную инициализацию и все не читает и не пишет...
Чуть продвинулся , с библиотекой sdfat получилось при работающем эзернете прочитать каталоги и файлы с sd.
и тут же взлетает эзернэт ибо это был CS
и SD инитится и даже фолдеры видит
остается только перерихтовать с библы SD на SDfat создание файлов и запись в них лога, и миграция на дую свершится ....
ЗЫ дата правильная еще не выставлена и почему-то у этой заразы по-прежнему надо пальцАми стирать старую паршивку
и почему-то у этой заразы по-прежнему надо пальцАми стирать старую паршивку
Due старой ревизии, резетится некорректно, вернее, не всегда резетится. Решение есть, обсуждалось и тут на форуме, помнится.
Подскажите плз какой контекст искать, или ткните в тему, а то искал по-всякому , много чего нарыл, а про нестирание автоматом флеша призаливке ничего найти не смог...
Вот: https://www.dimdim.gr/2016/03/fixing-startup-issues-with-arduino-dues/
Ага спасибо, я видел уже гдетто про добавление резистора, однако решил, что, если после прошивки она ресеттится сама, то у мнея несмотря на старую ревизию ок и добавлять не стал. А что же оно связано с erase получается?
кстати эта зараза все равно на эзернете и sdFat одновременно не работает. По очереди запросто. Как только я объявляю
SPI.begin(10);
SPI.begin(4);
sd не инитится, зернет не отдает клиенту, хотя адрес и проч принимает.
Как только я объявляю
SPI.begin(10);
SPI.begin(4);
sd не инитится, зернет не отдает клиенту, хотя адрес и проч принимает.
Не понял. У SPI.begin - нет параметров, тащемта. Просто один раз позвали SPI.begin() - и всё: https://www.arduino.cc/en/Reference/SPIBegin
А SS уже каждый сам рулит, когда надо. Если надо по ходу менять настройки SPI - то грамотные либы юзают beginTransaction по своими настройками.
Там для дуи надо инициировать каждый ss
описано в расширенных spi и тут порусски
и еще тут говорится, что 4 ss не надо вообще объявлять выходом
тут и тут тоже есть про spi
и наконец ТУТ , после дискуссии с нашим незабываемым Пухлявым выясняется несомненный успех после инициализации каждой линии SS интерфейса SPI
кстати, на ресетный мосфет впаял 10кОм, ничего не изменилось, все так же надо эрасить память перед прошивкой...
Нихрена не выходит каменный цветок
аппаратно езернет и sd подключены к SPI, у зернета ss-10 у sd-4 . MOSI у sd не гадит ибо 13 нога буфера подключена к ss а не к земле, как у оригинальнойсхемы. В таком варианте на меге все работает.
на дуе:
инициируется зернет (красная плата на w5100) и обращается по сетке за временем, получает время то есть в сеть ходит
потом если сказать SD.begin , то sd начинает работать, но отрубается w5100
если до sd.begin(10) и sd.begin(4) инициировать 10 как выход, то w5100 не запускается.
если инициировать только 4 как выход, то w5100 запускается, sd нет
сломал весь моск
Что из процитированного прошло мимо понимания?
These APIs should not be used in new projects. Use SPISettings with SPI.beginTransaction() to configure SPI parameters.
Нашли непонятно что, которое уже и использовать не рекомендуется. Вся инициализация SS - это pinMode(pin,OUTPUT), это должна делать прикладная сторона, просто патамушта.
еще нарыл это
Да, но транзакшн применяются в нутрях библиотек
если я пишу сам библиотеку то я должен применять приведенное Вами
я же пытаюсь использовать существующие библиотеки и прихожу к печальному выводу, что для дуи они неприспособлены.
в частности видимо тем, что не отпускают по завершении транзакции шину.
кстати в этом надо покопаться....
Я уже писал, что под Due юзаю SdFat, есть параллельно и другие устройства на SPI, вроде MCP23S17. Ethernet, правда, не юзаю уже давно. Но вы правы в одном - для Due надо подбирать библиотеки, не все взлетают.
Что странно так это уровни сигналов
блинк на 10 пине болтается между 3.2 и 0
когда же на 10 пине ss сигнал шины SPI , то уровень единицы выше 1.5 вольта не поднимается... и что прикольно, на 4 пине ss болтается между 3.2 и 1.5 , не опускаясь до нуля. При этом выводы пустые, я с них все снял.
и еще раз, блинк на этих ногах болтается как положено меду 3.2 и нулем
Что странно так это уровни сигналов
блинк на 10 пине болтается между 3.2 и 0
когда же на 10 пине ss сигнал шины SPI , то уровень единицы выше 1.5 вольта не поднимается... и что прикольно, на 4 пине ss болтается между 3.2 и 1.5 , не опускаясь до нуля. При этом выводы пустые, я с них все снял.
и еще раз, блинк на этих ногах болтается как положено меду 3.2 и нулем
Чудес не бывает а херня случается :(
Вымарал объявление 10 пина как выхода, сигнал на нем стал полного размаха
вымарал с 4 пина, ничего не изменилось , все равно сволочь в ноль не падает такое ощущение, что оно болтается между единицей и Z
в общем DUE и два устройства на SPI (W5100-красный и SD-с буфером) заработали.
решение получилось такое:
0- аппаратно - доработать модуль SD , убрать резисторы толерантности с MISO-SCK-MOSI-SS, завести 13 ногу буфера с земли на CS. далее подключение обычное MOSI-MISO-CSK на оба модуля, CS-w5100 на 10, CS-SD на 4, reset на reset w5100. земли на земли, питание 5v. (на обоих модулях есть собственный понижатель на 3.2).
возвращаясь к теме топика, DS1307 цепляется к I2C обычно с резисторами 4.7-6.8 кОм и питанием 3.2
бибилиотеки
1- SS пины не инициализируем!!! только объявляем
2- инициализация w5100 совсем простая (приведен мой случай, когда после инита я получаю время)
3- работаем с SD
4- если обращаемся к W5100 то так
то есть обязательно закрываем сессию работы по SPI, иначе SD перестает работать
если дать команду SPI.begin(4) для SS SD-карты, то сигнал SS перестает падать до нуля и SD не работает.
если инитить SS-10 как выход, то перестает подниматься SS-10 до 3.2v и перестает работать W5100.
к сожаление такой способ не подходит для выдачи страницы web-браузеру , или выгрузки например лог-файла, когда требуется одновременная работа из SD в буфер и из буфера в client.write(buf,len_buf);
почему такая срань с сигналами непонятно, может кто подскажет, я пока буду пользоваться тем, что нарыл, исследовать буду если время появится... надо смотреть, как в библиотеках инитятся пины SS
и, несмотря на впаянный на ресетовый мосфет резистор, автоматический erase при перепрошивке так и не появился...
Мучился я мучился и наконец получил рузултат
модет быть вскорости выложу полное решение, но , предварительно :
дуе, эзернет на аппаратном spi на cs-10, и sd на софтверном spi на библе sdFat заработали совместно
то есть стандартный пример вэб сервера и приаатаченый к нему пример ридврайт из библы sdFat на софтверном spi !!! Взлетели вместе.
клиент.врайт выводит в бравзер полученное из sd.read
Мучился я мучился и наконец получил рузултат
может быть вскорости выложу полное решение, но , предварительно :
дуе, эзернет на аппаратном spi на cs-10, и sd на софтверном spi на библе sdFat на произвольных пинах дуи заработали совместно
то есть стандартный пример вэб сервера и приаатаченый к нему пример ридврайт из библы sdFat на софтверном spi !!! Взлетели вместе. Не забываем прописать в нужном месте sdfat.h единичку , посмотрев пример софтверного spi.
клиент.врайт выводит в бравзер полученное из sd.read
респект за подсказку нашему давнему другу, который перестал сюда приходить.
товарищ и друг модератор извини, но это запостилось дважды (почемутто). Прошу раннее это прибить. СЛАВА ЭТОМУ !!!