Uart försök med 12F1840

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Uart försök med 12F1840

Inlägg 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);
                   }
                }
              }
           }
Användarvisningsbild
adent
Inlägg: 4100
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Uart försök med 12F1840

Inlägg av adent »

En klassiker :)

if(uart_rd[0]='a')

Ska vara

if(uart_rd[0]=='a')
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Uart försök med 12F1840

Inlägg 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?
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Uart försök med 12F1840

Inlägg 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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sugarman64
Inlägg: 349
Blev medlem: 24 oktober 2008, 19:40:50
Ort: Lomma

Re: Uart försök med 12F1840

Inlägg 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
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Uart försök med 12F1840

Inlägg 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.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Uart försök med 12F1840

Inlägg 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);
                   }
                }
              }
           }
Senast redigerad av newbadboy 21 november 2016, 13:43:59, redigerad totalt 1 gång.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Uart försök med 12F1840

Inlägg av Jan Almqvist »

Allt vad delay() heter bör undvikas, i synnerhet i mottagaren.
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

Re: Uart försök med 12F1840

Inlägg av Shimonu »

Jan, utveckla gärna.
Senast redigerad av Shimonu 21 november 2016, 13:51:11, redigerad totalt 1 gång.
Användarvisningsbild
adent
Inlägg: 4100
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Uart försök med 12F1840

Inlägg 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
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Uart försök med 12F1840

Inlägg 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();
}
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Uart försök med 12F1840

Inlägg av newbadboy »

Jan Almqvist skrev:Allt vad delay() heter bör undvikas, i synnerhet i mottagaren.
Har provat utan delays utan ngt skillnad.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Uart försök med 12F1840

Inlägg 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
Shimonu
Inlägg: 295
Blev medlem: 21 oktober 2015, 22:44:33

Re: Uart försök med 12F1840

Inlägg 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.
Användarvisningsbild
newbadboy
Inlägg: 2426
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Uart försök med 12F1840

Inlägg av newbadboy »

Jag är inte helt säker på vad en delimiter är. Och vad som annars borde stå där.
Skriv svar