UART 2x 16F690 nejede

Ahoj,
zkouším UART, ale nějak mi to nechce dělat to to chci. Z první picky jde UART signál, tak jak chci, ale s druhou je nějáký problém, chci vypsat přenášený byte na ledky, ale tam je chaos a svítí mi tam nějáké blbosti. Můžete se prosím na to někdo mrknout. Děkuju

Takto to vysílám

[code]
#include <htc.h>
#include “uart.h”
#include <stdio.h>
#define _XTAL_FREQ 8000000

void main()
{
UART_Init(2400);

while(1)
{
	UART_Write(0b00001111);
	__delay_ms(300);
	UART_Write(0b11110000);
	__delay_ms(300);
}

}[/code]

a todle by mělo přijímat

#include <htc.h>
#include "uart.h"
#include <stdio.h> 
#define _XTAL_FREQ 8000000

void main()
{
	TRISC = 0x00;
	int stav;

	UART_Init(2400);

	while(1)
	{
		if(UART_Data_Ready())       
		{
			stav = UART_Read();
		}
		PORTC = stav;
   }
}[/code]

Knihovnu jsem našel
[code]#include<htc.h>
#define _XTAL_FREQ 8000000 
#include "uart.h"
#include <stdio.h> 

char UART_Init(const long int baudrate)
{
  unsigned int x;
  x = (_XTAL_FREQ - baudrate*64)/(baudrate*64); //SPBRG for Low Baud Rate
  if(x>255) //If High Baud Rate required
  {
    x = (_XTAL_FREQ - baudrate*16)/(baudrate*16); //SPBRG for High Baud Rate
    BRGH = 1; //Setting High Baud Rate
  }
  if(x<256)
  {
    SPBRG = x; //Writing SPBRG register
    SYNC = 0; //Selecting Asynchronous Mode
    SPEN = 1; //Enables Serial Port
    TRISC7 = 1;  
    TRISC6 = 1; 
    CREN = 1; //Enables Continuous Reception
    TXEN = 1; //Enables Transmissio
    return 1;
  }
  return 0;
}
char UART_Read()
{
  while(!RCIF); //Waits for Reception to complete
  return RCREG; //Returns the 8 bit data
}
void UART_Write(char data)
{
	while(!TRMT); //Waiting for Previous Data to Transmit completly
	TXREG = data; //Writing data to Transmit Register, Starts transmission
}

char UART_TX_Empty()
{
	return TRMT; //Returns Transmit Shift Status bit
}

char UART_Data_Ready()
{
	return RCIF;
}

Tak jsem předělal program, jenom abych viděl, jestli to příjme a asi ani nepříjme, protože jede jenom else

[code]void main()
{
TRISC = 0b00000000;
UART_Init(2400);

while(1)
{

	if(UART_Data_Ready())       
	{
		PORTC =0b11111111;
		__delay_ms(300);
		PORTC =0b00000000;
		__delay_ms(300);
	}
	else
	{
		PORTC =0b11000011;
		__delay_ms(300);
		PORTC =0b00111100;
		__delay_ms(300);
	}

}
}[/code]

Tak asi je problém v inicializaci, ptorože jsem ju přebral z 16F877 a některý bity nemůžu ani najít v datasheetu.

tak jsem ji zkusil udělat podle 16F690 datasheetu a nějáký stránky na netu, a první picka vysílá, ale druhá ne a ne příjímat :frowning: Mohl byste se na to prsím někdo podívat, co mi tam chybí?

[code]#include<htc.h>
#define _XTAL_FREQ 8000000
#include “uart.h”
#include <stdio.h>

char UART_Init(const long int baudrate)
{
unsigned int x;
x = (_XTAL_FREQ / baudrate)/(64) - 1;
//TRANSMIT STATUS AND CONTROL REGISTER
// CSRC
TX9 = 0;
TXEN = 1;
SYNC = 0;
SENB = 0;
BRGH = 0;
// TRMT ???
// TX9D 9. bit

//RECEIVE STATUS AND CONTROL REGISTER
SPEN = 1;
RX9 = 0;
// SREN
CREN = 1; ???
ADDEN = 0;
FERR = 0;
OERR = 0;
// RX9D 9. bit

SPBRG = x;

return 0;
}
char UART_Read()
{
while(!RCIF); //Waits for Reception to complete
return RCREG; //Returns the 8 bit data
}
void UART_Write(char data)
{
while(!TRMT); //Waiting for Previous Data to Transmit completly
TXREG = data; //Writing data to Transmit Register, Starts transmission
}

char UART_TX_Empty()
{
return TRMT; //Returns Transmit Shift Status bit
}

char UART_Data_Ready()
{
return RCIF;
}

[/code]

Tohle mi to funguje v simulaci:
EUSART 2xPIC16F690.zip (78.5 KB)

Děkuju. Nakonec mi to taky jde, udělal jsem novou knihovnu a vynuloval ANSEL a šlape to. Jen mám problém, že mi to nepřenáší bit s nejnižší hodnotou. Je možný, že by to bylo tím, že používám vnitřní oscilátor?

Tak problém vyřešen, byl to kontakt v nepájivým poli. Jsem už asi zdegenerovanej, když hledám složitou chybu a přitom je to taková prktina.