Привет All!
Сабж, собственно... код ниже, прием пакета и передача его же обратно, _HО_! по RS485 со всеми вытекающими... код чего-то глючит, возвращает битый пакет...
-------------------------------- код ------------------------------------ #include <pic.h>
#include "sl.h" #include "delay.h" #include "i2c.h"
__CONFIG(WDTEN & PWRTEN & DUNPROT & BOREN & LVPDIS & UNPROTECT & HS & DEBUGDIS & WRTEN);
#define PWR_ON_PIN RA5 // RA.5 - power to DS1990A #define PWR_ON_DIR TRISA5
#define ID_DQ_PIN RA4 // RA.4 - DQ for DS1990A #define ID_DQ_DIR TRISA4
#define Z1 RA0 // Loop zone 1 #define Z2 RA1 // Loop zone 2 #define X10RX RA2 // X.10 RX input #define X10TX RA3 // X.10 TX output #define X10ZC RB0 // X.10 Zero crossing input
#define KBD PORTD // Keypad interface
#define RELAY RC0 // Relay output #define RED RC1 // Bicolor LED red #define GREEN RC2 // Bicolor LED green #define DE RC5 // Driver enable output #define CONFIG RB7 // CONFIG jumper
#define Timer1L 0x88 // TMR1L and TMR1H value #define Timer1H 0x13 // generates interrupt period 1ms (1kHz)
static unsigned char CRC; static unsigned char CRC8; static unsigned char buff[8];
static unsigned char SerialBuffer[32]; static unsigned char SerialIndex; static unsigned char SerialLen;
static unsigned char ByteCnt; static unsigned char index; static unsigned char ADDRESS = 0x1F; // ModBus-X.10 Address (RB2-RB6) <00xxxxxx>
static unsigned char Year = 0; static unsigned char Month = 1; static unsigned char Day = 1; static unsigned char Hour = 0; static unsigned char Min = 0; static unsigned char Sec = 0; static unsigned char m100sec = 100; static unsigned char m10sec = 10; static unsigned char delaycnt = 0; static unsigned char RX_TMR = 0; static unsigned char TX_TMR = 0;
static unsigned char DAT[8]; static unsigned char DataLen; static unsigned char ACK; static unsigned char SAB; static unsigned char COMMAND; static unsigned char CmdLen;
static bit CMD; static bit PING; static bit CMDPresent; static bit DataPresent;
static bit ConfigMode; static bit KeyPresent = 0; static bit EndRead; static bit PassOK; static bit PassPresent = 0; static bit TX_Flag = 0; static bit RX_Flag = 0; static bit RX_Complete = 0;
static bit flash = 0;
const char mnt[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const char CRCTable[] = { 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
void main(void) { /* setup stuff */
//****************** Setup comparators module ************************
CMCON = 0x07; CVRCON = 0x00;
//****************** Set port direction ****************************** PORTA = 0; // Initialize PORTA by setting output data latches PORTB = 0; // Initialize PORTB by setting output data latches PORTC = 0; // Initialize PORTB by setting output data latches PORTD = 0; // Initialize PORTB by setting output data latches PORTE = 0; // Initialize PORTB by setting output data latches TRISA = 0x17; // Value used to initialize data direction // Set RA<00010111> (0-output, 1-input) TRISB = 0xFF; // Value used to initialize data direction // Set RB<11111111> (0-output, 1-input) TRISC = 0xD8; // Value used to initialize data direction // Set RC<11011000> (0-output, 1-input) TRISD = 0xF0; // Value used to initialize data direction // Set RD<11110000> (0-output, 1-input) TRISE = 0x07; // Value used to initialize data direction // Set RE<00000111> (0-output, 1-input) //****************** Setup timer modules ***************************** TMR1L = Timer1L; // Load TMR1L and TMR1H value TMR1H = Timer1H;
T1CON = 0x01; // Set T1CON reg B<00000001> Timer1 input internal, on T2CON = 0x00; // Timer2 off CCP1CON = 0x00; // CCP1 off CCP2CON = 0x00; // CCP2 off
//****************** Setup SSP module (I2C) ************************** SSPCON = 0x00; // <00000000>
SSPCON2 = 0x00; // <00000000>
SSPSTAT = 0x00; // <00000000>
SSPADD = 0x00; // 49dec - 100kHz //****************** Setup ADC module ******************************** ADCON0 = 0xC0; // <11000000>
ADCON1 = 0x06; // <00000110>
//****************** Setup UART module ******************************* TXSTA = 0x24; // <00100100>
RCSTA = 0x90; // <10010000>
SPBRG = 0x81; // 129 (9600N1) //****************** Setup interrupt ********************************* OPTION = 0x08; // Set OPTION reg B<00001000> prescaler 1:1 to WDT PIE1 = 0x31; // Set PIE1 reg B<00110001> Timer1 overflow interrupt enable PIE2 = 0x00; // Set PIE2 reg B<00000000> All off INTCON = 0xD0; // Set INTCON reg B<11010000> GIE and PEIE enable
//****************** End setup peripheral modules ********************
while(1) { CLRWDT(); // Idly kick the dog if(RX_Complete == 1) { SerialLen = SerialIndex; RX_Complete = 0; SerialIndex = 0; RED = 0; TX_Flag = 1; TXREG = SerialBuffer[0]; DE = 1; TXEN = 1; } } } static void interrupt isr(void) {
if(TMR1IF) { TMR1L = Timer1L; // Load TMR1L and TMR1H value TMR1H = Timer1H; if(RX_TMR > 0) { --RX_TMR; } else { if(RX_Flag) { RX_Complete = 1; RX_Flag = 0; } }
if(TX_TMR > 0) { --TX_TMR; } else { TXEN = 0; DE = 0; GREEN = 0; }
if(--m10sec == 0) { m10sec = 10;
if(flash == 1) { flash = 0; RELAY = 0; } else { flash = 1; RELAY = 1; }
if(--m100sec == 0) { m100sec = 100; Timer(); if(delaycnt > 0) { --delaycnt; } } }
TMR1IF = 0; // Clear interrupt flag, ready for next }
if(TXIF) { GREEN = 1; if(SerialIndex == SerialLen) { SerialIndex = 0; SerialLen = 0; TX_Flag = 0; TX_TMR = 20; } else { TXREG = SerialBuffer[SerialIndex]; ++SerialIndex; } TXIF = 0; }
if(RCIF) { RED = 1; RX_TMR = 20; if(RX_Flag) { SerialBuffer[SerialIndex] = RCREG; ++SerialIndex; if(SerialIndex >= 33) { RX_TMR = 0; RX_Flag = 0; RX_Complete = 1; } } else { if(RX_Complete == 1) { RX_Complete = 0; } RX_Flag = 1; SerialIndex=1; SerialBuffer[0] = RCREG; } RCIF = 0; }
if(INTF) { INTF = 0; } CLRWDT(); // Clear watchdog timer }
---------------------------- конец кода ---------------------------------
До встречи, Alex.