Fórum témák
- • Ráz a kültéri medence vize
- • Kondenzátor feltöltés
- • Folyamatábrás mikrokontroller programozás Flowcode-dal
- • Klíma szervizelés, javítás
- • Felajánlás, azaz ingyen elvihető
- • Kapcsolási rajzot keresek
- • Vásárlás, hol kapható?
- • Elektromos kerékpár, robogó házilag
- • Számítógép hiba, de mi a probléma?
- • Rádió építés a kezdetektől a világvevőig
- • Westen 240 Fi gázkazán hiba
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • VF3 - 6 végerősítő
- • Villanypásztor
- • Mosógép vezérlők és általános problémáik
- • Villanymotor
- • Quad 405-ös erősítő tapasztalatok és hibák
- • LM1875, LM3875, LM3886, stb. TI végerősítők
- • Villanyszerelés
- • RFID Miértek és hogyanok
- • Li-Po - Li-ion akkumulátor és töltője
- • Audiofil, High End Audio
- • Alternativ HE találkozó(k)
- • PLC alapismeretek
- • PIC - Miértek, hogyanok haladóknak
- • Páratartalom érzékelő
- • Gitár Pickup
- • Kondenzátor
- • Inverteres hegesztőtrafó
- • Erősítő mindig és mindig
- • TV hiba, mi a megoldás?
- • Elektromos fűnyíró probléma
- • Li-Ion saját akkucsomag készítése
- • Ki hol gyártatja a NYÁK-ot ?
- • Flip-Flop? Bistabil? Buffer?
- • Egyfázisú motor forgásirány váltása mágneskapcsolóval
- • Indukciós főzőlap javítása
- • Espressif mikrokontrollerek
- • Hörmann kapuk
- • Műveleti erősítő
- • Kombikazán működési hiba
- • Codefon kaputelefon
- • Autóelektronika
- • Porszívó javítás
- • Rádióamatőrök topikja
- • Muzeális készülékek-alkatrészek restaurálása
- • Analóg oszcilloszkóp javítása
- • Elektromos távirányítós kapunyitó
- • Érdekességek
- • Sütő javítás
- • DVB-T - Földfelszíni digitális problémák
- • Frekvencia - feszültség átalakító
- • Mosogatógép hiba
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Oszcilloszkóp, avagy hogyan kell használni?
» Több friss téma
|
Fórum » PIC programozása C nyelven, C-Compiler
Szerintem gondolkodj visszafelé... Mit csinál a kapcsolásod? Mikor csinálja? (feltételek) Meddig csinálja (időzítések, Timerek) Hányszor csinálja (Változók, konstansok), stb... Ebből már írhatsz programot, feltételekkel, elágazásokkal, időzítőkkel, ki és bemenetekkel. A hozzászólás módosítva: Okt 8, 2013
Sziasztok, kérem szépen aki tud 18F4550-re vagy vele hasonszőrű pic-re DS1307 RTC működő kódot mikroc-ben írva amit fel tudnék használni kérem jelezze valamilyen módon amit neten találtam az nem működik szimulátorban sem :/
Jó de most nem vagyok egy nagy c programozó viszont ezt az egy nyelvet még fel tudom fogni.
Azért is lenne jó, mert kicsit gépész gondolkozású vagyok és pld most egy tuskóhasítót akarok csinálni, és elektronika is kell hozzá, akkor nem kell ttl kapukkal vagy multiplexerel játszanom hanem csak beírom amit megterveztem. Azaz egy plc-t akarok kiváltani picel.
Létradiagram - blokkdiagram - utasítás lista átalakítás az elég jól megy, de ezt szeretném egyszerű c-be bevinni költségspórolás miatt és egyben tudásomat is bővíteni szeretném. A hozzászólás módosítva: Okt 9, 2013
Nosza. Jól leírtad, állj neki C-t olvasni!
Ismerem, de nem ezzel akarok hanem rendesen C-ben akarom ezt legenerálni.
Hali!
Nézd meg a megfelelő include fájlban az igazi deklarációt, ha eltérsz tőle akkor warning van, jogosan, illetve használj castolást, mint a példádban, de nyilván olyan tipusra, mint a definicióban van
Segítséget kérek!
Van egy szerkezetem, két motor rajta... Egyik (M1) - DC motor, másik (M2) - léptető motor.
Most az M2 vezérlését mutatom. A sok delay-t szeretném kiváltani. A lépések gyorsasága most az AD-re kötött potméterrel szabályozható.
void le() {
for(i=0; i<65; i++){
M2A = 1; M2B = 1;
VDelay_ms((ADC_Read(0)/16)+1);
M2A = 1; M2B = 0;
VDelay_ms((ADC_Read(0)/16)+1);
M2A = 0; M2B = 0;
VDelay_ms((ADC_Read(0)/16)+1);
M2A = 0; M2B = 1;
VDelay_ms((ADC_Read(0)/16)+1);
}
}
void fel() {
for(i=0; i<65; i++){
M2A = 0; M2B = 1;
VDelay_ms((ADC_Read(0)/16)+1);
M2A = 0; M2B = 0;
VDelay_ms((ADC_Read(0)/16)+1);
M2A = 1; M2B = 0;
VDelay_ms((ADC_Read(0)/16)+1);
M2A = 1; M2B = 1;
VDelay_ms((ADC_Read(0)/16)+1);
}
}
Ez a kód "jól" működik, mert a szerkezet 64 lépésben leteszi amit kell és 64 lépésben fel is emeli.
DE! Hogyan alakítható át úgy, hogy megszakítással, időzítővel megoldható legyen a 64 lépés?!
Próbálkoztam a következővel:
void interrupt() {
if (TMR0IF_bit){
t++;
if (t>1024) t=0;
x++;
if (x==8) x=0;
TMR0IF_bit = 0;
}
}
void le() {
if (t>512 && t<1024){
switch(x){
case 0: M2A=1; M2B=1; break;
case 2: M2A=1; M2B=0; break;
case 4: M2A=0; M2B=0; break;
case 6: M2A=0; M2B=1; lee++; break;
}
}
lebit=1;
}
void fel() {
if (t>512 && t<1024){
switch(x){
case 0: M2A=0; M2B=1; break;
case 2: M2A=0; M2B=0; break;
case 4: M2A=1; M2B=0; break;
case 6: M2A=1; M2B=1; fell++; break;
}
}
felbit=1;
}
void inicializalas() {
Delay_ms(1000);
TRISA = 0b00000111; // 1 = input; 0 = output;
TRISB = 0b00000000;
TRISC = 0b00000000;
PORTA = 0b00000111;
PORTB = 0b00000000;
PORTC = 0b00000110;
ADC_init();
ADCON0 = 0xCF;
ADCON1 = 0x0E;
// Megszakítás és időzítő beállítása
TMR0ON_bit = 0; // TMR0 kikapcs
INTCON = 0xA0; // megszakítás engedélyezése TMR0-án
TMR0IE_bit = 1; // TMR0 Overflow Interrupt Flag bit
T08BIT_bit = 1; // TMR0 8bites
T0CS_bit = 0; // Timer0 Clock Source Select bit
PSA_bit = 0; // prescaler
// prescaler
// 111 = 1:256 Prescale value
// 110 = 1:128 Prescale value
// 101 = 1:64 Prescale value
// 100 = 1:32 Prescale value
// 011 = 1:16 Prescale value
// 010 = 1:8 Prescale value
// 001 = 1:4 Prescale value
// 000 = 1:2 Prescale value
T0PS0_bit = 1;
T0PS1_bit = 1;
T0PS2_bit = 0;
TMR0L = 0;
TMR0ON_bit = 1; // időzítő indítása
void main() {
inicializalas();
while(1){ // Végtelen ciklus
if (t==0) k=1;
if (t==1) k=0;
if (k) y++; // K (0-1) átmenet miért nem csak egyesével növeli y értékét???
switch(y){
case 0: le(); break;
case 1: break;
case 2: fel(); break;
case 3: y=0; break;
}
}
}
De nem megy... Össze vissza lépked és az ideg már kezd megölni, gondolkodni se tudok. Valaki akinek egy perc lenne az egész átgondolni szánna rám egy kis időt és konkrétumot tudna esetleg adni?
Előre is köszöm! A hozzászólás módosítva: Okt 19, 2013
Sziasztok!
Lenne egy kis problémám.
Van egy lcd+pic+ ds18b20 projektem. A program elején van egy olyan rész, ahol megvizsgálom, hogy van-e eszköz a buszon az OW_reset() függvénnyel.
switch(presence=OW_reset()){
case 1: lcd_puts("Nincs eszköz!"); while(OW_reset()){CLRWDT();} break;
case 2: lcd_puts("Zárlat a buszon!"); while(OW_reset()){CLRWDT();} break;
default: break;
}
Ha presence eredménye nem 0, akkor addig vár, míg 0 nem lesz.
Na most van úgy, hogy egyszer csak induláskor kiírja, hogy nincs eszköz majd néhány pillanat múlva már tovább lép.
De már volt olyan is (valószínüleg a hosszú kábel miatt), hogy zárlat a buszon volt az eredmény.
Mitől lehet ez?
Csatolom a kód elejét is:
unsigned char melyik_csoport=0;
//signed char tomb[24][4]; //átlagok számításához
//osszeg=0;
volatile unsigned char presence=0;
TRISA=0b00011110;
PORTA=0;
TRISC=0b10001111;
PORTC=0;
TRISB=0;
PORTB=0;
ANSEL=0;
ANSELH=0;
OPTION_REG=0x07;
initUART();
RTS_OFF();
lcd_init();
lcd_clear();
lcd_init_cgram();
if(is_OK_pressed()==1){
while(is_OK_pressed());
bus_init();
}
lcd_clear();
lcd_goto(0x00);
switch(presence=OW_reset()){
case 1: lcd_puts("Nincs eszköz!"); while(OW_reset()){CLRWDT();} break;
case 2: lcd_puts("Zárlat a buszon!"); while(OW_reset()){CLRWDT();} break;
default: break;
}
szam=FindDevices_withoutsaving();
lcd_goto(0x00);
lcd_puts("Talált eszköz: ");lcd_senddecimal(szam,1);
T0IE=1;
Előre is köszönöm. A hozzászólás módosítva: Okt 21, 2013
Gyanúm szerint sokat lendítene a helyzeten, ha megosztanád legalább az ow_reset függvényedet is, vagy elárulnád hogy melyik lib, illetve melyik fordító.... szerintem...

Jogos. Fordító Hitech C16
/*
* OW_reset
* visszatérési érték: 0 = van eszköz, 1 = nincs eszköz, 2 = rövidzár a buszon
*/
unsigned char OW_reset(void)
{
unsigned char presence, temp;
DisableAllInterrupts();
OW_HIZ();
OW_LO();
vWait_us(480); //480
// vWait_us(60);
OW_HIZ();
vWait_us(70); //70
// vWait_us(60);
presence = OW_DATA;
vWait_us(410);
// vWait_us(60);
temp = OW_DATA;
ResumeAllInterrupts();
return (!temp ? 2 : presence);
}
#define OW_TRIS TRISC4
#define OW_DATA RC4
#define OW_HIZ() (OW_TRIS = INPUT)
#define OW_HI() (OW_DATA = 1, OW_TRIS = OUTPUT) /* ez a 'strong pullup' */
#define OW_LO() (OW_DATA = 0, OW_TRIS = OUTPUT)
unsigned char FindDevices_withoutsaving (void){
unsigned char egyezo=0,egyezo_1=0;
unsigned char temp_rom[8];
numROMs = 0;
if (OW_reset() != 0)
return numROMs;
if (First()) { //Begins when at least one part is found
do {
for(unsigned char n=1;n<=c;n++){
for(unsigned char z=0;z<8;z++){
if(eeprom_read((n-1)*0x08+z)==ROM[z]){
egyezo++;
}
}
if(egyezo>=8)egyezo_1++;
egyezo=0;
}
if(egyezo_1==0){
for(unsigned char x=0;x<8;x++){
temp_rom[x]=ROM[x];
}
}
egyezo=0;egyezo_1=0;
numROMs++;
} while (Next() && (numROMs < MAX_DEVICES)); //Continues until no additional devices are found
}
return numROMs;
}
static unsigned char First(void)
{
lastDiscrep = 0;
doneFlag = false;
return Next();
}
static unsigned char Next(void)
{
unsigned char m = 1; // ROM Bit index
unsigned char n = 0; // ROM Byte index
unsigned char k = 1; // bit mask
unsigned char x = 0;
unsigned char discrepMarker = 0; // discrepancy marker
unsigned char g; // Output bit
unsigned char nxt; // return value
int flag;
nxt = 0; // set the next flag to false
dowcrc = 0; // reset the dowcrc
flag = OW_reset(); // reset the 1-wire
if(flag || doneFlag) { // no parts -> return false
lastDiscrep = 0; // reset the search
return false;
}
OW_write_byte(SEARCH_ROM); // send SearchROM command
do { // for all eight bytes
x = 0;
if (OW_read_bit() == 1)
x = 2;
if (OW_read_bit() == 1)
x |= 1; // and its complement
if (x == 3) // there are no devices on the 1-wire
break;
else {
if (x > 0) // all devices coupled have 0 or 1
g = x >> 1; // bit write value for search
else {
// if this discrepancy is before the last
// discrepancy on a previous Next then pick
// the same as last time
if (m < lastDiscrep)
g = ((ROM[n]&k)>0);
else // if equal to last pick 1
g = (m == lastDiscrep); // if not then pick 0
// if 0 was picked then record
// position with mask k
if (g == 0)
discrepMarker = m;
}
if (g == 1) // isolate bit in ROM[n] with mask k
ROM[n] |= k;
else
ROM[n] &= ~k;
OW_write_bit(g); // ROM search write
m++; // increment bit counter m
k = k<<1; // and shift the bit mask k
if(k == 0) { // if the mask is 0 then go to new ROM
// byte n and reset mask
ow_crc(ROM[n], &dowcrc); // accumulate the CRC
n++; k++;
}
}
} while (n < 8); //loop until through all ROM bytes 0-7
if (m < 65 || dowcrc) // if search was unsuccessful then
lastDiscrep=0; // reset the last discrepancy to 0
else {
// search was successful, so set lastDiscrep,
// lastOne, nxt
lastDiscrep = discrepMarker;
doneFlag = (lastDiscrep == 0);
nxt = true; // indicates search is not complete yet, more
// parts remain
}
return nxt;
}
A hozzászólás módosítva: Okt 22, 2013
Kivetni valót ugyan nem látok benne, próbálkozz az időzítésekkel kicsit manipulálni.
A hosszú gyenge minőségű kábel nagy kapacitása miatt okozhat érdekes jelenségeket.
Ne a minimum értékre kalibráld a progit, próbálj meg kicsit rátartani. pl a master reset minimum 480μs, az akár lehet 5-600 is, aztán a 15-60μs mire a szenzor(ok) válaszolnak.
Itt is hagyni kell egy kis időt a kábel kapacitás kisütésére/feltöltésére, vagyis a 70μs lehet hogy kicsit kevés, az lehet akár 100-110 is.
Bár csak tippek, de egy próbát megér. Nekem legtöbbször az időzítésekkel volt bajom az 1wire buszon.
Egy jobb minőségű riasztó kábelen 40m hosszon gond nélkül megy. A hozzászólás módosítva: Okt 22, 2013
Itt 3 busz lenne egy lábon, buszonként 8 eszköz, mindegyik busz kb 35-40 méter, mind UTP-vel van készítve.
Próbáltam a felhúzó ellenállást csökkenteni, most 2,2K.
A gond az, hogy valamikor egy busznál is kiírja ezt a hibát.
A 3 busz csatlakoztatásakor meg már csak 1 eszközt ír ki.
Szóval lehet hogy átléptem a 1wire határait. De azon gondolkodtam, hogy hogyan tudnám megcsinálni a 3 buszt 3 különböző lábra, úgy hogy ne kelljen már 3x megírni minden függvényt. A hozzászólás módosítva: Okt 22, 2013
Én azt csináltam, hogy az első bekapcsoláskor vártam egy- két mp-et, majd kiolvastam 5x. Ezeket eldobtam és utána ment az "éles" mérés/ellenőrzés.
És ez mire jó? Szóval miért kellett belerakjad?
Azt vettem észre, hogy hosszú kábel esetén tovább tart a szenzor éledése. Ha nincs ilyen gond, akkor nem kell. Amit írtam eléggé extrém eset, de ha egyszer megírod a rutint, nyugodtan használhatod később is mert az a néhány másodperc a bekapcsoláskor nem oszt... (Ilyenkor szoktam reklámszöveget kiíratni az LCD-re)
Akkor lehet hogy az UTP lesz a ludas....
Én is csináltam egyet anno UTP kábelen, és bizony el kellett vele szórakozni mire elindult.
A szenzorok táplábaira kellett egy 1u kondi, és a felhúzókkal is játszani kellett 15K és 2K között..... Akkor nem tulajdonítottam neki jelentőséget.
Most hogy riasztó kábelt használok minden ugrik első rugásra.
Lehet hogy semmi köze hozzá, de ha tudsz szerezz egy adag jobb minőségű riasztó kábelt és próbáld meg. Hátha.....
Én is azt használok és panel felőli végén az árnyékolás be van kötve. Ezzel értem el a legjobb eredményt. A hozzászólás módosítva: Okt 23, 2013
Úgy érted a táp minuszra, vagyis ez esetben a GND-re?
4x0.22-es jó? Kössem rá a maradék fölös eret is a GND-re?
hajaj ez elég érdekes lesz, mivel már a szondák bent vannak a silóban. Mindenesetre van a kábelekre hagyva vagy 20-20 méter szóval ha levágom a ráhagyásokat még van esély a működésre. Esetleg csökkentsem a felhúzó ellenállást 1,5 K-ra? Alá nem szabad lenne menni.
Szerintem 1K ig is le lehet menni 5V esetében, talán még lejjebb is.
Így van. Használtam már 1K-val.
Ha ti mondjátok, akkor ki fogom próbálni.
Amúgy van még valami trükközés a felhúzó ellenállás, meg az időzítések játszadozása mellett?
Esetleg valami illesztő IC? A hozzászólás módosítva: Okt 23, 2013
A lényeg a kommunikációs jelek minősége. Amiket eddig írtunk, az mind a jelkondicionálásról és feldolgozás pontosságáról szólt. Szerintem 3-4 dologgal lehet játszani:
- Jó és minél rövidebb kábel
- Felhúzó ell. értéke, (szűrés)
- Időzítések hozzáigazítása
- Kiugró mérési hülyeségek eldobása
Vagy van még az az opció, hogy nem 1-wire megoldást használsz...
1k alatt azért már csak óvatosan, nehogy átassünk a ló másik oldalálra. Az adatlap szerint csak 4mA lehúzó áramot garantálnak.
 És akkor melyik az a hőmérő, ami 1 vezetéken kommunikál, buszos, legalább 40-50 métert tud és belefér egy 10mm átmérőjü saválló csőbe?
Nem azt írtad, hogy UTP-kábeled van? Abban a legutolsó emlékeim szerint 4x2 ér volt...
|
|