• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przerobienie programu
#1
Jak przerobić te dwa programy na jedno? może ktoś pomoże podpowie robiac samemu wyszło że zatrzymuje sie na nadawaniu a wyświetlacz cisza?  czyli sumować by nadając dane były też widzialne na wyświetlaczu dodatkowym ic2. 

Kod:
/*
  uncoment if you are using VW
*/

#define NAV

//data pin 4
//clk  pin 3
//ena  pin 2

//WRITE TO CLUSTER
#define FIS_WRITE_ENA 2
#define FIS_WRITE_ENAINT 0
#define FIS_WRITE_CLK 3
#define FIS_WRITE_DATA 4
#define FIS_WRITE_PULSEW 50
#define FIS_WRITE_STARTPULSEW 100
#define FIS_WRITE_START 0xF0 //something like address, first byte is always 15
//END WRITE TO CLUSTER

//#define BINCODE 000011111011111010101010101110111011011010111100101100111010101010111101101011001011001110110000101010011011111010110100101101101011111010010011
//                000011111011111010101010101110111011011010111100101100111010101010111101101011001011001110110000101010011011111010110100101101101011111010010011

//int BINCODE[144]={
//0,0,0,0,1,1,1,1,
//1,0,1,1,1,1,1,0,
//1,0,1,0,1,0,1,0,
//1,0,1,1,1,0,1,1,
//1,0,1,1,0,1,1,0,
//1,0,1,1,1,1,0,0,
//1,0,1,1,0,0,1,1,
//1,0,1,0,1,0,1,0,
//1,0,1,1,1,1,0,1,
//1,0,1,0,1,1,0,0,
//1,0,1,1,0,0,1,1,
//1,0,1,1,0,0,0,0,
//1,0,1,0,1,0,0,1,
//1,0,1,1,1,1,1,0,
//1,0,1,1,0,1,0,0,
//1,0,1,1,0,1,1,0,
//1,0,1,1,1,1,1,0,
//1,0,0,1,0,0,1,1};

//WRITE TO CLUSTER
String FIS_WRITE_line1 = "FIS PROTOCOL EMULATOR BY KOVO"; //upper line 8characters are static, more then 8 will rotate
String FIS_WRITE_line2 = "HTTP://KOVO-BLOG.BLOGSPOT.SK"; //lover line 8characters are static, more then 8 will rotate
String FIS_WRITE_sendline1 = "        ";
String FIS_WRITE_sendline2 = "        ";
long FIS_WRITE_rotary_position_line1 = -8;
long FIS_WRITE_rotary_position_line2 = -8;
char FIS_WRITE_CHAR_FROM_SERIAL;
int FIS_WRITE_line = 1;
long FIS_WRITE_last_refresh = 0;
int FIS_WRITE_nl = 0;
volatile uint8_t FIS_WRITE_ACKSTATE = 0;
//END WRITE TO CLUSTER

//WRITE TO CLUSTER
void FIS_WRITE_sendTEXT(String FIS_WRITE_line1, String FIS_WRITE_line2);
void FIS_WRITE_sendByte(int Bit);
void FIS_WRITE_startENA();
void FIS_WRITE_stopENA();
void FIS_WRITE_ACK();
//END WRITE TO CLUSTER

void setup() {
 //WRITE TO CLUSTER
 pinMode(FIS_WRITE_ENA, OUTPUT);
 digitalWrite(FIS_WRITE_ENA, LOW);
 pinMode(FIS_WRITE_ENA, INPUT);
 digitalWrite(FIS_WRITE_ENA, LOW); //disable pullup https://www.arduino.cc/en/Reference/DigitalWrite
 attachInterrupt(FIS_WRITE_ENAINT, FIS_WRITE_ACK, FALLING);
 pinMode(FIS_WRITE_CLK, OUTPUT);
 digitalWrite(FIS_WRITE_CLK, HIGH);
 pinMode(FIS_WRITE_DATA, OUTPUT);
 digitalWrite(FIS_WRITE_DATA, HIGH);
 Serial.begin(9600);
 //END WRITE TO CLUSTER
}

void loop() {
 //WRITE TO CLUSTER
 if (Serial.available()) {
   FIS_WRITE_CHAR_FROM_SERIAL = (char)Serial.read();
   Serial.print(FIS_WRITE_CHAR_FROM_SERIAL);
   if (FIS_WRITE_CHAR_FROM_SERIAL == '\n') {
     FIS_WRITE_nl = 1;
     if (FIS_WRITE_line == 1) {
       FIS_WRITE_line = 2;
     } else {
       FIS_WRITE_line = 1;
     }
   } else {
     if (FIS_WRITE_line == 1) {
       if (FIS_WRITE_nl) {
         FIS_WRITE_nl = 0;
         FIS_WRITE_line1 = "";
         FIS_WRITE_rotary_position_line1 = -8;
       }
       FIS_WRITE_line1 += FIS_WRITE_CHAR_FROM_SERIAL;
     } else {
       if (FIS_WRITE_nl) {
         FIS_WRITE_nl = 0;
         FIS_WRITE_line2 = "";
         FIS_WRITE_rotary_position_line2 = -8;
       }
       FIS_WRITE_line2 += FIS_WRITE_CHAR_FROM_SERIAL;
     }
   }

 }

 int FIS_WRITE_line1_length = FIS_WRITE_line1.length();
 int FIS_WRITE_line2_length = FIS_WRITE_line2.length();




 //do rotary and refresh each 0.5second
 //refresh cluster each 5s
 if ((millis() - FIS_WRITE_last_refresh) > 500 && (FIS_WRITE_line1_length > 0 || FIS_WRITE_line2_length > 0)) {
   if (FIS_WRITE_line1_length > 8) {
     FIS_WRITE_sendline1 = "        ";
     for (int i = 0; i < 8; i++) {
       if (FIS_WRITE_rotary_position_line1 + i >= 0 && (FIS_WRITE_rotary_position_line1 + i) < FIS_WRITE_line1_length) {
         FIS_WRITE_sendline1[i] = FIS_WRITE_line1[FIS_WRITE_rotary_position_line1 + i];
       }
     }
     if (FIS_WRITE_rotary_position_line1 < FIS_WRITE_line1_length) {
       FIS_WRITE_rotary_position_line1++;
     } else {
       FIS_WRITE_rotary_position_line1 = -8;
       FIS_WRITE_sendline1 = "        ";
     }
   } else {
     FIS_WRITE_sendline1 = FIS_WRITE_line1;
   }
   if (FIS_WRITE_line2_length > 8) {
     FIS_WRITE_sendline2 = "        ";
     for (int i = 0; i < 8; i++) {
       if (FIS_WRITE_rotary_position_line2 + i >= 0 && (FIS_WRITE_rotary_position_line2 + i) < FIS_WRITE_line2_length) {
         FIS_WRITE_sendline2[i] = FIS_WRITE_line2[FIS_WRITE_rotary_position_line2 + i];
       }
     }
     if (FIS_WRITE_rotary_position_line2 < FIS_WRITE_line2_length) {
       FIS_WRITE_rotary_position_line2++;
     } else {

       FIS_WRITE_rotary_position_line2 = -8;
     }
   } else {
     FIS_WRITE_sendline2 = FIS_WRITE_line2;
   }
   // Serial.println("refresh");
   //FIS_WRITE_sendTEXT(FIS_WRITE_sendline1,FIS_WRITE_sendline2);
   FIS_WRITE_last_refresh = millis();
   //end refresh
 }
 if (FIS_WRITE_ACKSTATE) {
   FIS_WRITE_ACKSTATE = 0;
   FIS_WRITE_sendTEXT(FIS_WRITE_sendline1, FIS_WRITE_sendline2);
 }
 //END WRITE TO CLUSTER
}

//WRITE TO CLUSTER

void FIS_WRITE_ACK() {
 detachInterrupt(FIS_WRITE_ENAINT);
 FIS_WRITE_ACKSTATE = 1;
};

void FIS_WRITE_sendTEXT(String FIS_WRITE_line1, String FIS_WRITE_line2) {

 Serial.println(FIS_WRITE_line1);
 Serial.println(FIS_WRITE_line2);
 int FIS_WRITE_line1_length = FIS_WRITE_line1.length();
 int FIS_WRITE_line2_length = FIS_WRITE_line2.length();
 if (FIS_WRITE_line1_length <= 8) {
   for (int i = 0; i < (8 - FIS_WRITE_line1_length); i++) {
     FIS_WRITE_line1 += " ";
   }
 }
 if (FIS_WRITE_line2_length <= 8) {
   for (int i = 0; i < (8 - FIS_WRITE_line2_length); i++) {
     FIS_WRITE_line2 += " ";
   }
 }
#ifdef NAVI
 uint8_t FIS_WRITE_CRC = 0x81;
#else
 uint8_t FIS_WRITE_CRC = (0xFF ^ FIS_WRITE_START);
#endif

 FIS_WRITE_startENA();
#ifdef NAVI
 FIS_WRITE_sendByte(0x81);
 FIS_WRITE_sendByte(0x12);
 FIS_WRITE_CRC ^= 0x12;
 FIS_WRITE_sendByte(0xF0);
 FIS_WRITE_CRC ^= 0xF0;
#else
 FIS_WRITE_sendByte(0xFF ^ FIS_WRITE_START);
#endif

 for (int i = 0; i <= 7; i++)
 {
   if (FIS_WRITE_line1[i] > 96) FIS_WRITE_line1[i] = FIS_WRITE_line1[i] - 32;
#ifdef NAVI
   FIS_WRITE_sendByte(FIS_WRITE_line1[i]);
   FIS_WRITE_CRC ^= FIS_WRITE_line1[i];
#else
   FIS_WRITE_sendByte(0xFF ^ FIS_WRITE_line1[i]);
   FIS_WRITE_CRC += FIS_WRITE_line1[i];
#endif

 }
 for (int i = 0; i <= 7; i++)
 {
   if (FIS_WRITE_line2[i] > 96) FIS_WRITE_line2[i] = FIS_WRITE_line2[i] - 32;
#ifdef NAVI
   FIS_WRITE_sendByte(FIS_WRITE_line2[i]);
   FIS_WRITE_CRC ^= FIS_WRITE_line2[i];
#else
   FIS_WRITE_sendByte(0xFF ^ FIS_WRITE_line2[i]);
   FIS_WRITE_CRC += FIS_WRITE_line2[i];
#endif

 }
#ifdef NAVI
 FIS_WRITE_sendByte(FIS_WRITE_CRC-1  );
#else
 FIS_WRITE_sendByte(FIS_WRITE_CRC % 0x100);
#endif
 FIS_WRITE_stopENA();

}

void FIS_WRITE_sendByte(int Byte) {
 static int iResult[8];
 for (int i = 0; i <= 7; i++)
 {
   iResult[i] = Byte % 2;
   Byte = Byte / 2;
 }
 for (int i = 7; i >= 0; i--) {
   switch (iResult[i]) {
     case 1: digitalWrite(FIS_WRITE_DATA, HIGH);
       break;
     case 0: digitalWrite(FIS_WRITE_DATA, LOW);
       break;
   }
   digitalWrite(FIS_WRITE_CLK, LOW);
   delayMicroseconds(FIS_WRITE_PULSEW);
   digitalWrite(FIS_WRITE_CLK, HIGH);
   delayMicroseconds(FIS_WRITE_PULSEW);
 }
}

void FIS_WRITE_startENA() {
 pinMode(FIS_WRITE_ENA, INPUT);
 digitalWrite(FIS_WRITE_ENA, LOW); //disable pullup
 while (!digitalRead(FIS_WRITE_ENA)) {
   pinMode(FIS_WRITE_ENA, OUTPUT);
   digitalWrite(FIS_WRITE_ENA, HIGH);
   delayMicroseconds(FIS_WRITE_STARTPULSEW);
   digitalWrite(FIS_WRITE_ENA, LOW);
   delayMicroseconds(FIS_WRITE_STARTPULSEW);
   digitalWrite(FIS_WRITE_ENA, HIGH);
 }
}

void FIS_WRITE_stopENA() {
 digitalWrite(FIS_WRITE_ENA, LOW);
 pinMode(FIS_WRITE_ENA, INPUT);
 digitalWrite(FIS_WRITE_ENA, LOW); //disable pullup
 attachInterrupt(FIS_WRITE_ENAINT, FIS_WRITE_ACK, FALLING);
}
//END WRITE TO CLUSTER



Kod:
// do not forget to put pull down resistor on enable line
// pull up on data/clk line is made usng internal pullup


#define FIS_READ_intCLK 1 //interupt on FIS_READ_CLK line
#define FIS_READ_CLK 3 //clk pin 3 - int1
#define FIS_READ_DATA 11 //data pin 11
#define FIS_READ_ENA 2 //enable pin 2 int0
#define FIS_READ_intENA 0 //interupt on FIS_READ_ENA line

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

volatile uint8_t FIS_READ_adr=0;
volatile uint64_t FIS_READ_msg1=0;
volatile uint64_t FIS_READ_msg2=0;
volatile uint8_t FIS_READ_cksum=0;
volatile uint8_t FIS_READ_msgbit=0;
volatile uint8_t FIS_READ_newmsg1=0;
volatile uint8_t FIS_READ_newmsg2=0;
volatile uint8_t FIS_READ_adrok=0;
volatile uint8_t FIS_READ_cksumok=0;
volatile uint8_t FIS_READ_tmp_cksum=0;
volatile uint8_t FIS_READ_lcd_ack=1; //tell everyone on bus, we are here!

volatile uint64_t prev_update = 0;

void FIS_READ_read_data_line(){ //fired on falling edge
   if(!FIS_READ_adrok){
     FIS_READ_read_adr();
   }
   else if (!FIS_READ_newmsg1){
     FIS_READ_read_msg1();
   }
   else if (!FIS_READ_newmsg2){
     FIS_READ_read_msg2();
   }
   else if (!FIS_READ_cksumok){
     FIS_READ_read_cksum();
   }
}

void FIS_READ_read_cksum(){
 if(digitalRead(FIS_READ_DATA)){
   FIS_READ_cksum = (FIS_READ_cksum<<1) | 0x00000001;
   FIS_READ_msgbit++;
 }
 else
 {
   FIS_READ_cksum = (FIS_READ_cksum<<1);
   FIS_READ_msgbit++;
 }
 if (FIS_READ_msgbit==8)
 {
   FIS_READ_newmsg1=0;
   FIS_READ_newmsg2=0;
   FIS_READ_adrok=0;
   FIS_READ_tmp_cksum=(0xFF^FIS_READ_adr);
   for (int i=56;i>=0;i=i-8){
     FIS_READ_tmp_cksum=FIS_READ_tmp_cksum+(0xFF^((FIS_READ_msg1>>i) & 0xFF))
       +(0xFF^((FIS_READ_msg2>>i) & 0xFF));
   }
   if (!FIS_READ_cksumok){//d we display what we reveived last time?
   if((FIS_READ_tmp_cksum%256)==FIS_READ_cksum){
   FIS_READ_cksumok=1;
   } else {
     FIS_READ_msg1 = 0x00000000;
     FIS_READ_msg2 = 0x00000000;
     FIS_READ_cksumok=0;
   }
   FIS_READ_msgbit=0;
   }
 }

}

void FIS_READ_read_msg1(){
 if(digitalRead(FIS_READ_DATA)){
   FIS_READ_msg1 = (FIS_READ_msg1<<1) | 0x00000001;
   FIS_READ_msgbit++;
 }
 else
 {
   FIS_READ_msg1 = (FIS_READ_msg1<<1);
   FIS_READ_msgbit++;
 }
 if (FIS_READ_msgbit==64)
 {
   FIS_READ_newmsg1=1;
   FIS_READ_msgbit=0;
 }
}

void FIS_READ_read_msg2(){
 if(digitalRead(FIS_READ_DATA)){
   FIS_READ_msg2 = (FIS_READ_msg2<<1) | 0x00000001;
   FIS_READ_msgbit++;
 }
 else
 {
   FIS_READ_msg2 = (FIS_READ_msg2<<1);
   FIS_READ_msgbit++;
 }
 if (FIS_READ_msgbit==64)
 {
   FIS_READ_newmsg2=1;
   FIS_READ_msgbit=0;
 }
}

void FIS_READ_read_adr(){
 if(digitalRead(FIS_READ_DATA)){
   FIS_READ_adr = (FIS_READ_adr<<1) | 0x00000001;
   FIS_READ_msgbit++;
 }
 else
 {
   FIS_READ_adr = (FIS_READ_adr<<1);
   FIS_READ_msgbit++;
 }
 if (FIS_READ_msgbit==8)
 {
   FIS_READ_adrok=1;
   FIS_READ_msgbit=0;
 }
}



void FIS_READ_detect_ena_line_rising(){
   //init all again
   FIS_READ_msgbit=0;
   FIS_READ_newmsg1=0;
   FIS_READ_newmsg2=0;
   FIS_READ_adrok=0;
   FIS_READ_cksumok=0;
   FIS_READ_tmp_cksum=0;
   attachInterrupt(FIS_READ_intCLK,FIS_READ_read_data_line,FALLING);//data are valid on falling edge of CLK
   attachInterrupt(FIS_READ_intENA,FIS_READ_detect_ena_line_falling,FALLING); //if enable changed to low, data on data line are no more valid
}

void FIS_READ_detect_ena_line_falling(){
 detachInterrupt(FIS_READ_intCLK);//enable is low, data on data line are no more valid
 detachInterrupt(FIS_READ_intENA);
 attachInterrupt(FIS_READ_intENA,FIS_READ_detect_ena_line_rising,RISING);
}

void setup() {
 lcd.begin(16,2);
 lcd.home();
 lcd.print("FIS cluster");
 lcd.setCursor(0,1);
 lcd.print("reader");
 delay (2000);
 lcd.clear();
 Serial.begin(9600);
 pinMode(FIS_READ_CLK,INPUT_PULLUP);
 pinMode(FIS_READ_DATA,INPUT_PULLUP);
 pinMode(FIS_READ_ENA,INPUT);//no pull up! this is inactive state low, active is high
 digitalWrite(FIS_READ_ENA,LOW);//disable pullup
 attachInterrupt(FIS_READ_intENA,FIS_READ_detect_ena_line_rising,RISING);
}

void loop() {
 if(FIS_READ_cksumok){ //whole packet received and checksum is ok    
   lcd.home();
   Serial.write("\n");
  // lcd.clear();
   for(int i=56;i>=0;i=i-8){
     int c = (0xFF^((FIS_READ_msg1>>i) & 0xFF));
     if (c == 102 ) c=95;
     lcd.write(c);
     Serial.write(c);
   }
   lcd.setCursor(0,1);
   Serial.write("\n");
   for(int i=56;i>=0;i=i-8){
     int c = (0xFF^((FIS_READ_msg2>>i) & 0xFF));
     if (c == 102 ) c=95;
     lcd.write(c);
     Serial.write(c);  
   }
   FIS_READ_cksumok=0;
   prev_update=millis();
   FIS_READ_lcd_ack=1;
 } else {
   if ((millis() - prev_update) > 500 ){ //leave text for 1000ms
     lcd.clear();
     FIS_READ_lcd_ack=1;
     prev_update=millis();
   }
 }
 if (FIS_READ_lcd_ack){
   detachInterrupt(FIS_READ_intENA);
   detachInterrupt(FIS_READ_intCLK);
   pinMode(FIS_READ_ENA,INPUT);
   digitalWrite(FIS_READ_ENA,LOW);//disable pullup
   if (!digitalRead(FIS_READ_ENA)){
       pinMode(FIS_READ_ENA,OUTPUT);
       delay(1);
       digitalWrite(FIS_READ_ENA,HIGH);
       delay(3);
       digitalWrite(FIS_READ_ENA,LOW);
       FIS_READ_lcd_ack=0;
   }
 pinMode(FIS_READ_ENA,INPUT);
 digitalWrite(FIS_READ_ENA,LOW);//disable pullup
 //delay(50);
 attachInterrupt(FIS_READ_intENA,FIS_READ_detect_ena_line_rising,RISING);
 }
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Wiadomości w tym wątku
Przerobienie programu - przez Jarewa0606 - 01-06-2018, 11:20
RE: Przerobienie programu - przez Robson Kerman - 01-06-2018, 23:34
RE: Przerobienie programu - przez Jarewa0606 - 02-06-2018, 07:23
RE: Przerobienie programu - przez es2 - 02-06-2018, 17:38
RE: Przerobienie programu - przez es2 - 02-06-2018, 17:43
RE: Przerobienie programu - przez Jarewa0606 - 02-06-2018, 21:04
RE: Przerobienie programu - przez es2 - 02-06-2018, 21:59

Skocz do:


Przeglądający: 1 gości