| 
			
					
	    
  
		
		
		
			
		
	
		
	
					
		
		
				Mielőtt nagyon beleélnétek magatokat a hiba felderítésébe, közlöm, hogy a 12F508-ban nincs megszakítás. 
Ha a Timer0-t akarjátok használni, akkor javaslom a MAIN hurokban a Timer0 legfelső bitjét figyelni, hogy mikor vált állapotot és azt számlálni a megfelelő időzítés elérése érdekében. 
Egyébként sokkal praktikusabb lenne másik PIC-et választani, amiben van megszakítás.  
Még a 10F322 is jobb alternatíva az ő 190HUF árával a 12F508-al szemben.						 
				
		 		
						
		
		
				Esetleg tudnál írni egy példát ,hogy oldható ez meg?						 
				
		 		
						
		
		
				Melyik porton van a LED, amit villogtatni akarsz? 
Belső oscillátort használsz, vagy külső kvarcot? 
Az MCLR lábat portként használod vagy reset funkcióra?						 
				
		 		
						
		
		
				PIN_B1 -en van a led. A belsó oszcillátort használom. Az MCLR lábon pedig egy gomb van.						 
				
		 		
						
		
		
				/********************************************************************  
********************************************************************/  
   
#include <12F508.h>  
   
#FUSES NOWDT                  // No Watch Dog Timer  
#FUSES INTRC                  // Internal RC Osc  
   
#use delay(int=4MHz)  
   
/********************************************************************/  
   
#byte          GPIO        =        0x06  
#bit           Gomb        =        GPIO.3             // nyomogomb port  
#bit           LED         =        GPIO.1             // LED port  
   
int            Cnt         =        0;                 // számláló  
int            Buff        =        0;                 // általános buffer  
int            Tmp;                                    // Timer0.7 átmeneti tároló  
   
/********************************************************************  
                        Prototypes  
********************************************************************/  
   
void           Button         ();  
   
/********************************************************************/  
void  
main()  
{  
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit); // 65.5 ms overflow  
   set_tris_b(0b001000);            // összes port kimenet, kivéve az MCLR  
          
   while(1)                         // mindörökké  
   {  
      Tmp=get_timer0()&0x80;        // kinyerjük a Timer0 legfelső bitjét  
      if(Buff!=Tmp)                 // ha a Timer0 legfelső bitje változott  
      {  
         Buff=get_timer0()&0x80;    // Timer0 legfelső bit állapotát mentjük  
         if(++Cnt>14)               // változott már 15x a Timer0 legfelső bitje?  
         {  
            Cnt=0;                  // ha igen kinullázzuk a számlálót és a  
            LED^=1;                 // LED állapotát az ellenkezőre változtatjuk  
         }    
      }  
      if(!Gomb)                     // ha nyomják a gombot (input Low)  
         Button();                  // ugrás a függvényre  
   }    
}  
   
/********************************************************************/  
void  
Button()  
{  
   ;  /* ide lehet megírni a gombot kezelő függvényt, ha kell */     
}  
  				A hozzászólás módosítva: Jan 29, 2013 
						 
				
				
		 		
						
						
		
		
				Sziasztok.Egy  rfm01-es modult szeretnék éleszteni a gyártó a modul adatlapján pic-hez adott is forrást, viszont én szeretném átültetni ccsc-re.Mert ezt értem meg 
Be teszem ide a kódot tudtok az átírásban segíteni?Amúgy ez milyen c-ben van írva?
 Sziasztok. Egy rfm01-es modult szeretnék éleszteni a gyártó a modul adatlapján pic-hez adott is forrást, viszont én szeretném átültetni ccsc-re. Mert ezt értem meg: ) 
Be teszem ide a kódot tudtok az átírásban segíteni?Amúgy ez milyen c-ben van írva?  
[code=c]/**********************************************************  
copyright (c) 2010  
Title: RF01 simple example based on PIC C  
Current version: V1.2  
Function: Package receive Demo  
Processor PIC16F73  
Clock: 10MHz Crystal  
Operate frequency: 434MHz  
Data rate: 4.8kbps  
Package size: 23byte  
Author: BaiGuang  
Company: Hope microelectronic Co.,Ltd.  
Contact: +86-0755-82973806  
E-MAIL: rfeng@hoperf.com  
Date: 2010-07-14  
********************************************************/  
#include "pic.h"  
typedef unsigned char uchar;  
typedef unsigned int uint;  
#define SDI RB5  
#define SCK RB4  
#define SDO RB2  
#define nIRQ RB1  
#define nSEL RB7  
#define LED RA0  
#define LED_OUT() TRISA0=0  
#define nIRQ_IN() TRISB1=1  
#define SDI_OUT() TRISB5=0  
#define SCK_OUT() TRISB4=0  
#define SDO_IN() TRISB2=1  
#define DATA_IN() TRISB1=1  
#define nSEL_OUT() TRISB7=0  
void RF1_Init( void );  
void Write0( void );  
void Write1( void );  
void Delayus( uint us );  
void WriteCMD( uint CMD );  
uchar RF01_RDFIFO(void);  
void Delays(void);  
__CONFIG(0x3FF2);  
bank1 uchar RF_RXBUF[19];  
void RF1_Init( void )  
{  
nSEL=1;  
SDI=1;  
SCK=0;  
nSEL_OUT();  
SDI_OUT();  
SDO_IN();  
nIRQ_IN();  
SCK_OUT();  
LED_OUT();  
LED=0;  
}  
void main()  
{  
uchar i=0,j=0;  
uint CheckSum;  
Delays();  
RF1_Init( );  
WriteCMD(0x0000);  
WriteCMD(0x898A);//433BAND,134kHz  
WriteCMD(0xA640);//434MHz  
WriteCMD(0xC847);//4.8kbps  
WriteCMD(0xC69B);//AFC setting  
WriteCMD(0xC42A);//Clock recovery manual control,Digital filter,DQD=4  
WriteCMD(0xC240);//output 1.66MHz  
WriteCMD(0xC080);  
WriteCMD(0xCE84);//use FIFO  
WriteCMD(0xCE87);  
WriteCMD(0xC081);//OPEN RX  
while(1)  
{  
while(!nIRQ)  
{  
RF_RXBUF[i++]=RF01_RDFIFO();  
if(i==17)  
{  
i=0;  
WriteCMD(0xCE48);  
WriteCMD(0xCE87);  
CheckSum=0;  
for(j=0;j<16;j++)  
CheckSum+=RF_RXBUF[j]; //add 0x30-----0x3F  
CheckSum&=0x0FF;  
if(CheckSum==RF_RXBUF[16])  
{  
LED=1;  
}  
Delayus(1);  
LED=0;  
}  
}  
}  
}  
void Write0( void )  
{  
SDI=0;  
SCK=0;  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
SCK=1;  
NOP();  
}  
void Write1( void )  
{  
SDI=1;  
SCK=0;  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
NOP();  
SCK=1;  
NOP();  
}  
void WriteCMD( uint CMD )  
{  
uchar n=16;  
SCK=0;  
nSEL=0;  
while(n--)  
{  
if(CMD&0x8000)  
Write1();  
else  
Write0();  
CMD=CMD<<1;  
}  
SCK=0;  
}  
uchar RF01_RDFIFO(void)  
{  
uchar i,Result;  
SCK=0;  
SDI=0;  
nSEL=0;  
for(i=0;i<16;i++)  
{ //skip status bits  
SCK=1;  
NOP();  
NOP();  
SCK=0;  
NOP();  
NOP();  
}  
Result=0;  
for(i=0;i<8;i++)  
{ //read fifo data byte  
Result=Result<<1;  
if(SDO)  
{  
Result|=1;  
}  
SCK=1;  
NOP();  
NOP();  
SCK=0;  
NOP();  
NOP();  
}  
nSEL=1;  
return(Result);  
}  
void Delayus( uint us )  
{  
uint i;  
while( us-- )  
{  
i=1000;  
while( i-- )  
{  
NOP();  
}  
}  
}  
void Delays(void)  
{  
uchar i=10;  
while(i--)  
{  
Delayus(1);  
}  
}  
 [/code]
 
Előre is köszönöm.						  
				
		 		
						
		
		
				Ha hasonlít az  RFM12 modulra, akkor tudok segíteni neked. 
Pontosan milyen beállításban szeretnéd üzemeltetni a modulkát? Nagyon fontos. Milyen frekin, milyen baudrate kell, analog/digitális szűrő legyen-e, FIFO megszakítást kérsz, vagy pollingozni akarod, hány byte-os csomagok lesznek az átvitelben, bitenként, vagy byte-onként akarod kiolvasni a vett adatokat stb... 
Egyébként ha eltalálod a beállításait, nagyon prímán működik. 
Transzparens (analog) üzemmódban kell kezdeni a beállításokat és egy szkóp kell a vevő kimenetére. Ezzel látni lehet a sávszélesség - baud rate és a belső szűrő beállításait, ami szorosan összefügg egymással. Utána lehet a szépségeit kihasználni.  
Van egy jól használható beállítási segédlet hozzá ( RFM12). 
De érzésem szerint ugyanaz a chip van mindkettőben. (Integration IA4420)						  
				
				
		 		
						
		
		
				Ahogy nézem hasonlít egyenlőre még nem jutottam el odáig, hogy a beállításokat számba vegyem ehhez nyitottam egy topikot   majd ott akarom kivesézni.Egyenlőre a pic része érdekel az spi élesztése működése, és ennek megvalósítása ccsc-n belül.Azért volna jó a beillesztett kódot amit a gyártó írt át írni ccsc-re mert ott szoftveres spi van és jól megérteném hagyan is kell küldeni az adatokat, ha van ccsc-s forrásod az rfm-12-höz szívesen megnézném első ránézésre ugyan úgy kell konfigurálni.						  
				
		 		
						
		
		
				Szoftveres SPI-t te magad is tudsz írni. Nézz át az  rfm12b topicba, ott van működő ccsc kód, amiben saját sw SPI van.						  
				
		 		
						
		
		
				Itt van két függvény, amivel lehet küldözgetni parancsokat (16bit) és adatokat (8bit). 
Ha nem világos valami, akkor szóljál.
 void  
WriteCMD(long CMD)  
{  
int n=16;                                                                                                                                                                  
   
        SCK=0;  
        nSEL=0;                                                                                                                                                            
        while(n--)  
        {  
                if(CMD&0x8000)                                                                                                                                     
                        SDI=1;                                                                                                                                             
                else                                                                                                                                                               
                        SDI=0;                                                                                                                                             
                SCK=1;                                                                                                                                                     
                SCK=0;  
                CMD<<=1;                                                                                                                                                           
        }  
        SCK=0;  
        nSEL=1;                                                                                                                                                            
}  
   
/*****************************************************/  
void   
WriteFSKbyte(int DAT)  
{  
int     Cnt=8;                                                                                                                                                     
   
        while(Cnt--)  
        {  
                if(DAT&0x80)                                                                                                                                       
                        SDI=1;                                                                                                                                             
                else                                                                                                                                                               
                        SDI=0;                                                                                                                                             
                SCK=1;                                                                                                                                                     
                SCK=0;  
                DAT<<=1;                                                                                                                                                           
        }  
}  
  				A hozzászólás módosítva: Feb 9, 2013 
						 
				
		 		
						
		
		
				Köszönöm, hogy időt szakítasz rám! 
Tudnád olyan formában is küldeni, hogy megegye a ccsc?
 #include<16F877.h>  
#device adc=10  
#fuses xt,nowdt,noprotect,noput,nolvp,debug //Fuses  
#use delay(clock=4000000)  
#use rs232(baud= 9600,parity=N, xmit=PIN_C6,rcv=PIN_C7,bits= 8)  
   
typedef unsigned char uchar;  
typedef unsigned int uint;  
   
#define SDI     pin_C4  
#define SCK     pin_C3  
#define SDO             pin_C5  
#define nIRQ    pin_B1  
#define nSEL    pin_A5  
#define LED     pin_A0  
   
   
   
//-----------------------------------------------------------  
void main()  
{  
   
    void  
    WriteCMD(long CMD)  
    {  
    int n=16;                                                                                                                                              
       
            SCK=0;  
            nSEL=0;                      
            while(n--)  
            {  
                    if(CMD&0x8000)                                    
                            SDI=1;                                      
                    else                                                                                  
                            SDI=0;                                      
                    SCK=1;                                        
                    SCK=0;  
                    CMD<<=1;                                                                                                                                                          
            }  
            SCK=0;  
            nSEL=1;                      
    }  
}  
  
Mert szeretnék soronként végig menni rajta.
 
Bocs ha bénázok de mindig tanulok újat...						  
				
		 		
						
		
		
				Itt van egy kibelezett kódrészlet, nem fordítottam le, így nem tudom, hogy szintaktikailag helyes maradt-e. Ez adónak húzza fel a modulét. Kicsit szétdült a tagolás. 3tab a behúzás. 
Fusesok... blah blah blah...  
   
#use                    delay(int=4MHz)  
   
#case  
   
/***************************************************************/  
   
#define                 Tx_FREQ(freq)   ((freq-430.0)/0.0025)                                                      
   
/***************************************************************/  
   
#byte           PORTA   =               0x05      
#byte           PORTB   =               0x06  
#byte           PORTC   =               0x07  
#byte           PORTD   =               0x08  
#byte           PORTE   =               0x09  
   
#byte                   INTCON  =               0x8B  
#bit                    INTF            =               INTCON.1  
   
#bit                    SCK             =               PORTA.1  
#bit                    SDI             =               PORTA.2  
#bit                    SDO             =               PORTA.4  
#bit                    nIRQ            =               PORTA.5  
#bit                    Button  =               PORTB.0  
#bit                    DIPup           =               PORTB.1                                                                                            
#bit                    DATA            =               PORTB.2  
#bit                    LED             =               PORTB.3  
#bit                    nSEL            =               PORTB.4  
   
/***************************************************************  
*                                                                                                                                                                                                                                                       *  
*                                                                                                       MAIN                                                                                                            *  
*                                                                                                                                                                                                                                                       *  
***************************************************************/  
void   
main()  
{  
   
        setup_oscillator(OSC_4MHZ);  
        set_tris_a(0b00111001);  
        set_tris_b(0b00000001);  
        set_tris_c(0b11111111);  
        nSEL=1;   
        LED=1;  
        delay_ms(100);  
   
        while(1)  
        {  
                PWR_Down();  
                WriteCMD(0x8201);  
                WriteCMD(0x8221);  
                delay_ms(1);  
                Dat_Send();  
        }  
}  
   
/**********************************************/  
void   
Dat_Send()  
{                  
   
        WriteCMD(0x8221);  
        SCK=0;  
        nSEL=0;  
        WriteFSKbyte(0xB8);  
        WriteFSKbyte(0xAA);  
        while(!SDO);  
   WriteFSKbyte(0xAA);  
        while(!SDO);  
   WriteFSKbyte(0x2D);  
        while(!SDO);  
   WriteFSKbyte(0xD4);  
        while(!SDO);  
        WriteFSKbyte(IDD);              //adat  
        while(!SDO);  
        WriteFSKbyte(SZAM);             //adat  
        while(!SDO);  
        delay_us(2500);  
   nSEL=1;  
        WriteCMD(0x8201);  
}  
   
/**************************************************/  
void  
{  
   
        nSEL=1;  
        SDI=1;  
        SCK=0;  
   
        WriteCMD(0x8097);//EL,EF,433band,12.0pF                                                                 Configuration Settings  
        WriteCMD(0x8219);//!er,!ebb,ET,ES,EX,!eb,!ew,DC         Power Management  
        WriteCMD(0xA000+Tx_FREQ(430.48));//                                                                                     Frequency Settings   
        WriteCMD(0xC647);//4800bps                                                                                                      Data Rate 0xC647 4.8bps 0xC6C7 600bps  
        WriteCMD(0x9800);//!mp,15kHz,MAX OUT            Tx Configuration  
        WriteCMD(0x8201);   
}  
   
/***************************************************/  
void  
WriteCMD(long CMD)  
{  
int n=16;  
   
        SCK=0;  
        nSEL=0;  
        while(n--)  
        {  
                if(CMD&0x8000)  
                        SDI=1;  
                else  
                        SDI=0;  
                SCK=1;  
                SCK=0;  
                CMD<<=1;  
        }  
        SCK=0;  
        nSEL=1;  
}  
   
/***************************************************/  
void   
WriteFSKbyte(int DAT)  
{  
int     Cnt=8;  
   
        while(Cnt--)  
        {  
                if(DAT&0x80)  
                        SDI=1;  
                else  
                        SDI=0;  
                SCK=1;  
                SCK=0;  
                DAT<<=1;  
        }  
}  
   
/***************************************************/  
  				A hozzászólás módosítva: Feb 9, 2013 
						 
				
		 		
						
		
		
				Helló mindenki! 
RS 232 -es kommunikációval próbálkozom, de nem akar össze jönni. Ez lenne a kódom:
 #include <16f628a.h>  
#use delay (clock=4MHz)  
#fuses NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP, NOMCLR  
#fuses INTRC_IO  
   
#use rs232(baud= 9600, xmit=PIN_B0,rcv=PIN_B1 )  
   
   
void main(void){  
   while(TRUE){  
      printf("Online");  
   }  
}  
  
Valamiért nem az jelenik meg a terminálon ,hogy Online, hanem számomra olvashatatlan szöveg. Végig próbálgattam egyesével a betűket és mindegyikre valami mást ad, szóval valahol a karakterek kódolásánál lehet a gond. Valaki meg tudná mondani mi van rosszul beállítva? Vagy lehet a hardvernél van a gond?
 
Előre is köszi!				 A hozzászólás módosítva: Feb 10, 2013 
						 
				
				
		 		
						
		
		
				Ha kihagyod a szintillesztőt akkor jó? Beállítottad a terminálon is a kommunikációs paramétereket?						 
				
		 		
						
		
		
				Mi az a szintillesztő? A beállítások jók.						 
				
		 		
						
						
		
		
				Anélkül az ég világon semmit nem csinál a terminál.						 
				
		 		
						
						
		
		
				Most már nálam is. Pedig először úgy csináltam és nem volt hajlandó működni. Köszönöm és elnézést a bénázásomért.						 
				
		 		
						
		
		
				Üdv mindenkinek! 
Megtudnád mondani, hogy milyen szimulátort használsz? Mostanáig ha tesztélni akartam valamit, mindig próbapanel elő, összedrótoztam és hajrá, csak néha jó lenne egy ilyen program, ha nincs kéznél a felszerelés.						 
				
		 		
						
		
		
				Proteus a program neve. Talán az egyik legjobb áramkör szimuláló program a maga korlátain belül. 
 
Megint elakadtam egyébként: 
Raktam le egy virtuális COM csatlakozást és föltettem mellé a VSPE nevű progit, amivel a soros port összekötetését lehet szimulálni. Így rá tudok csatlakozni a Hyperterminálal és össze köthetem a virtuális áramkörömet a gépemmel. Innen a határ a csillagos ég. Érdekes módon két terminál tud kommunikálni. Ha PIC -et kihagyom szintén működik a dolog, viszont a PIC el semmi nem jelenik meg a gépemen lévő Hypertemrinálon. Nem tudom mennyire volt érthető. Felteszem összecsomagolva a projektet. CCS, Proteus, Mplab -al dolgoztam.						 
				
				
		 		
						
						
		
		
				Kösz a választ, kipróbálom. 
Üdv Máté						 
				
		 		
						
		
		
				Üdv! 
Adott ez a kód:
 for (i = 31; i >= 0; i--) {  
      send_bit ( (kep[sor]&pow(2,i)) >> i);  
   }  
 
A probléma az ,hogy a pow csak float -ot fogad el a for meg csak int -et. Legalábbis a compiler ezt a hibát dobja. Próbáltam cast -olni ,de nem változtat a hiba üzeneten valamiért. Hogy lehetne ezt a problémát megoldani?
 
Előre is köszi!						  
				
		 		
						
		
		
				A   helyett használd a   kifejezést. Az első floating point művelet (irgalmatlan lassú egy 8-bites PIC-en), a második pedig pár utasításra fordul le.				 A hozzászólás módosítva: Feb 14, 2013 
						 
				
		 		
						
		
		
				Ez gyorsabb lenne szerintem azon felül, amit _vl_ írt: 
for (i=2147483648; i; i>>=1)  
{  
        send_bit(kep[sor]^i?1:0);  
}  
  						 
				
		 		
						
		
		
				Rosszul írtam, nem ^ jel kell, hanem & jel. 
 
Az i változód milyen típusú? unsigned long kellene, de CCS-ben ez nem biztos, hogy 32 bites, ezért talán int32-vel kellene próbálkozni.						 
				
		 		
						
		
		
				Most valahogy a teljes kód elromlott és 1 napi munkám oda lett. A fapados kód sem megy már, nem értem miért.   						 
				
		 		
						
		
		
				Akkor valahol máshol lesz a hiba, ha az sem megy, ami eddig ment. Esetleg kontakthiba?						 
				
		 		
						
				 
			  | 
			 |