Sida 1 av 3

PIC16F877A + RS232

Postat: 22 juni 2011, 12:20:57
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();
     }
}

Re: PIC16F877A + RS232

Postat: 22 juni 2011, 12:36:39
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.

Re: PIC16F877A + RS232

Postat: 22 juni 2011, 12:41:25
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..

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 15:05:05
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;         
   }
}

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 15:15:36
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?

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 15:21:17
av Xelup
nepp stämmer ska kolla om det löste problem i såfall är du bäst :)

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 15:24:21
av Xelup
nepp tyvärr gjorde ingen skilland ;(

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 16:04:40
av lgrfbs
Flyttade tråden från Allmänt till Mikroprocessorer.

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 16:29:14
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.

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 17:12:47
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.

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 17:23:26
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 ?

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 17:35:33
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.

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 17:38:06
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 ??)

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 17:55:32
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?

Re: PIC16F877A + RS232

Postat: 23 juni 2011, 18:04:58
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...