Табло курса валют управляемое по HTTP
- Войдите на сайт для отправки комментариев
Решил не засирать все темы понемногу, потому буду задалбывать централизованно.
Базовая идея:
3 валюты на 24 =3*(4+4) семисегментниках.
Управление по сети (Так надо, возможно ихдудет несколько).
Восстановление статуса после ребута.
Управление: UNO, W5100 (сеть), 3хMAX7219ENG.
Блок с езернетом в помещении(требования безопасности), максы и диоды выносные, на щите.
Пока предвижу грабли: W5100 и максы на SPI, но вот SS ноги у макса то и нету. Как их поделить?
- Мне видится вариант: в сетапе выставить табло и отключить его управление(как?), далее уже включать w5100 и писать курс при поступлении оного в ЕЕПРОМ, далее ребут. Есть потрезвее мысли?
грабли №2 Семисегментники с общим анодом(дада искал, нету как класса). Вроде буржуины пишут что если ОА сегменты включить поменяв DIG и SEG ноги местами, то работать будет, но библу символов надо писать свою т.к. картинку будет транспонировать (8. на 1ю цифру выдаст "-" на все цифры). Кто что думает по сабжу?
Пока код теоретически такой:
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char curr[] = {'0','0','0','0','2','0','0','0','0','2','0','0','0','0','2','0','0','0','0','2','0','0','0','0','2','0','0','0','0','2'};
IPAddress ip(192, 168, 100, 100); // IP address, may need to change depending on network
EthernetServer server(80); // create a server at port 80
String HTTP_req; // stores the HTTP request
boolean LED_status = 0; // state of LED, off by default
void setup()
{
Ethernet.begin(mac, ip); // initialize Ethernet device
server.begin(); // start to listen for clients
Serial.begin(9600); // for diagnostics
pinMode(2, OUTPUT); // LED on pin 2
}
void loop()
{
EthernetClient client = server.available(); // try to get client
if (client) { // got client?
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) { // client data available to read
char c = client.read(); // read 1 byte (character) from client
HTTP_req += c; // save the HTTP request 1 char at a time
// last line of client request is blank and ends with \n
// respond to client only after last line received
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// send web page
client.println("<!DOCTYPE html>");
client.println("<html>");
client.println("<head>");
client.println("<title>LED screen Control</title>");
client.println("</head>");
client.println("<body>");
client.println("<h1>LED</h1>");
client.println("<p>Input currencies: buy - sell - dot position </p>");
client.println("<form method=\"get\">");
client.println("USD: <INPUT NAME=\"1\" SIZE=\"4\" MAXLENGTH=\"4\" > <INPUT NAME=\"2\" SIZE=\"5\" MAXLENGTH=\"5\" ><INPUT NAME=\"3\" SIZE=\"1\" MAXLENGTH=\"1\" ><BR> ");
client.println("EUR: <INPUT NAME=\"4\" SIZE=\"4\" MAXLENGTH=\"4\" > <INPUT NAME=\"5\" SIZE=\"5\" MAXLENGTH=\"5\" ><INPUT NAME=\"6\" SIZE=\"1\" MAXLENGTH=\"1\" ><BR> ");
client.println("RUR: <INPUT NAME=\"7\" SIZE=\"4\" MAXLENGTH=\"4\" > <INPUT NAME=\"8\" SIZE=\"5\" MAXLENGTH=\"5\" ><INPUT NAME=\"9\" SIZE=\"1\" MAXLENGTH=\"1\" ><BR> ");
client.println("<INPUT TYPE=SUBMIT>");
client.println("</form>");
client.println("</body>");
client.println("</html>");
Serial.print(HTTP_req);
if (HTTP_req.indexOf("i0=") > -1) { // see if usd_part_1 come
for (int i=0; i <= 5; i++){ //забить значения курсов
String ss="i";ss+=i;ss+="=";
int charpos=HTTP_req.indexOf(ss)+3;
for (int j=0; j <= 3; j++){
curr[i*5+j]=HTTP_req.charAt(int (charpos));}
}
for (int i=6; i <= 8; i++){ // забить позиции точек
String ss="i";ss+=i;ss+="=";
int charpos=HTTP_req.indexOf(ss)+3;
curr[(i-6)*10+4]=HTTP_req.charAt(int (charpos));
curr[(i-6)*10+9]=HTTP_req.charAt(int (charpos));
}
Serial.println(curr);
HTTP_req = "";} // finished with request, empty string
break;
}
// every line of text received from the client ends with \r\n
if (c == '\n') {
// last character on line of received text
// starting new line with next character read
currentLineIsBlank = true;
}
else if (c != '\r') {
// a text character was received from client
currentLineIsBlank = false;
}
} // end if (client.available())
} // end while (client.connected())
delay(1); // give the web browser time to receive the data
client.stop(); // close the connection
} // end if (client)
}
Отрисовать страничку, получить данные, записать их в ЕЕПРОМ
За неимением w5100, получаю строку из сериала
#include <EEPROM.h>
char curr[30];
String HTTP_req,s1; // stores the HTTP request
boolean stringComplete = false; // whether the string is complete
void setup()
{
Serial.begin(9600);
for (int i = 0; i <=29; i++) {curr[i]=EEPROM.read(i);delay(10);};
delay(100);
Serial.println(curr);
s1.reserve(200);
}
void loop()
{
if (stringComplete) {
Serial.println(s1);
// clear the string:
HTTP_req=s1;
s1 = "";
stringComplete = false;
}
if (HTTP_req.indexOf("i0=") > -1) { // see if usd_part_1 come
for (int i=0; i <= 5; i++){ //забить значения курсов
String ss="i";ss+=i;ss+="=";
int charpos=HTTP_req.indexOf(ss)+3;
for (int j=0; j <= 3; j++){
curr[i*5+j]=HTTP_req.charAt(int (charpos));}
}
for (int i=6; i <= 8; i++){ // забить позиции точек
String ss="i";ss+=i;ss+="=";
int charpos=HTTP_req.indexOf(ss)+3;
curr[(i-6)*10+4]=HTTP_req.charAt(int (charpos));
curr[(i-6)*10+9]=HTTP_req.charAt(int (charpos));
}
Serial.println(curr);
for (int i = 0; i <= 29; i++) {EEPROM.write(i, curr[i]); curr[i]='0';}
for (int i = 0; i <=29; i++) curr[i]=EEPROM.read(i);
Serial.println(curr);
HTTP_req = "";} // finished with request, empty string
}
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
s1 += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
}
}
}
работу с ЕЕПРОМ пока не перенес в основу.
как это нету 7-сегментника с общим анодом? Первая попавшаяся ссылка . Достать нужного размера не проблема.
как это нету 7-сегментника с общим анодом? Первая попавшаяся ссылка . Достать нужного размера не проблема.
К сожалению править первый пост низя. Имелось в виду, что взял ОА т.к. 38мм ОК нету (хотя по даташиту и есть). Есличо Украина.
SPI на W5100 активен только в те моменты когда вы непосредственно к нему обращаетесь так C++ на микроконтроллерах линейный язык(выполняется одним потоком) то можно быть абсолютно увереным что SPI свободен для следующих команд на другие устройство. главное не забывать CS чипа(MAX7219) отключать по завершении команд, чтобы когда пойдет опрос сетевушки она не мешалась.
вобщем вот мой пример работы с максами
#include <SPI.h> #define CS_PIN 53 int maxInUse = 6; //change this variable to set how many MAX7219's you'll use const byte code[66][16] = { 255,255,233,233,225,225,225,225,225,225,225,225,233,233,255,255, 96,112,96,96,96,96,96,96,96,96,96,96,96,96,96,96, 255,255,233,104,96,96,104,255,255,137,129,129,137,137,255,255, 255,255,104,104,96,96,104,255,255,104,96,96,104,104,255,255, 225,225,225,225,225,225,233,255,255,104,96,96,96,96,96,96, 255,255,233,137,129,129,137,255,255,104,96,96,104,104,255,255, 255,255,137,137,129,129,137,255,255,233,225,225,233,233,255,255, 255,255,233,104,96,96,96,96,96,96,96,96,96,96,96,96, 255,255,233,233,225,225,233,255,255,233,225,225,233,233,255,255, 255,255,233,233,225,225,233,255,255,104,96,96,104,104,255,255, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,12,12,255,255,255,255,255,255,//1 0,0,0,0,0,0,0,4,8,12,255,255,255,255,255,255,//2 0,0,0,0,0,0,0,12,0,12,255,255,255,255,255,255,//3 0,0,0,0,0,0,4,12,0,8,255,255,255,255,255,255,//4 0,0,0,0,0,0,12,12,0,0,255,255,255,255,255,255,//5 0,0,0,0,0,4,12,12,0,0,200,255,255,255,255,255,//6 0,0,0,0,0,12,12,12,0,0,192,255,255,255,255,255,//7 0,0,0,0,2,12,12,12,0,0,192,220,255,255,255,255,//8 0,0,0,0,18,12,12,12,0,0,192,204,255,255,255,255,//9 0,0,0,0,22,12,12,12,0,0,192,200,255,255,255,255,//10 0,0,0,0,30,12,12,12,0,0,192,192,255,255,255,255,//11 0,0,0,1,30,12,12,12,0,0,192,192,254,255,255,255,//12 0,0,0,33,30,12,12,12,0,0,192,192,222,255,255,255,//13 0,0,0,35,30,12,12,12,0,0,192,192,220,255,255,255,//14 0,0,0,51,30,12,12,12,0,0,192,192,204,255,255,255,//15 0,0,0,55,30,12,12,12,0,0,192,192,200,255,255,255,//16 0,0,0,63,30,12,12,12,0,0,192,192,192,255,255,255,//17 0,0,128,63,30,12,12,12,0,0,192,192,192,127,255,255,//18 0,0,192,63,30,12,12,12,0,0,192,192,192,63,255,255,//19 0,0,193,63,30,12,12,12,0,0,192,192,192,62,255,255,//20 0,0,225,63,30,12,12,12,0,0,192,192,192,30,255,255,//21 0,0,227,63,30,12,12,12,0,0,192,192,192,28,255,255,//22 0,0,243,63,30,12,12,12,0,0,192,192,192,12,255,255,//23 0,0,247,63,30,12,12,12,0,0,192,192,192,8,255,255,//24 0,0,255,63,30,12,12,12,0,0,192,192,192,0,255,255,//25 0,0,255,191,30,12,12,12,0,0,192,192,64,0,255,255,//26 0,0,255,255,30,12,12,12,0,0,192,192,0,0,255,255,//27 0,128,255,255,30,12,12,12,0,0,192,192,0,0,127,255,//28 0,192,255,255,30,12,12,12,0,0,192,192,0,0,63,255,//29 0,193,255,255,30,12,12,12,0,0,192,192,0,0,62,255,//30 0,225,255,255,30,12,12,12,0,0,192,192,0,0,30,255,//31 0,227,255,255,30,12,12,12,0,0,192,192,0,0,28,255,//32 0,243,255,255,30,12,12,12,0,0,192,192,0,0,12,255,//33 0,247,255,255,30,12,12,12,0,0,192,192,0,0,8,255,//34 0,255,255,255,30,12,12,12,0,0,192,192,0,0,0,255,//35 0,255,255,255,30,140,12,12,0,0,64,192,0,0,0,255,//36 0,255,255,255,30,204,12,12,0,0,0,192,0,0,0,255,//37 0,255,255,255,158,204,12,12,0,0,0,64,0,0,0,255,//38 0,255,255,255,255,204,12,12,0,0,0,0,0,0,0,255,//39 128,255,255,255,255,255,12,12,0,0,0,0,0,0,0,127,//40 192,255,255,255,255,255,12,12,0,0,0,0,0,0,0,63,//41 193,255,255,255,255,255,12,12,0,0,0,0,0,0,0,62,//42 225,255,255,255,255,255,12,12,0,0,0,0,0,0,0,30,//43 227,255,255,255,255,255,12,12,0,0,0,0,0,0,0,28,//44 243,255,255,255,255,255,12,12,0,0,0,0,0,0,0,12,//45 247,255,255,255,255,255,12,12,0,0,0,0,0,0,0,8,//46 255,255,255,255,255,255,12,12,0,0,0,0,0,0,0,0,//47 255,255,137,137,129,129,137,255,255,137,129,129,137,137,255,255,//E 255,255,137,137,129,129,137,255,255,137,129,129,129,129,129,129,//F 255,255,137,137,129,129,129,249,249,225,225,225,233,233,255,255,//G 225,225,225,225,225,225,233,255,255,233,225,225,225,225,225,225,//H 0,0,129,129,0,0,129,129,129,129,129,129,129,129,131,131,//I 112,112,96,96,96,96,96,96,96,96,96,96,233,233,255,255,//J 225,225,225,225,225,225,233,159,159,233,225,225,225,225,225,225,//K 129,129,129,129,129,129,129,129,129,129,129,129,233,233,255,255//L }; // define max7219 registers #define max7219_reg_noop 0x00 #define max7219_reg_digit0 0x01 #define max7219_reg_digit1 0x02 #define max7219_reg_digit2 0x03 #define max7219_reg_digit3 0x04 #define max7219_reg_digit4 0x05 #define max7219_reg_digit5 0x06 #define max7219_reg_digit6 0x07 #define max7219_reg_digit7 0x08 #define max7219_reg_decodeMode 0x09 #define max7219_reg_intensity 0x0a #define max7219_reg_scanLimit 0x0b #define max7219_reg_shutdown 0x0c #define max7219_reg_displayTest 0x0f void setup () { pinMode(CS_PIN, OUTPUT); SPI.begin(); init_max(); attachInterrupt(0, creditAdd, FALLING); } void loop () { byte ir=47; for(ir=47;ir>0;ir--){ printNum(ir,ir); delay(600);} printTxt((char*)"E3",0); delay(3000); printTxt((char*)"GK",0); delay(3000); printTxt((char*)"JI",0); delay(3000); printTxt((char*)"LI",0); delay(3000); printTxt((char*)"HL",0); delay(3000); } void creditAdd(){ } void printTxt(char* txt, byte time){ byte text[2]={10,10}; if(txt[0] >= 'D' && txt[0] <= 'L')text[0] = 58+txt[0]-'E'; if(txt[0] >= '0' && txt[0] <= '9')text[0] = txt[0]-'0'; if(txt[1] >= 'E' && txt[1] <= 'L')text[1] = 58+txt[1]-'E'; if(txt[1] >= '0' && txt[1] <= '9')text[1] = txt[1]-'0'; time +=10; byte i=0; boolean e = false; for(i=0;i<16;i++){ if(8-i == 0)e = true; if(e){ maxOne(2,i-7,code[text[0]][i]); maxOne(4,i-7,code[text[1]][i]); maxOne(6,i-7,code[time][i]); }else{ maxOne(1,8-i,code[text[0]][i]); maxOne(3,8-i,code[text[1]][i]); maxOne(5,8-i,code[time][i]); } } } void printNum(byte num, byte time){ byte i=0; byte d2 = num%10; byte d1 = num/10; if(d1 == 0) d1 = 10; time +=10; boolean e = false; for(i=0;i<16;i++){ if(8-i == 0)e = true; if(e){ maxOne(2,i-7,code[d1][i]); maxOne(4,i-7,code[d2][i]); maxOne(6,i-7,code[time][i]); }else{ maxOne(1,8-i,code[d1][i]); maxOne(3,8-i,code[d2][i]); maxOne(5,8-i,code[time][i]); } } //time print } void maxSingle( byte reg, byte col) { //maxSingle is the "easy" function to use for a //single max7219 digitalWrite(CS_PIN, LOW); // begin SPI.transfer(reg); // specify register SPI.transfer(col); //((data & 0x01) * 256) + data >> 1); // put data digitalWrite(CS_PIN, LOW); // and CS_PIN da shit digitalWrite(CS_PIN,HIGH); } void maxAll (byte reg, byte col) { // initialize all MAX7219's in the system int c = 0; digitalWrite(CS_PIN, LOW); // begin for ( c =1; c<= maxInUse; c++) { SPI.transfer(reg); // specify register SPI.transfer(col);//((data & 0x01) * 256) + data >> 1); // put data } digitalWrite(CS_PIN, LOW); digitalWrite(CS_PIN,HIGH); } void maxOne(byte maxNr, byte reg, byte col) { //maxOne is for adressing different MAX7219's, //whilele having a couple of them cascaded int c = 0; digitalWrite(CS_PIN, LOW); // begin for ( c = maxInUse; c > maxNr; c--) { SPI.transfer(0); // means no operation SPI.transfer(0); // means no operation } SPI.transfer(reg); // specify register SPI.transfer(col);//((data & 0x01) * 256) + data >> 1); // put data for ( c =maxNr-1; c >= 1; c--) { SPI.transfer(0); // means no operation SPI.transfer(0); // means no operation } digitalWrite(CS_PIN, LOW); // and CS_PIN da shit digitalWrite(CS_PIN,HIGH); } void init_max(){ byte i; //initiation of the max 7219 maxAll(max7219_reg_scanLimit, 0x07); maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode maxAll(max7219_reg_displayTest, 0x00); // no display test for (i=1; i<=8; i++) { // empty registers, turn all LEDs off maxAll(i,0); } maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set // range: 0x00 to 0x0f }Вот видео как это работало http://www.youtube.com/watch?v=BAYQVUJWFqI И сама схема
Кто-то где-то писал, что банального ложения CS пина 5100 не хватает, чтобы ее отрубить. А если и можна, то она же слушать клиента в общем все равно должна. Далее... SS лапы у 7219 нету, она есть у 7221, а у 7219 это LOAD... который по умолчанию висит на 11 ноге. Но вот вопрос какой возник. При инициализации LedControl lc1=LedControl(9,10,11,1); видимо оно на софтовом спае и можна спакойно эти ноги переткнуть куда душе угодно (???). Тоесть они вообще не мешают друг-другу. А на тормоза любого из них мне кагбе плевать.
Только что решил не ждать пока придут сегменты, и купил 2 по 4 ОА для тестов. Сижу паяю их и тут доходит что я баран имею макетку. А с ног то уже пообгрызал лишнее. Завтра пойду еще пару куплю... Они по баксу, можна портить.
вобщем вот мой пример работы с максами
как по мне, то это высший пилотаж... А я пока только к штурвалу примеряюсь и ищу кнопку ВКЛ.
Кто-то где-то писал, что банального ложения CS пина 5100 не хватает, чтобы ее отрубить.
этот баг описан в application note на сайте wiznet
в последней версии arduino ethernet shield этот баг учтен и если на схему посомтрите то CS через инвертор подключен к еще одному входу wiznet5100, так что если используете правильный shield или устете при разработке собственной платы то wiznet5100 мешать другим на шине SPI не будет
что касается MAX7219 то к ней можно подключать и ОК и ОА. просто в одном случае будет работать встроенный декодер BCD а в другом не будет и нужно будет самому управлять отдельными сегментами
кстати семисегментник не единственный вариант, есть готовые панели, например sureelectronics знаменита недорогими панельками, к тому же они есть с несколькими цветами и позволяют нарашивать их в большую матрицу
вот я такую давно купил, только сейчас запустил:
управление похоже на max7219, есть индивидуальная адресация каждой точки, есть регулировка яркости, режим мигания и есть библиотека для ардуинки
этот баг описан в application note на сайте wiznet
в последней версии arduino ethernet shield этот баг учтен и если на схему посомтрите то CS через инвертор подключен к еще одному входу wiznet5100, так что если используете правильный shield или устете при разработке собственной платы то wiznet5100 мешать другим на шине SPI не будет
что касается MAX7219 то к ней можно подключать и ОК и ОА. просто в одном случае будет работать встроенный декодер BCD а в другом не будет и нужно будет самому управлять отдельными сегментами
кстати семисегментник не единственный вариант
Спасибо, w5100 еще не приехала, потому пока ревизию не знаю, и совсем не факт что кетайцы изменили :)
Про подключение ОА уже нашел, купил и напаял на мекетку 8 семисегментов ОА и обнаружил что в итоге имею 8 катодов, 8 анодов и это более чем логично.
По поводу декодера, разве он в чипе? Не библиотека ledcontrol за него отвечает?
По поводу выбора. Как кто-то уже писал, проэкт и бюджет утверждены, комплектующие оплачены... Потому лепим что есть. Да и ждать от китайцев приходу некогда...
Спасибо, w5100 еще не приехала, потому пока ревизию не знаю, и совсем не факт что кетайцы изменили :)
я писал про ревизию платы arduino ethernet shield. Баг есть в любом чипе wiznet5100, на свежей плате ардуино он обыгран как написано разработчиком чипа
По поводу декодера, разве он в чипе? Не библиотека ledcontrol за него отвечает?
советую читать первоисточник )) даташит на max7219
void LedControl::setChar(int addr, int digit, char value, boolean dp) { int offset; byte index,v; if(addr<0 || addr>=maxDevices) return; if(digit<0 || digit>7) return; offset=addr*8; index=(byte)value; if(index >127) { //nothing define we use the space char value=32; } v=charTable[index]; if(dp) v|=B10000000; status[offset+digit]=v; spiTransfer(addr, digit+1,v); }ledcontrol.cpp
ledcontrol.h
const static byte charTable[128] = { B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000, B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111, .... bla bla lbla..как-то намекает... как по мне... :) Хотя я еще далек от темы...
А если подправить ее слехка? Передавать по 8 байт из программы. Транспонировать и передать в цикле все 8 значений?
судя по размеру таблицы charTable она расчитана на показ символов на матрице 8х8
не представляю как она могла бы быть применима к семисегментному индикатору
ведь max7219 сделана чтобы управлять матрицей из 64 светодиодов в формате 8х8
управление несколькими семисегментными (или 8-ми с точкой) индикаторами это только частный случай
void LedControl::setDigits(int addr, char[8] value) { int offset; char[8] v,exc; if(addr<0 || addr>=maxDevices) return; for(int x=0;x<=7;x++) for(int y=0;y<=7;y++) { bitWrite(exc[x],y,bitRead(value[y],x)); } for(int i=0;i<=7;i++) v[i]=charTable[exc[i]]; offset=addr*8; \\ чо это такое? status[offset]=v; for(int i=0;i<=7;i++) spiTransfer(addr,i+1,v[i]);такая этажерка вписанная в ledcontrol имеет место быть, или я как обычно гоню?
судя по размеру таблицы charTable она расчитана на показ символов на матрице 8х8
не представляю как она могла бы быть применима к семисегментному индикатору
ведь max7219 сделана чтобы управлять матрицей из 64 светодиодов в формате 8х8
управление несколькими семисегментными (или 8-ми с точкой) индикаторами это только частный случай
да нет... глянь на содержимое чартейбла :) [0-15] = 0-F на сс.. 8й бит всегда пустой для точки (его dp меняет), 1-7 =G-А индикаторы.
первый же [1]="0" (B01111110)- погашены 1(G) и 8(DP), [11]="A" - (B01110111)-погашена D. и т.д.
советую читать первоисточник )) даташит на max7219
почитал... BCD в максе имеет меньше значений чем хотелось бы авторам либы... A,b,C.d там не предусмотрены, но есть в либе. как и прочие нереальные символы.
посмотрел что сотворил и сам не понял... В общем поправил на трезвую голову.
void LedControl::setDigits(int addr, byte values[8], byte dps) { int offset; byte v[8],exc[8]; if(addr<0 || addr>=maxDevices) return; for(int i=0;i<=7;i++) \\проставляем сегменты из табл.символов в масив v v[i]=charTable[values[i]]; for(int x=0;x<=7;x++) \\транспонируем для ОА меняем DIG и SEG (колонки/столбцы) в матрице местами в масив exc for(int y=1;y<=7;y++) \\с 1 т.к. точек пока нету bitWrite(exc[x],y,bitRead(v[y],x)); for(int i=0;i<=7;i++) \\проставляем точки из dps (дабы не плодить сущности в charTable) exc[i]=bitWrite(exc[i],0,bitRead(dps,x)); offset=addr*8; \\ чо это такое? status[offset]=v[7]; \\и где оно используется в либе так и не понял for(int i=0;i<=7;i++) \\ вываливаем все гуртом в спай spiTransfer(addr,i+1,exc[i]); }Как то у вас все сложно получается - у меня все проще было - больше боролся со спецификой схемы: писал таблицу сиволов и знакогенератор.
Как то у вас все сложно получается - у меня все проще было - больше боролся со спецификой схемы: писал таблицу сиволов и знакогенератор.
Пакость в том что если ОА воткнуть как есть, она не загорится (диоды же :) ). Выход - переверуть DIG/SEG, тогда все работает, но! "8." на 1 цифру залепит все "-", на 4ю "_" и т.д. Вообще можна чармапом описать все возможные варианты (127), но имел я этим игратся. Проще програмно перевернуть DIG/SEG перед выводом. Был еще вариант по точкам выводить поменяв Х/У местами.
Скурил пол пачки сигарет чтобы не побить монитор... Т.к. собирался поменять штатную либу, то сделал копию, а оригинал правил. В результате: нет такой процедуры... Как нету, я ее сам нарисовал и кейворд подсветило... НЕ ЗНАЮ что это было, но какого-то хрена либу не перекомпилило или точнее компилило из копии... Заработало после того как переименовал папку, файлы, ВСЕ процедуры в либах, обращения в проге и подключил ее с новым именем. Понял что происходит - когда вытер копию, переименование не помогло. Ну понятно лоханулся бы по делу, ну - сам дурак, но не так же жестко... Кто в курсе что это было?