PIC16F877A + RS232

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

PIC16F877A + RS232

Inlägg av Xelup »

Ska skapa en kommunikation mellan min pc och pic med 9600, 4Mhz.

Har kopplat upp allt men när jag sätter.

SPBRG = 25; så får ja inget interrup, men när ja kommenterar bort de så får ja vissa ASCII tecken rätt men inte alla??

Kod: Markera allt

#define PIC_CLK 4000000

#include <pic.h>
#include <sys.h>

char koll = 0;
unsigned char order = 0;

void init()
OPTION_REG = 10100100;
T0IE = 1;			                         // TMR0 genererar interrupt
PEIE = 1;			                         // Ettställ för att möjliggöra t ex serieportsinterrupt
GIE = 1;		                                 // Global Interrupt Enable

 RCSTA = 0b10010000;
 TXSTA = 0b00100100;

}

void interrupt timer(void)
{
    if(TMR0IF)
    {
       RD3 ^= 1;
       T0IF = 0;
    }      
    if(RCIF)
    {
       order = RCREG;
       TXREG = RCREG;      
       koll++;
    }
}
void main()
{
     void init();
     while(1)
     {
         Comm();
     }
}
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC16F877A + RS232

Inlägg av Icecap »

SPBRG har väl bara med baud-rate att göra, alltså är det annat du måste göra. Jag tror att du har gjort den mycket vanligt blunder: "men det är ju default så det behöver jag inte ställa..."

Har du kollat att du faktisk ställer alla bit som behövs rätt? Och nej, jag ids inte leta upp databladet när du inte ens kan kommentera din kod med vad de olika inställningar gör.
Användarvisningsbild
Glenn
Inlägg: 36693
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: PIC16F877A + RS232

Inlägg av Glenn »

jag bråkade med RS232 på just PIC16F877A i PBP förut, och det var ju ett antal grejer man behövde ställa in ja, var nån riktig luring också hmm.. typ man fick räkna ut nåt värde baserat på sin klocka ?

..Men det var ju PBP som sagt.

..Sen brukar man inte få använda internoscillatorn för RS232, fast det spelar ju ingen roll på just denna PIC'en..
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

Re: PIC16F877A + RS232

Inlägg av Xelup »

hej tack för att ni tog er tid, har fortfarande inte lyckats lösa det.. har kollat data bladet flera gånger.
när ja kommenterar bort SPBRG så fungerar hälften av ascii tekena, ibland även alla men då inte varje gång man trycker utan bara ibland.. :S

SNÄLLA KOLLA PÅ DET.

Kod: Markera allt

#define PIC_CLK 40000000
#define _XTAL_FREQ 4000000
#include<pic.h>
#include<htc.h>


//*********** Globala variabler ***********
// Även kommunikation med interrupt
// Globala variabler skrivs med stor begynnelsebokstav		
int order = 0;          //används till 
int koll = 0;

void interrupt intrpt()
{
   if(TMR0IF)
   {       
     RD3 ^= 1;                //blinka en led
     T0IF = 0;                // 0a flagga
   }  
   else if(RCIF)
   {    
      RD2 = 1;                // tänder en led
      TXREG = RCREG;         //Skickar tillbaka de vi fick
      RD2 = 0;                //släcker en led
   }           
}



void delay(int num)
{
   int y,x;
   for(x=0;x<num;x++)
   {
      for(y=0;y<1000;y++)
      {}
   }
}




void main()
{ 
//*** Init*****//
//*** Portar****//
	PORTA = 0;
	PORTB = 0;
   PORTC = 0;
   PORTD = 0;

	TRISA = 0b11111111; 		      // Alla in
	TRISB = 0b11000000;           // 6:7 = (In Circuit Programming) in (Används om processorn programmeras monterad)
	TRISC = 0b10001111;			   // 6:7 används till RS232 0->3 är in resten ut
	TRISD = 0b00000011;			   // Alla ut utom 6:7 som är in   
	//TRISE = 0b00001111;		   // Alla PORTE in, Port D konfigurerad som I/O


   T0CS = 1;                     // sätter Intern/Extern klocka
   PSA = 0;                      // om '1' så TIMER0 annars WDT
   PS2 = 1;                      //   
   PS1 = 1;                      //----Prescaler Timer0  
   PS0 = 1;                      //                     
       
   SPBRG = 25;                   //SKA VARA 25 för 9600    
   SPEN = 1;                     //Enable PORT
   CREN = 1;                     //Enable continuous recive 
   TXEN = 1;                     //Enable Transmit
   SYNC = 0;                     //Asynkron  
   BRGH = 1;                     //High band rate
  
   TXIF = 1;
   RCIE = 1; 
  
   GIE = 1;                      // Enable Interupt
   PEIE =1;
   TMR0IE = 1;                   //TMR0 Enable Interupt
   TMR0IF = 1;                   //TMR0 Flagbit

   // TXIE = 1;                     

   //RCSTA = 0b10010000;         //sätter UART
   //TXSTA = 0b00100100;         //sätter UART  
 
   
   while(1)
   {                     
      if(RD1==0)                 // ligger bara och lopar här och väntar på  interupt
      {
         RD2 = 1;
      }
      else if (RA1 == 1)
      {
         RD2 = 1;
      } 
      else
      RD2 = 0;         
   }
}
H.O
Inlägg: 5916
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: PIC16F877A + RS232

Inlägg av H.O »

Jag har ingen aning om hur dina #DEFINE direktiv funkar, jag programerar inte i C, men:

Kod: Markera allt

#define PIC_CLK 40000000
#define _XTAL_FREQ 4000000
Det är en nolla mer i den övre, ska det vara det?
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

Re: PIC16F877A + RS232

Inlägg av Xelup »

nepp stämmer ska kolla om det löste problem i såfall är du bäst :)
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

Re: PIC16F877A + RS232

Inlägg av Xelup »

nepp tyvärr gjorde ingen skilland ;(
Användarvisningsbild
lgrfbs
Inlägg: 7310
Blev medlem: 28 januari 2005, 15:48:53
Ort: X-län
Kontakt:

Re: PIC16F877A + RS232

Inlägg av lgrfbs »

Flyttade tråden från Allmänt till Mikroprocessorer.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F877A + RS232

Inlägg av sodjan »

> SNÄLLA KOLLA PÅ DET.

Att SKRIKA och komma med krav är något som definitivt inte hjälper.

> när ja kommenterar bort SPBRG...

Visa exakt vad du menar med det. Menar du att kommentera bort
raden där du gör "SPBRG = 25;" ? Det kommer *definitivt* inte att
fungera om du inte sätter SPBRG korrekt enligt din processorhastighet
och din baud-rate.


> så fungerar hälften av ascii tekena,

Visa även vad du menar med det. Exempel !
Menar du ASCII ? Och hälften av vadå ? Hälften av de tecken
som du skickar eller hälften av de olika möjliga ASCII tecknen ?

Vad har du i andra änden av kommunikationen ?

> ...mellan min pc och pic...

Menar du "mellan min PC och PIC" ?
Notera att en PIC eoch en PC inte kan kommunicera direkt
med varandra. De har olika signalnivåer på serieinterfacen.
Du behöver minst en MAX232 eller liknande också.

> #define PIC_CLK 40000000
> #define _XTAL_FREQ 4000000

Har sannolikt ingen som helst betydelse eftersom du inte använder
några biblioteksrutiner som kan använda dom, så vitt jag ser.
Som t.ex inbyggda delay() funktioner eller liknande.
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

Re: PIC16F877A + RS232

Inlägg av Xelup »

hej

var inte menat som något krav mer som en bedjan i frustration.
när ja:

Kod: Markera allt

// SPBRG = 25;
och ja från min PC med programmet putty skickar ett tecken tex "a"
så kommer de tilll en MAX232 sen vidare med TX och RX till PIC:en.
och sen vidare tillbaka.

som sagt att när SPBRG är bortkomenterat och ja skickar.
A B C D E F G H J I K L
så får ja tillbaka
A B c D h F p g b I K m

och när ja sätter

Kod: Markera allt

 SPBRG = 25; 
och skickar samma tecken så får ja inget interrupt i PIC:en.

sant att:

Kod: Markera allt

 
> #define PIC_CLK 40000000
> #define _XTAL_FREQ 4000000
inte har någon betydelse.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F877A + RS232

Inlägg av sodjan »

OK.
Då har vi lite mer att gå på... :-)

Jag glömde en sak...
Hur klockas processorn ? Kristall ?

Vad har du gjort för felsökning själv innan du frågar ?
Det är viktigt så att vi inte i onödan föreslår samma saker.

Det första jag skulle göra vore att ändra :

TXREG = RCREG;

till något i stil med :

temp = RCREG;
TXREG = 65;

D.v.s en dummy-läsning av RCREG samt att alltid svara med ett "A".
Blir det någon skillnad ? Får du nu oftast ett "A" tillbaka ?
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

Re: PIC16F877A + RS232

Inlägg av Xelup »

gott

ja använder en extern 4Mhz.

känns som ja testat de mesta. har testa en annan pic och kristall och fick samma resultat.

Har konfigurerat på olika sätt men aldrig kommit ifrån problemet. Har inte tillgång till oscilloskop.

Så här ser koden ut nu.

Kod: Markera allt

#include<pic.h>
#include<htc.h>

//*********** Globala variabler ***********
// Även kommunikation med interrupt
// Globala variabler skrivs med stor begynnelsebokstav      
int order = 0;          //används till interrupt
int koll = 0;

void interrupt intrpt()
{
   if(TMR0IF)
   {       
     RD3 ^= 1;                //blinka en led
     T0IF = 0;                // 0a flagga
   } 
   else if(RCIF)
   {   
      RD2 = 1;                // tänder en led
      order = RCREG;          //spara undan datan.
      
      TXREG = 0x44;         //Skickar tillbaka D    
      while(!TXIF);
      RD2 = 0;                //släcker en led
   }           
 
}




void main()
{
//*** Init*****//
//*** Portar****//
   PORTA = 0;
   PORTB = 0;
   PORTC = 0;
   PORTD = 0;

   TRISA = 0b11111111;             // Alla in
   TRISB = 0b11000000;           // 6:7 = (In Circuit Programming) in (Används om processorn programmeras monterad)
   TRISC = 0b10001111;            // 6:7 används till RS232 0->3 är in resten ut
   TRISD = 0b00000011;            // Alla ut utom 6:7 som är in   
   //TRISE = 0b00001111;         // Alla PORTE in, Port D konfigurerad som I/O


   T0CS = 1;                     // sätter Intern/Extern klocka
   PSA = 0;                      // om '1' så TIMER0 annars WDT
   PS2 = 0;                      //   
   PS1 = 1;                      //----Prescaler Timer0 
   PS0 = 1;                      //                     
       
   SPBRG = 25;                   //SKA VARA 25 för 9600   
   SPEN = 1;                     //Enable PORT
   CREN = 1;                     //Enable continuous recive
   TXEN = 1;                     //Enable Transmit
   SYNC = 0;                     //Asynkron 
   BRGH = 1;                     //High band rate
 
   TXIF = 1;
   RCIE = 1;
 
   GIE = 1;                      // Enable Interupt
   PEIE =1;
   TMR0IE = 1;                   //TMR0 Enable Interupt
   TMR0IF = 1;                   //TMR0 Flagbit

   // TXIE = 1;                     


   
   while(1)
   {                     
      if(RD1==0)                 // ligger bara och lopar här och väntar på  interupt
      {
         RD2 = 1;
      }
      else if (RA1 == 1)
      {
         RD2 = 1;
      }
      else
      RD2 = 0;         
   }
}
dock kvarstår samma problem.
Senast redigerad av Xelup 23 juni 2011, 17:40:38, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC16F877A + RS232

Inlägg av sodjan »

Vad betyder "samma problem" mer exakt ?
Vad skickar du in och vad får du tillbaka ?

(Varför behöver jag fråga detta gång på gång ??)
Xelup
Inlägg: 13
Blev medlem: 22 juni 2011, 11:50:21

Re: PIC16F877A + RS232

Inlägg av Xelup »

om ja har

Kod: Markera allt

SPBRG = 25;
så får ja ingenting
om ja kommenterar bort

Kod: Markera allt

//SPBRG = 25;
får ja massa konstiga tecken

ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

förslag på vad ja kan göra?
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC16F877A + RS232

Inlägg av Icecap »

Ah... du har alltså ingen koll på OM du faktisk får något ut ur UART'en, du TROR bara att du inte gör det...

Ja, på det vis kommer du aldrig vidare! Kontrollera/mät eller på annat sätt undersök om UART'en skickar något alls när du begär det! Skicka ett känt värde och se om du får ut det.

När du inser att du faktisk får ut signal får du kolla vilken baudrate det EGENTLIGEN kommer på och sedan kan du gå vidare med mottagningen i PIC'en...
Skriv svar