Где я глюканул?

Привет 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.

Reply to
Alex Kekin
Loading thread data ...

Привет всем!

Проблема снята методом полного переписывания кода... Всем ответившим спасибо!

До встречи, Alex.

Reply to
Alex Kekin

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.