[PIC] Problems with "if" statements - 16F690 UART on Hi Tech C

Status
Not open for further replies.

TheTeacher

Newbie level 1
Joined
Nov 6, 2014
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
20
Hi guys

I'm trying to send 2 different bytes (one at a time) from the slave to the master; different actions must be taken by the slave depending on which byte is received. I wrote some code to confirm that the master is sending the different bytes and it is indeed. I also confirmed that the slave is receiving the different bytes. The problem arises when I modify the code to include the "if statements" to check which byte was received and take appropriate action; this part of the code just doesn't work. I have LED's on RA0 and RA1 to check the results.

Please help!


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<htc.h>
 
#define _XTAL_FREQ 4000000
 
 
char UART_Init(const long int baudrate);
char UART_TX_Empty();
char UART_Data_Ready();
char UART_Read();
void UART_Read_Text(char *Output, unsigned int length);
void UART_Write(char data);
void UART_Write_Text(char *text);
 
void main()
{
    int d;
 
    PORTA = 0x00;
    TRISA = 0x00;               // Set PORTA as output
   
//  Set all pins as digital
    ANSEL = 0x00;
    ANSELH = 0x00;
 
//  Disable comparators
    CM1CON0 = 0x00;
    CM2CON0 = 0x00;
    CM2CON1 = 0x00;
    
   UART_Init(9600);
 
   do
   {
        if(UART_Data_Ready())       
            {d = UART_Read();}
            
        if (d == 0xAA)
            {RA0 = 1;}
        else
            if (d == 0xFF)
                {RA0 = 0;}
 
 
     __delay_ms(50);
 
   }while(1);
}
 
 
 
 
/**********         UART.h    **************/
 
 
char UART_Init(const long int baudrate)
{
    ANSEL = 0x00;
    unsigned int x;
    x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
    if(x>255)
    {
        x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
        BRGH = 1;
    }
    if(x<256)
    {
      SPBRG = x;
      SYNC = 0;
      SPEN = 1;
      TRISB7 = 1;
      TRISB5 = 1;
      CREN = 1;
      TXEN = 1;
      return 1;
    }
    return 0;
}
 
char UART_TX_Empty()
{
  return TRMT;
}
 
char UART_Data_Ready()
{
   return RCIF;
}
char UART_Read()
{
 
  while(!RCIF);
  return RCREG;
}
 
void UART_Read_Text(char *Output, unsigned int length)
{
    int i;
    for(int i=0;i<length;i++)
        Output[i] = UART_Read();
}
 
void UART_Write(char data)
{
  while(!TRMT);
  TXREG = data;
}
 
void UART_Write_Text(char *text)
{
  int i;
  for(i=0;text[i]!='\0';i++)
      UART_Write(text[i]);
}

 
Last edited by a moderator:

d is an int so in the statement
Code:
            {d = UART_Read();}
if UART_Read() returns a signed char values such as 0xFF will be sign extended to 0xFFFFand the if() statements fail

try defining d as a char

also in
Code:
        if (d == 0xAA)
            {RA0 = 1;}
        else
            if (d == 0xFF)
                {RA0 = 0;}
what happens if the value read is neither 0xAA or 0xFF ? no change in RA0?
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…