Seri port ve SPI aynı anda çalışmıyor

Başlatan powerelectronic, 12 Nisan 2014, 04:38:12

powerelectronic

877A da seri port ve spiyı aynı anda sorunsuz çalıştıramıyorum. Seri port olmadan spi ile chipler ile haberleşmemde sıkıntı yok ama seriporttan aldığım datayı spi üzerinden basmaya kalkınca saçma saçma bilgileri gönderiyor master olan chip, hatta arada kendi kafasına göre bilgi bile gönderiyor :) Bu sorun neyden kaynaklıdır?
Değişik bir şey yok, spi bağlantıları yapılı ve standart bir rs232 devresi. Fxdev hocanın kitabındaki gibi ama spi kütüphanesinde read bölümünü değiştirdim.
spi.c
#include "spi.h"
#include <pic16f877a.h>


void spi_init(void)
{
    if(tip==0)
    {
        SSPSTAT=0b10000000;
        SSPCON=0b00100010;
    }
    else
    {
        SSPSTAT=0b00000000;
        SSPCON=0b00100100;
    }
   
}

void spi_write(unsigned char veri)
{
	
	SSPBUF=veri;	//BF=1, SSPBUF dolu
	while(!BF);		//SSPBUF '0' oluncaya kadar bekleniyor
}

unsigned char spi_read(void)
{
	
	
	while(!BF);

	return SSPBUF;
}


rs232.c
#include <pic16f877a.h>
#include "rs232.h"
#include "stdio.h"
void usart_init(void)
{
unsigned char speed,nine_bits;
unsigned int divider;
RX_PIN = 1; // Seri ileti?im pinleri giri? olarak tan?mlan?yor
TX_PIN = 0;
if(HIGH_SPEED==1) // H?zl? ileti?im yap?lacaksa
speed=0x4;
else // Yaval ileti?im yap?lacaksa
speed=0x00;
if(NINE==1) // 9 bitlik ileti?im yap?lacaksa
nine_bits=0x04;
else // 8 bitlik ileti?im yap?lacaksa
nine_bits=0x00;
SPBRG = DIVIDER; // H?z de?eri SPBRG'ye yükleniyor
RCSTA = (nine_bits|0x90); // Al?m kaydedicisi ayarlan?yor
TXSTA = (speed|nine_bits|0x20); // Gönderim kaydedicisi ayarlan?yor
}
void putch(unsigned char byte)
{
// Tek byte gönder
while(!TXIF); // Transfer tamponu bo? mu
TXREG = byte; // Tek byte gönderiliyor
}
unsigned char getch(void)
{
// Tek byte al
while(!RCIF); // Al?m tamponu bo? mu
return RCREG; // Tek byte al?n?yor
}


master kartın kodu
#include <pic16f877a.h>
#include <stdio.h>
#include "rs232.h"
#include "delay.h"
#include "spi.h"

// PIC16F877A Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
#define slave1 RD4
#define slave2 RD5
void main(void)
{
    TRISA=0x00;
    TRISB=0x00;
    TRISC5=0; //SDO
    TRISC3=0; //SCK
    TRISD=0b00000111;
    ADCON1=0b00000110;
    slave1=1;
    slave2=1;
    usart_init(); // USART ilk ayarlar? yap?l?yor
    char i,j;
    spi_init();

    printf("RS232 baglandi");
    while(1)
    {
        i=0;
        while(i == 0)
        {
        i=getch();
        }
        if(i==49){slave1=0; spi_write(0x10); slave1=1;printf("\n\rslave1 led1\n\r");}
        if(i==50){slave1=0; spi_write(0x11); slave1=1;printf("\n\rslave1 led2\n\r");}
        if(i==51){slave1=0; spi_write(0x12); slave1=1;printf("\n\rslave1 led3\n\r");}
        if(i==52){slave2=0; spi_write(0x10); slave2=1;printf("\n\rslave2 led1\n\r");}
        if(i==53){slave2=0; spi_write(0x11); slave2=1;printf("\n\rslave2 led2\n\r");}
        if(i==54){slave2=0; spi_write(0x12); slave2=1;printf("\n\rslave2 led3\n\r");}
    }
}


slave kartın kodu
#include <pic16f877a.h>
//Slave
#include "spi.h"
// PIC16F877A Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


void main(void)
{
    TRISA4=1;
    TRISB=0x00;
    TRISC5=0; //SDO
    TRISC3=1; //SCK
    TRISD=0x00;
    PORTD=0x00;
    ADCON1=0b00000110;
    spi_init();
    unsigned char spibilgi;
    void spioku(unsigned char *bilgi);
    while(1)
    {
        spioku(&spibilgi);
        if(spibilgi==0x10){PORTD=0b00000001;}
        if(spibilgi==0x11){PORTD=0b00000010;}
        if(spibilgi==0x12){PORTD=0b00000100;}
    }


}

void spioku(unsigned char *bilgi)
{
    *bilgi=spi_read();
}
Çalışan kazanır.

yldzelektronik

Ortada hiç bir bilgi yok.Şuan için tek gösterilebilecek adres "Sarı Çizmeli Mehmet Ağa".
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

elektronart

donanımsal olarak aynı modülleri kullanan spi ve seri portu kullanıyor olabilirsin, datasheetlerde bununla ilgili notlar yazar.
Ya da kod yazımında bir sorun vardır, biri çalışırken diğerini kitliyorsundur.
Şema ve kod paylaşırsan nokta çözüm alabilirsin.
Açık Elektronik

powerelectronic

Alıntı yapılan: yldzelektronik - 12 Nisan 2014, 09:08:31
Ortada hiç bir bilgi yok.Şuan için tek gösterilebilecek adres "Sarı Çizmeli Mehmet Ağa".
Alıntı yapılan: elektronart - 12 Nisan 2014, 11:44:11
donanımsal olarak aynı modülleri kullanan spi ve seri portu kullanıyor olabilirsin, datasheetlerde bununla ilgili notlar yazar.
Ya da kod yazımında bir sorun vardır, biri çalışırken diğerini kitliyorsundur.
Şema ve kod paylaşırsan nokta çözüm alabilirsin.
Yukarıya ekledim hocam.
Çalışan kazanır.

powerelectronic

Arkadaşlar yardm lazım bj proje benim icin çok önemli.
Çalışan kazanır.

elektronart

SPI ve Seri portu interrupt üzerinden çalışır hale getirmen gerekir. Anladığım kadarıyla sürekli olarak seir porttan bir bilgi bekliyorsun, bilgi geldikten sonra da SPI dan ve seri porttan bilgi gönderiyorsun. Tahminim seri porttan ilk gönderdiğin bilgi doğru çalışıyordur, hatta 300-500ms aralıklar gönderdiğin bilgiler de doğru algılanıyordur ama daha sık aralıkla bilgi gönderiyorsan bunlar arada kayboluyordur çünkü işlemci bu arada SPI ve seri port üzerinden veri göndermekle meşgul yeni gelen verileri alamaz. Eğer seri porttan gelen bilgileri interrupt içinde yakalarsan bu sorun ortadan kalkar. SPIdan sadece 1 byte gönderdiğin için SPIi interrupt içine yazmasan da olur şu aşamada.
Slavein kodu çok basit olduğunda orda herhangi bir sorun olduğunu sanmıyorum.
Açık Elektronik

Kabil ATICI

Öncelikle bu dili bilmiyorum o yüzden saçmaladımsa mesajım görmezden gelebilirsiniz.
master kodu içinde
#include <pic16f877a.h>
#include <stdio.h>
#include "rs232.h"
#include "delay.h"
#include "spi.h"
şeklinde çağırmışsın,

ama senin
spi.c ve rs232.c şekilnde  alt programların var. Hangi ara ana programına dahil ediyorsun?

master kodun
#include <pic16f877a.h>
#include <stdio.h>
#include "rs232.c"
#include "delay.h"
#include "spi.c"
şeklinde olması gerekmez mi?

dediğim gibi saçmalamış olabilirim.
ambar7

powerelectronic

Ambar hocam ben orada .h dosyalarini cagiriyorum ama orada onemli bisey yok sadexe .c de bulunan finksiyonlarin tanimlamalari var. Yoksa dediginiz dogru. Elektrinart dediginizi deneyecegim.
Çalışan kazanır.

elektronart

Açık Elektronik