Sida 1 av 5

Uart försök med 12F1840

Postat: 21 november 2016, 09:34:24
av newbadboy
Försöker göra en enkel fjärr.

Har en sändar pic som skall sända ut texten "test". När mottagaren får in denna skall den helt enkel sätta en IO hög. Sändaren har den korta koden nedan och funkar. Den sänder verkligen test, har kollat med logikanalysator

Kod: Markera allt

void main(){

  TRISA=0b00000000;
  ANSELA=0b000000000;
  C1ON_bit=0;
  SRLEN_bit=0;
  UART1_Init(9600);
  delay_ms(100);


    while(1){
             UART1_Write_Text("test");
             delay_ms(100);

           }
}

Sedan kommer vi till mottagaren. Här har jag tänkt att kolla varje tecken i strängen är rätt. Uppfylls detta så skall OUT gå hög. Men som det ser ut nu så struntar den i if satsen där jag kollar första tecknet. Trots att jag för test lagt in ett a så uppfylls den och utgången går hög. Den verkar inte filtrera alls.

Kod: Markera allt

#define  OUT LATA.F2
//int i=0;
char uart_rd[5];

void main(){

  TRISA=0b00000010;
  ANSELA=0b000000000;
  C1ON_bit=0;
  SRLEN_bit=0;
  UART1_Init(9600);
  delay_ms(100);


    while(1){
             OUT=0;
             if(UART1_Data_Ready()==1){
               UART1_Read_Text(uart_rd, "test",5);

                if(uart_rd[0]='a'){
                   OUT=1;
                   delay_ms(100);
                   }
                }
              }
           }

Re: Uart försök med 12F1840

Postat: 21 november 2016, 09:52:17
av adent
En klassiker :)

if(uart_rd[0]='a')

Ska vara

if(uart_rd[0]=='a')

Re: Uart försök med 12F1840

Postat: 21 november 2016, 10:35:30
av newbadboy
nej jag vägrar :)


Ja nu svarar den inte på allt iaf.

Det är dock ngt som inte lirar. Ibland går OUT hög men oftast inte. Kan det vara ngn tajming grej?

Re: Uart försök med 12F1840

Postat: 21 november 2016, 12:19:24
av newbadboy
Såg en annan skum sak. Jag har ju ställt 9600 baud men analysatorn säger 1200 baud. Visst både TX o RX är ställda på samma, så med VARANDRA borde ju kommunitkationen funka kan jag tycka.

Re: Uart försök med 12F1840

Postat: 21 november 2016, 12:31:04
av sugarman64
Nu är jag ju inte så slängd på C, men jag undrar vad, if(uart_rd[0]='a'), gör?
Antar att den kollar om första fältet i arrayen är just 'a'.
Om detta stämmer så undrar jag hur den blir det om man skickar "test"?


//Benny

Re: Uart försök med 12F1840

Postat: 21 november 2016, 12:58:31
av lillahuset
Nej, se adents svar.

Första elementet i arrayen sätts till 'a' sedan kollas om villkoret är sant och det är det alltid eftersom 'a' inte är 0.

Re: Uart försök med 12F1840

Postat: 21 november 2016, 13:37:44
av newbadboy
Såhär är alltså koden nu och det är nu som sagt OUT inte går hög

Med koden nedan borde ju OUT gå hög varje gång ett t kommer.

Kod: Markera allt

#define  OUT LATA.F2
//int i=0;
char uart_rd[5];

void main(){

  TRISA=0b00000010;
  ANSELA=0b000000000;
  C1ON_bit=0;
  SRLEN_bit=0;
  UART1_Init(96000);
  delay_ms(100);


    while(1){
             OUT=0;
             if(UART1_Data_Ready()==1){
               UART1_Read_Text(uart_rd, "test",5);

                if(uart_rd[0]=='t'){
                   OUT=1;
                   delay_ms(100);
                   }
                }
              }
           }

Re: Uart försök med 12F1840

Postat: 21 november 2016, 13:42:40
av Jan Almqvist
Allt vad delay() heter bör undvikas, i synnerhet i mottagaren.

Re: Uart försök med 12F1840

Postat: 21 november 2016, 13:50:24
av Shimonu
Jan, utveckla gärna.

Re: Uart försök med 12F1840

Postat: 21 november 2016, 13:50:56
av adent
Jag har inte kollat vad den gör, men den här raden är klart misstänkt:

UART1_Read_Text(uart_rd, "test",5);

Vad gör den? läser 5 bytes i taget? varför står "test" med i funktionsanropet?
Där skulle jag börjat/bytt till en funktion som läser ett mottaget tecken.

MVH: Mikael

Re: Uart försök med 12F1840

Postat: 21 november 2016, 13:55:35
av newbadboy
Jag har själv inte riktigt övertygat mig exakt hur denna funktion funkar.
men här är den beskriven.

Det finns två read funktioner för MikroC


1---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UARTx_Read_Text
Prototype void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);

Returns Nothing.

Description Reads characters received via UART until the delimiter sequence is detected. The read sequence is stored in the parameter output; delimiter sequence is stored in the parameter delimiter.

This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits (if the delimiter is not found).

Parameters :

Output: received text
Delimiter: sequence of characters that identifies the end of a received string
Attempts: defines number of received characters in which Delimiter sequence is expected. If Attempts is set to 255, this routine will continuously try to detect the Delimiter sequence.


Requires UART HW module must be initialized and communication established before using this function. See UARTx_Init.

Example Read text until the sequence “OK” is received, and send back what’s been received:

UART1_Init(4800); // initialize UART1 module
Delay_ms(100);

while (1) {
if (UART1_Data_Ready() == 1) { // if data is received
UART1_Read_Text(output, "OK", 10); // reads text until 'OK' is found
UART1_Write_Text(output); // sends back text
}
}


2-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

UARTx_Read
Prototype char UARTx_Read();

Returns Returns the received byte.

Description Function receives a byte via UART. Use the function UARTx_Data_Ready to test if data is ready first.

Requires MCU with the UART module.

The UART module must be initialized before using this routine. See UARTx_Init routine.

Example // If data is ready, read it:
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
}

Re: Uart försök med 12F1840

Postat: 21 november 2016, 13:56:26
av newbadboy
Jan Almqvist skrev:Allt vad delay() heter bör undvikas, i synnerhet i mottagaren.
Har provat utan delays utan ngt skillnad.

Re: Uart försök med 12F1840

Postat: 21 november 2016, 14:05:28
av Jan Almqvist
Shimonu skrev:Jan, utveckla gärna.
TS har delay() både i sändare och mottagare. Det finns risk att mottagaren inte hinner med utan det bildas en kö med meddelande som börjar växa tills bufferten skrivs sönder. Att ta emot på serieport är mycket svårare än man tror.

"Delay()": Nej
Läsa in sträng: Nej
Läsa tecken för tecken: Ja
Hantering av timeout: Ja

Re: Uart försök med 12F1840

Postat: 21 november 2016, 14:54:27
av Shimonu
newbadboy skrev:Jag har själv inte riktigt övertygat mig exakt hur denna funktion funkar.
men här är den beskriven.

Det finns två read funktioner för MikroC


1---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UARTx_Read_Text
Prototype void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);

Returns Nothing.

Description Reads characters received via UART until the delimiter sequence is detected. The read sequence is stored in the parameter output; delimiter sequence is stored in the parameter delimiter.

This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits (if the delimiter is not found).

Parameters :

Output: received text
Delimiter: sequence of characters that identifies the end of a received string
Attempts: defines number of received characters in which Delimiter sequence is expected. If Attempts is set to 255, this routine will continuously try to detect the Delimiter sequence.


Requires UART HW module must be initialized and communication established before using this function. See UARTx_Init.

Example Read text until the sequence “OK” is received, and send back what’s been received:

UART1_Init(4800); // initialize UART1 module
Delay_ms(100);

while (1) {
if (UART1_Data_Ready() == 1) { // if data is received
UART1_Read_Text(output, "OK", 10); // reads text until 'OK' is found
UART1_Write_Text(output); // sends back text
}
}


2-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

UARTx_Read
Prototype char UARTx_Read();

Returns Returns the received byte.

Description Function receives a byte via UART. Use the function UARTx_Data_Ready to test if data is ready first.

Requires MCU with the UART module.

The UART module must be initialized before using this routine. See UARTx_Init routine.

Example // If data is ready, read it:
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
}
Utifrån det du skrev här känns det som du satt en dum delimiter.

Kommer "test" in så kastas det bort och du får tillbaka det som kom innan, förmodligen inget, en tom sträng.

Re: Uart försök med 12F1840

Postat: 21 november 2016, 15:12:53
av newbadboy
Jag är inte helt säker på vad en delimiter är. Och vad som annars borde stå där.