Fórum témák
- FET vezérlése
- • Karácsonyi fényfüzérek
- • DCF77 óra Nixie-csövekkel
- • Kombikazán működési hiba
- • Felajánlás, azaz ingyen elvihető
- • Oszcilloszkóp vétel, mit gondoltok?
- • Leválasztó transzformátor
- • Nyomtató probléma
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Indukciós főzőlap javítása
- • Mosogatógép hiba
- • Arduino
- • Radiosonde
- • HESTORE.hu
- • Audiofil, High End Audio
- • Klíma szervizelés, javítás
- • Elektromos sütő
- • PC táp javítása
- • Kenyérpirító nem kapcsol ki időben
- • Kapcsolóüzemű táp 230V-ról
- • Jókívánság
- • Kerámialapos tűzhely
- • DC motor/lámpa PWM szabályzása
- • Labortápegység készítése
- • Szilárdtest relé
- • Elfogadnám, ha ingyen elvihető
- • NYÁK terv ellenőrzése
- • IGBT VEZÉRLÉSE
- • Villanyszerelés
- • STK erősítők javítások
- • Hegesztő inverter javítás
- • MyElecParts alkatrész kereső és készlet nyilvántartó
- • Okosotthon relé vezérlő IO board arduino és MCP23017 alapon
- • Elektromos távirányítós kapunyitó
- • Hűtőgép probléma
- • WiFi / WLAN alapkérdések
- • Tápegységgel kapcsolatos kérdések
- • Erősítő mindig és mindig
- • Készülékek kapcsolási rajzai
- • Forrasztópákák - melyik miért jó
- • Vaillant kazán Arduino vezérlése
- • LED-es villogó fényfüzér
- • Elektromos roller
- • LCD TV probléma
- • Akkumulátor töltő
- • Számítógép hiba, de mi a probléma?
- • Varrógép elektronika
- • Videoton EA 6383 s (tuning)
- • ZC-18 kazán
- • Gázkazán vezérlő hibák
- • IPTV, azaz, TV-zés internet szolgáltatón keresztül
- • Szobatermosztát bekötése
- • Vicces - mókás történetek
- • Sprint-Layout NYÁK-tervező
- • Hibrid erősítő
» Több friss téma
|
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?
|
|