Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   52 / 153
(#) icserny válasza Soós Antal hozzászólására (») Dec 7, 2011 /
 
Idézet:
„Ha túl nagy lenne a prog akkor a fordító reklamál?”
A linker kerül bajba, amikor nem tudja elhelyezni a program kódját a rendelkezésére álló címtartományban.
(#) Soós Antal válasza potyo hozzászólására (») Dec 8, 2011 /
 
Közben át néztem a p18F4550.h tényleg benne van nem kell saját igaz ott is ugyanaz amit én írtam

#define Nop() {_asm nop _endasm}
(#) Soós Antal válasza icserny hozzászólására (») Dec 8, 2011 /
 
OK! Egyszerűsítve a lényeg hogy Total Commanderben nézve kb kétszer akkora lehet mint PIC program memóriája ha jól vettem ki.
(#) benjami hozzászólása Dec 19, 2011 /
 
Adva van a következő példaprogram (C18)
  1. #include <p18cxxx.h>
  2. //#include <string.h>
  3. char LcdText[16*2+1];
  4. void main(void)
  5. {
  6.   memcpypgm2ram(LcdText, "01020304050607080910111213141516", 32);
  7.   while(1)
  8.   {
  9.   }
  10. }

A 2. sor direkt van jelen esetben kiREMelve.
A kérdés: hogyan lehetne rávenni a fordítót arra hogy hibát jelezzen a string.h hiánya miatt a memcpypgm2ram függvénynél? Csak egy "Warning [2058] call of function without prototype" üzenetet küld a fordító mert a header file hiánya miatt a változótípusokat nem megfelelően helyettesíti be, de valahogy az ilyen figyelmeztetésen könnyen át lehet szaladni anélkül hogy észrevenné az ember.
Ha a "string.h"-t beinclude-olom (de szép magyar szó) akkor is küld figyelmeztetést "Warning [2054] suspicious pointer conversion" de így már persze helyesen működik. Valahogy nekem szimpatikusabb lenne a header-ek kötelező beillesztése, mint header nélkül működésképtelen kódot csinálni.
(#) trudnai válasza benjami hozzászólására (») Dec 20, 2011 /
 
A 2054-es warningot kell megszuntetni es akkor nem lesz problema. Pl igy:

  1. #include <p18cxxx.h>
  2.     //#include <string.h>
  3.     char LcdText[16*2+1];
  4.     void main(void)
  5.     {
  6.       memcpypgm2ram(LcdText, (rom void *)"01020304050607080910111213141516", 32);
  7.       while(1)
  8.       {
  9.       }
  10.     }
(#) benjami válasza trudnai hozzászólására (») Dec 20, 2011 /
 
Ebben az esetben "Warning [2066] type qualifier mismatch in assignment" hibaüzenetet küld a fordító, a kód pedig ugyanúgy hibátlanul működik mind a "rom void *" nélkül.
A könyvtári függvényeket a lib/clib.lib file-ból szedi elő akkor is ha a projectbe nem tesszük be, sőt ha a "library search path"-ot nem állítjuk be akkor is lefordítja. Ez különben az összes könyvtári függvénnyel így van, én csak kiragadtam egyet a példa kedvéért.
(#) icserny válasza benjami hozzászólására (») Dec 20, 2011 /
 
Idézet:
„A könyvtári függvényeket a lib/clib.lib file-ból szedi elő”
Van ezzel egy olyan probléma is, hogy a saját projekt és a gyári library esetleg különböző memória memória modellt használ. Az optimális használathoz és a warningok megszüntetéséhez célszerű újrafordítani a gyári library-t. ITT írkáltam már ilyenekről.
(#) benjami válasza icserny hozzászólására (») Dec 20, 2011 /
 
Köszi, megvizsgálom ezt a lehetőséget, így már érthető miért rakott akkor is 24bites rom mutatót a verembe a paraméterátadáskor ha small code model -t állítottam be. Gyakorlatilag semmi változás nem volt a small és a large code model között, pedig egy csomó helyet és processzor időt lehet nyerni ha elég a small model (nálam mindig elég a small, mert minden 8 bites pic-nek amit használok kisebb a kódmemóriája 64k-nál).
(#) Travolta hozzászólása Dec 20, 2011 /
 
Sziasztok! Szeretnék segítséget kérni tőletek. Egy forrás fájlt kéne befordítani .hex-be. Sajnos én a PIC-ek ezen részéhez nem értek. A mikrokontroller típusa 18F2550 és HiTech C18-ban íródott. Előre is köszönöm a segítséget!
Üdv.:Travolta
(#) MPi-c válasza Travolta hozzászólására (») Dec 23, 2011 /
 
Kellemes Karácsonyt!
(#) Travolta válasza MPi-c hozzászólására (») Dec 25, 2011 /
 
Nagyon szépen köszönöm! Boldog Karácsonyt Neked is!
(#) benjami válasza icserny hozzászólására (») Dec 27, 2011 /
 
Még egyszer köszi az ötletet, közben az általam használt chipekhez meg is csináltam az újrafordítást, ráadásul a memória modellt is átállítottam "far"-ról "near"-ra. Így megszabadultam a felesleges warningoktól, ráadásul a kapott kód is kisebb és gyorsabb lesz. Az fordító include könyvtárában is 4 header file-ba bele kellett nyúlni a memória modell miatt, de így teljesen jó lett.
(#) silent15 válasza mspike hozzászólására (») Dec 29, 2011 /
 
Szia , láttam a hozászólásodat EZT és érdekelne , hogy az a könyvet nekem is el tudnád e küldeni , meg még anyi , hogy ez ugye a 18x -be beletartozik a 18f széria is?

Üdvözlettel: Németh Tamás

BÜÉK!!
(#) Simon Kornél hozzászólása Dec 29, 2011 /
 
Sziasztok!
Van egy problémám, remélem tudtuk benne segíteni. LCD-re szeretnék kiíratni szöveget. Betűket már ki tudok rakni, de szöveget nem.
Idézet:
„#include "piccolo_all.h"
#include

#define RS_HIGH()LATBbits.LATB5=1;
#define RS_LOW()LATBbits.LATB5=0;
#defineRW_HIGH()LATBbits.LATB6=1;
#define RW_LOW()LATBbits.LATB6=0;
#define E_HIGH()LATBbits.LATB7=1;
#define E_LOW()LATBbits.LATB7=0;

unsigned char pp[];

void epulse(void)
{
Delay10TCYx(2);
E_HIGH();
Delay10TCYx(2);
E_LOW();
Delay10TCYx(1);
}

void LCD_Cmd(unsigned char cmd)
{
unsigned char cmd_upper;
char c;

cmd_upper=cmd;
c=cmd&0xF0;
PORTD=c;
RS_LOW();
epulse();
c=(cmd_upper&0x0F)<<4;
PORTD=c;
RS_LOW();
epulse();
Delay10KTCYx(6);
}

void LCD_Init(void)
{
TRISB=0b00000000;//Vezérlő lábak írásra állítása
TRISD=0b00000000;//ADAT vonal írásra állítása

Delay10KTCYx(60);//első várakozás min. 15ms

RS_LOW();//első utasítás
RW_LOW();
PORTD=0b00110000;//0x30
Delay10KTCYx(6);//5ms várakozás
PORTD=0b00110000;//0x30
Delay10KTCYx(1);
PORTD=0b00110000;//0x30
PORTD=0b00100000;//0x20 - 4 bites mód

LCD_Cmd(0x28);
LCD_Cmd(0x06);
LCD_Cmd(0x0d);
LCD_Cmd(0x01);
}

void LCD_Char(unsigned char Ch)
{
unsigned char ch_upper;
char cr;

ch_upper=Ch;
cr=Ch&0xF0;
PORTD=cr;
RS_HIGH();
epulse();

cr=(ch_upper&0x0F)<<4;
PORTD=cr;
RS_HIGH();
epulse();
Delay10KTCYx(6);
}

void LCD_Text(unsigned char char_array[])
{
pp[1]=char_array[1];
LCD_Char(pp[1]);
}

void main(void)
{
LCD_Init();

LCD_Cmd(0xc0);
LCD_Char('K');

LCD_Cmd(0x80);
LCD_Text('PROBA');

while (1)
{
TRISDbits.TRISD1=0;
LATDbits.LATD1=1;
}
}”

Az LCD_Text();-vel szeretnék szöveget kiíratni. Most egyenlőre a 'PROBA' nevű szövegből az első karakter szerettem volna kirakni az LCD_Cmd(); függvénnyel, de az LCD-n 'R' helyett 'L' jelenik meg.
Nem értem miért?
Remélem tudtok segíteni nekem
Előre is köszönöm a segítségeteket.

BUÉK!
(#) icserny válasza Simon Kornél hozzászólására (») Dec 30, 2011 /
 
1. LCD_Cmd()-vel ne akarj szöveget kiíratni, mert az az LCD vezérlőjének szóló parancsok kiküldésére való! Remélem, hogy csak elírás volt és az LCD_Char()-ral próbálkozol.
2. Szövegfüzér konstansok megadásához nem az aposztróf, hanem az idézőjel (gy.k.: macskaköröm) használandó.
3. Ha egy függvényt úgy írtál meg, hogy az adatmemóriából (egy tömbből) vegye elő a karaktereket, akkor az nem használható szövegkonstansok kiírására, mivel azokat a ROM-ba kerülnek, s annak kezeléséhez más típusú mutatókat kell deklarálni const rom módosítókkal. Nézegesd meg és hasonlítsd össze a C18 telepítési könyvtárban a "gyári" putsXLCD() és putrsXLCD() függvények forráskódját! Ezek alapján az LCD_Text() mellé írj egy másik függvényt, amelyik képes a ROM-ból elővenni a kiírandó szöveget.
(#) Simon Kornél válasza icserny hozzászólására (») Jan 1, 2012 /
 
Szia!
Megnéztem amit mondtál, de nem találom a problémát.
Ha egy tömbhöz hozzáadok egy szöveget és még mutatót is használok pl.: "proba", akkor miért változik meg az értéke a karakternek és miért nem adja vissza a megfelelő betűt a tömbből?
(#) icserny válasza Simon Kornél hozzászólására (») Jan 1, 2012 /
 
Idézet:
„Megnéztem amit mondtál, de nem találom a problémát.”

Problémát már ne keress, mert azokat pontokba szedve felsoroltam neked! A probléma megértéséhez pedig mélyedj el egy kicsit a tömbkezelés rejtelmeibe (ezt addig folytasd, amíg a C fordító által generált gépi utasításokat is meg nem érted)!

Idézet:
„miért változik meg az értéke a karakternek”
Nem a karakter értéke változik meg, hanem a függvénynek átadott paraméter értelmezése lesz rossz: karakterkód mutatóként lesz használva, vagy fordítva. A múltkori hozzászólásomban már elmondtam, hogy mi a teendő ennek kivédésére.
(#) mohapower hozzászólása Jan 4, 2012 /
 
Sziasztok!

A következő programot írtam:

#include


_CONFIG1 (JTAGEN_OFF & FWDTEN_OFF )
_CONFIG2 ( FNOSC_PRI & POSCMOD_XT )


void vDelay (unsigned int uiTime );


int main (void)

{
AD1PCFG = 0xFFFF; //analóg bemenetek kikapcsolva
TRISB = 0x0FFF;//RB12-15 kimenet
LATB = 0x0000;
TRISAbits.TRISA2 = 1;//RA2 láb bemenet
//_TRISA2 = 1;

while (1)
{
if ( _RA2==1 )
{
LATB = 0xFFFF;

}

else
{
LATB = 0x0000;
}
}

}


Elvileg a programnak azt az egyszerű feladatot kellene ellátnia, hogy ha RA2 magas szinten van(nincs benyomva a nyomógomb), akkor az RB15-ön világít a led, ha benyomjuk az RA2-n lévő nyomógombot, a led elalszik( amíg el nem engedjük a nyomógombot). A probléma az hogy valamiért nem működik. Viszont ha a nyomógombot átkötöm RA0-ra, (és átírom a programba), akkor működik. Valaki tudja esetleg, hogy mi lehet az oka? Próbáltam RA3-as lábat is, ott se működött. Előre is köszi a választ!
(#) icserny válasza mohapower hozzászólására (») Jan 4, 2012 /
 
POSCMOD_XT helyett POSCMOD_NONE-val próbálkozz! Szerintem az okozott problémát, hogy az oszcillátor funkciót nem tiltottad le az RA2 lábon.
(#) mohapower válasza icserny hozzászólására (») Jan 4, 2012 /
 
és működik is...!
Köszönöm szépen a gyors segítséget!
Üdv!
(#) user hozzászólása Jan 4, 2012 /
 
Sziasztok!

Nekem a következő problémám adódott:
Építettem egy áramkört egy pic16f877-essel,ami max232-n keresztül tud kommunikálni.
Az ic felprogramozását soros porton keresztül szeretném megoldani,de sajnos a mikroc "nem jó"
hex fájlt generál a soros porti letöltőprogram(download.exe) számára.
Tudja valaki hogy mikroc-ben hogy lehet ezt a hibát javítani?

üdv.

hiba.JPG
    
(#) icserny válasza user hozzászólására (») Jan 4, 2012 /
 
Gondolom, a MikroC feltételezi, hogy a hozzá illő bootloadert és letöltő programot használod. Bővebben: Link
Idézet:
„Tudja valaki hogy mikroc-ben hogy lehet ezt a hibát javítani?”
Szerintem ez nem hiba, hanem inkompatibilitás. Sokféle bootloader létezik, ezek mind másképp csinálják.
(#) user válasza icserny hozzászólására (») Jan 4, 2012 /
 
Ez a mikrobootloader érdekelne.
Most próbáltam,de sajnos nem tud a pic-hez kapcsolódni.
Ezzel programoztál már fel így 877-est?
Ehhez van valami program amit be kell előre égetni a pic-be hogy fogalni tudja a soros adatokat?
(#) icserny válasza user hozzászólására (») Jan 4, 2012 /
 
Idézet:
„Ezzel programoztál már fel így 877-est?”
Nem használok sem 877-est sem MikroC-t. Csak a Google keresőt, a lusta emberek helyett...
Idézet:
„Ehhez van valami program amit be kell előre égetni a pic-be hogy fogalni tudja a soros adatokat?”
Kell, hogy legyen, mert minden bootloadernek ez az alapja. Az előző hozzászólásomban adott linken ezt írják a mikroBootloader használatához első lépéseként:
"Load the PIC with the appropriate hex file using the conventional programming techniques (e.g. for PIC16F877A use p16f877a.hex)." - gondolom, ez a PIC-be égetendő bootloader. Nézz körül a MikroC telepítési könyvtárában, hogy nincs-e ott már valahol! De még valószínűbb, hogy neked kell lefordítanod, hiszen az órajel frekcenciájához és a soros port adatsebességéhez is lehet, hogy hozzá kell szabni.Bővebben: Link
(#) trudnai válasza user hozzászólására (») Jan 5, 2012 /
 
Idézet:
„Ehhez van valami program amit be kell előre égetni a pic-be hogy fogalni tudja a soros adatokat?”


Igen, ezt nevezik "bootloader"-nek...
(#) user válasza trudnai hozzászólására (») Jan 5, 2012 /
 
Ha normálisan működne az icsp felület a pickit2-vel, akkor nem kellene más programozási megoldáson törnöm a fejem,de sajnos a pickit2 csak néha ismeri fel a 877-est.

picplc6.sch
    
(#) brian1985 hozzászólása Jan 5, 2012 /
 
Tudna nekem valaki segíteni abban, hogy levédett tartalmat hogy lehetne kiolvasni PIC12C508-ból ? Gondolom csak nagyon bonyolult módon, pl. lézerrel eltávolítani a felesleges PIC tetejét, majd megnézni a memóriát fizikailag, hogy merre állnap a "flip-flop-ok"... valami egyszerűbb dolog? Vagy írni kell rá saját programot ?
(#) kissi válasza user hozzászólására (») Jan 5, 2012 /
 
Az ICSP normálisan működik PK2-vel, Nálad lehet valami probléma ( inkább azt keresd meg és szüntesd meg ! ) !

Steve
(#) vilmosd válasza brian1985 hozzászólására (») Jan 5, 2012 /
 
Idézet:
„Vagy írni kell rá saját programot ?”
Ez az egyeduli megoldas. Esetleg elektronmikroszkop
(#) netnet.hu hozzászólása Jan 5, 2012 /
 
Helló, van egy kis gondom.

Az ADC-m úgy tűnik, mintha 10 bit helyett 8-at kezelne. Konkrétan a 379-es sornál állítom meg a debuggolás közben és sehogy se érek el nagy értékeket.
Az IC 18LF14K22, 3,3V 16MHz. Próbálkozom 10K potméterel, 3 lábú hőmérő iC-vel és 2 lábú 10K ellenállás hőmérővel is.

Itt az egész kód, hogy nehogy kimaradjon valami.

  1. #include<p18f14k22.h>
  2. #include<delays.h>
  3.  
  4. #pragma config FOSC = IRC// 1 mhz
  5. #pragma config PLLEN = OFF// ez csak 4 és 8 mhz-en megy
  6. #pragma config PCLKEN = ON// Primary Clock Enable
  7. #pragma config FCMEN = OFF// Fail-Safe Clock Monitor
  8. #pragma config IESO = OFF// Internal/External Oscillator Switchover
  9.  
  10. #pragma config BOREN = SBORDIS
  11. #pragma config MCLRE = OFF
  12.  
  13. #pragma config HFOFST = ON
  14. #pragma config STVREN = ON// Stack Full/Underflow Reset Enable
  15. #pragma config LVP = OFF// Single-Supply ICSP? Enable
  16. #pragma config XINST = OFF// Extended Instruction Set
  17.  
  18. #pragma config WDTEN = OFF
  19. #pragma config PWRTEN = OFF
  20.  
  21.  
  22.  
  23. //Itt, most jönnek a definíciók:
  24. #define gomb1PORTAbits.RA5//Ventillátor
  25. #define gomb2PORTAbits.RA4//Csörlő
  26. #definegomb3PORTAbits.RA3//Keverő
  27. #definegomb4PORTCbits.RC5
  28. #definegomb5PORTCbits.RC4
  29.  
  30. //#define rele1LATBbits.LATB5
  31. #define ventillatorLATBbits.LATB5
  32. //#define rele2LATBbits.LATB7
  33. #define csorloLATBbits.LATB7
  34. //#define rele3LATCbits.LATC7
  35. #define keveroLATCbits.LATC7
  36. #definerele4LATCbits.LATC6
  37. #define rele5LATCbits.LATC3
  38.  
  39.  
  40. //#define ledLATBbits.LATB6
  41. #define controlLATBbits.LATB6
  42. //#define gomb1 PORTAbits.RA3//Ventillátor RB7
  43. //#define gomb2 PORTAbits.RA4//Csörlő RC7
  44. //#define gomb3 PORTAbits.RA5//Keverő RC6
  45.  
  46.  
  47. unsigned char an1 = 0b0000;
  48. unsigned char an2 = 0b0001;
  49. unsigned char an3 = 0b0010;
  50. unsigned char an4 = 0b0100;
  51. unsigned char an5 = 0b0101;
  52. unsigned char an6 = 0b0110;
  53. unsigned char an7 = 0b1010;
  54.  
  55. int Hz = 0;
  56. char ezred = 0;
  57. char szazad = 0; // századmásodperces számláló
  58. char ds = 0; // decisecond, tizedmásodperc, 0,1 másodperc
  59. char sc = 0; // másodperc
  60. int min = 0; //perc (max 254 perc)
  61. char be_idozites = 3; // Ennyi ideig lesz bekapcsolva minden
  62.  
  63. unsigned int iDelay; // Ideiglenes változó ADC átalaktásokra.
  64. unsigned int homero;
  65. char oszto = 1;
  66. char szorzo = 1;
  67. unsigned int ventillator_total = 6000;
  68. unsigned int ventillator_all = 3000; // (ADC) Hány tizedmásodpercet álljon a csörlő minden másodpercben
  69. unsigned int ventillator_megy = 0; // (ADC) Hány tizedmásodpercet menjen a csörlő minden másodpercben
  70. unsigned int ventillator_szamlalo = 0;
  71. char ventillator_allapot = 0;
  72.  
  73. unsigned int csorlo_all = 1500; //Hány ezredmásodpercet álljon a csörlő
  74. unsigned int csorlo_megy = 0; // (ADC) Hány ezredmásodpercet menjen a csörlő
  75. unsigned int csorlo_szamlalo = 0;
  76. char csorlo_allapot = 0;
  77.  
  78. unsigned int kevero_all = 3500; //Hány másodpercet álljon a csörlő
  79. unsigned int kevero_megy = 250; //Hány másodpercet menjen a csörlő
  80. unsigned int kevero_szamlalo = 0;
  81. char kevero_allapot = 0;
  82.  
  83. void low_isr (void){
  84. if(INTCONbits.TMR0IF == 1)
  85. {
  86. INTCONbits.TMR0IF = 0;
  87. Hz++;
  88. if(Hz == 4) // ezredmásodpercek
  89. {
  90. ezred++;
  91. Hz = 0;
  92. ventillator_szamlalo++;
  93. }
  94. if(ezred == 10) //száuadmásodpercek
  95. {
  96. szazad++;
  97. ezred = 0;
  98. csorlo_szamlalo++;
  99. kevero_szamlalo++;
  100. }
  101. if(szazad == 10)
  102. {
  103. szazad = 0;
  104. ds++;
  105. }
  106. if(ds == 10)
  107. {
  108. ds = 0;
  109. sc++;
  110.  
  111.  
  112. if(control == 1)
  113. control = 0;
  114. else
  115. control = 1;
  116. }
  117. if(sc == 60)
  118. {
  119. sc = 0;
  120. min++;
  121. }
  122. }
  123. }
  124.  
  125. void high_isr (void){
  126. }
  127.  
  128. #pragma code low_vetor=0x18
  129. void interrupt_at_low_vector(void)
  130. {
  131. low_isr();
  132. _asm
  133. retfie1
  134. _endasm
  135. }
  136. #pragma code// Return to default code section
  137. #pragma code high_vetor=0x8
  138.  
  139. void interrupt_at_high_vector(void)
  140. {
  141. _asm GOTO high_isr _endasm
  142. }
  143. #pragma code// Return to default code section
  144.  
  145. void bekapcs(void)
  146. {
  147. while (be_idozites != sc) // Amíg bekapcs van, addíg minden megy
  148. {
  149. csorlo = 1;
  150. ventillator = 1;
  151. kevero = 1;
  152. }
  153. csorlo = 0;// Utána mindent kikapcsolunk, hogy fusson a program
  154. ventillator = 0;
  155. kevero = 0;
  156. }
  157.  
  158. void venti(void)
  159. {
  160.  
  161. if (!gomb1) ventillator =1; //RA3
  162. else
  163. {
  164.  
  165. /* Init ADC */
  166. ADCON0bits.CHS = an1;
  167. ADCON0bits.ADON =1;
  168. ADCON1=0b00000000;   // Use Internal Voltage Reference (Vdd and Vss)
  169. ADCON2=0b10000011;   // Right justify result, 12 TAD, Select the FRC for 16 MHz
  170. ADCON0bits.GO=1;//Ezzel utazítást adunk arra, hogy akarunk egy AD átalakítást végezni
  171.  while (ADCON0bits.GO);   // Wait conversion done G0 értéke nulla lesz, ha befejeződött az átalakitás és akkor mehetőnk tovább
  172. iDelay=ADRESL;           // Get the 8 bit LSB result
  173. iDelay += (ADRESH << 8); // Get the 2 bit MSB result
  174. // Kiolvastuk az értéket, ami 0 és 1023 között lehet. Ha több a bekapcs idő, akkor kevesebb lesz a kikapcs idő.
  175. //ventillator_all = ventillator_total;
  176. ventillator_megy = iDelay*2;
  177. // Kezdjük a ventillátorral
  178. if (ventillator_allapot == 0) // Ha állapot 0
  179. {
  180. ventillator = 1;
  181. if (ventillator_szamlalo >= ventillator_megy)
  182. {
  183. ventillator_szamlalo = 0;
  184. ventillator_allapot = 1;
  185. }
  186. }
  187. else
  188. {
  189. ventillator = 0;
  190. if (ventillator_szamlalo >= ventillator_all)
  191. {
  192. ventillator_szamlalo = 0;
  193. ventillator_allapot = 0;
  194. }
  195. }
  196. }
  197. }
  198.  
  199.  
  200.  
  201. void csorl(void)
  202. {
  203.  
  204. if (!gomb2) csorlo = 1;
  205. else
  206. {
  207.  
  208. /* Init ADC */
  209. ADCON0bits.CHS = an2;
  210. ADCON0bits.ADON =1;
  211. ADCON1=0b00000000;   // Use Internal Voltage Reference (Vdd and Vss)
  212. ADCON2=0b10000011;   // Right justify result, 12 TAD, Select the FRC for 16 MHz
  213. ADCON0bits.GO=1;//Ezzel utazítást adunk arra, hogy akarunk egy AD átalakítást végezni
  214. while (ADCON0bits.GO);   // Wait conversion done G0 értéke nulla lesz, ha befejeződött az átalakitás és akkor mehetőnk tovább
  215. iDelay=ADRESL;           // Get the 8 bit LSB result
  216. iDelay += (ADRESH << 8); // Get the 2 bit MSB result
  217. // Kiolvastuk az értéket, ami 0 és 1023 között lehet
  218. csorlo_megy = (iDelay/10)/oszto*szorzo;// 5x szorzó, így kb 0 és 5 másodperc között fog mozogni a keverő.
  219. // csörlő
  220. if (csorlo_allapot == 0) // Ha állapot 0
  221. {
  222. csorlo = 1;
  223. if (csorlo_szamlalo >= csorlo_megy)
  224. {
  225. csorlo_szamlalo = 0;
  226. csorlo_allapot = 1;
  227. }
  228. }
  229. else
  230. {
  231. csorlo = 0;
  232. if (csorlo_szamlalo >= csorlo_all)
  233. {
  234. csorlo_szamlalo = 0;
  235. csorlo_allapot = 0;
  236. }
  237. }
  238. }
  239. }
  240.  
  241.  
  242. void kever(void)
  243. {
  244. if (!gomb3) kevero = 1; //RA5
  245. else
  246. {
  247. // keverő
  248. //kevero_megy = kevero_megy/oszto*szorzo;
  249. if (kevero_allapot == 0) // Ha állapot 0
  250. {
  251. kevero = 1;
  252.  
  253. if (kevero_szamlalo >= kevero_megy)
  254. {
  255. kevero_szamlalo = 0;
  256. kevero_allapot = 1;
  257. }
  258. }
  259. else
  260. {
  261. kevero = 0;
  262.  
  263. if (kevero_szamlalo >= kevero_all)
  264. {
  265. kevero_szamlalo = 0;
  266. kevero_allapot = 0;
  267. }
  268. }
  269. }
  270. }
  271.  
  272. void main() {
  273.  
  274.  
  275. // Beállítjuk a ki és bemeneteket. 0 ki, 1 be
  276. PORTA = 0;
  277. PORTB = 0;
  278. PORTC = 0;
  279. TRISAbits.TRISA0 = 1;
  280. TRISAbits.TRISA1 = 1;
  281. TRISAbits.TRISA2 = 1;
  282. //TRISAbits.TRISA3 = 1;
  283. TRISAbits.TRISA4 = 1;
  284. TRISAbits.TRISA5 = 1;
  285.  
  286. TRISBbits.TRISB4 = 1;
  287. TRISBbits.TRISB5 = 0;
  288. TRISBbits.TRISB6 = 0;
  289. TRISBbits.TRISB7 = 0;
  290.  
  291. TRISCbits.TRISC0 = 1;
  292. TRISCbits.TRISC1 = 1;
  293. TRISCbits.TRISC2 = 1;
  294. TRISCbits.TRISC3 = 0;
  295. TRISCbits.TRISC4 = 1;
  296. TRISCbits.TRISC5 = 1;
  297. TRISCbits.TRISC6 = 0;
  298. TRISCbits.TRISC7 = 0;
  299.  
  300.  
  301.  
  302. //ANSEL =  0b11000111;  // Set PORT AN1, AN2 to analog input
  303. //ANSELH = 0b00001011;        // Set PORT AN8 to AN11 as Digital I/O
  304. ANSELbits.ANS0 = 1;
  305. ANSELbits.ANS1 = 1;
  306. ANSELbits.ANS2 = 1;
  307. ANSELbits.ANS3 = 0;
  308. ANSELbits.ANS4 = 1;
  309. ANSELbits.ANS5 = 1;
  310. ANSELbits.ANS6 = 1;
  311. ANSELbits.ANS7 = 0;
  312.  
  313. ANSELHbits.ANS8 = 0;
  314. ANSELHbits.ANS9 = 0;
  315. ANSELHbits.ANS10 = 1;
  316. ANSELHbits.ANS11 = 0;
  317.  
  318.  
  319. OSCCON = 0b01110000; //16MHz, ha PLL be akkor 64MHz //ha ezt bekommentelem, akkor alapból 1 MHz a sebesség
  320.  
  321. PORTC = 0; // kikapcs minden láb
  322. TRISC = 0; // beállitjuk kimenete össz lábat
  323.  
  324. // RA3 lábat digitális bemenetre kell állitani
  325. //----------PORTA = 0; // kikapcs minden láb
  326. //----------TRISA = 0; // beállitjuk bemenete össz lábat
  327.  
  328. //ANSEL = 0x00; // Ansel registerben minden nulla, hogy ne zavarjon.
  329. //ANSELH = 0x00; // idem
  330.  
  331. // Bekapcsolom a Timer 1 időz
  332. //T0CON = 0b10000110; // register. itt állitottuk be a timer osztóját
  333. T0CONbits.TMR0ON=1;//T0 bekapcsolva
  334. T0CONbits.T08BIT=1;//1 8 bites 0 16 bites
  335.  T0CONbits.T0CS=0;//Internall clk
  336. T0CONbits.T0SE=0;//Increment on low
  337. T0CONbits.PSA=0;//prescaler enabled
  338. T0CONbits.T0PS=0b001;
  339.  
  340. INTCONbits.TMR0IF=0;// nullára tesszük az interrupt flag-ot
  341. INTCONbits.TMR0IE=1;// interrupt engedélyezése, tehát a flag értéke változtatható
  342. INTCON2bits.TMR0IP=0;// high vagy low interrupt legyen az interupt
  343.  
  344. /*INTCONbits.RABIF = 0; // RA port interrupt flagját nullára teszem
  345. INTCONbits.RABIE = 1; // RA port interrupt engedélyezése
  346. IOCAbits.IOCA4 = 1; // RA4-en engedélyezem az interruptot
  347. INTCON2bits.RABIP = 0; //RA port low priority interrup
  348. */
  349. RCONbits.IPEN = 1; // legyen-e high és low interrupt vagy sem
  350.  
  351. INTCONbits.PEIE = 1; //low isr interrupt bekapcsolva
  352. INTCONbits.GIE = 1; //high isr interrupt bekapcsolva
  353.  
  354. // Az első és legfontosabb funkció a bekapcsolás. 10 másodpercig adagoljuk
  355. // a fát, a ventillátort maximumra felpörgetjük és megkeverjük a fát.
  356. // mindezt a bekapcs gomb lenyomásával árhetjük el
  357. //bekapcs();
  358. ventillator_szamlalo = 0;
  359. while(1)
  360. {
  361.  
  362. venti();
  363. csorl();
  364. kever();
  365.  
  366.  
  367. // Hőmérő rutinja
  368. ADCON0bits.CHS = an3;
  369. ADCON0bits.ADON =1;
  370. ADCON1=0b00000000;   // Use Internal Voltage Reference (Vdd and Vss)
  371. ADCON2=0b10000011;   // Right justify result, 12 TAD, Select the FRC for 16 MHz
  372. //ADCON2=0b10111110;   // Right justify result, 12 TAD, Select the FRC for 16 MHz
  373. ADCON0bits.GO=1;//Ezzel utazítást adunk arra, hogy akarunk egy AD átalakítást végezni
  374.  while (ADCON0bits.GO);   // Wait conversion done G0 értéke nulla lesz, ha befejeződött az átalakitás és akkor mehetőnk tovább
  375. iDelay=ADRESL;           // Get the 8 bit LSB result
  376. iDelay += (ADRESH << 8); // Get the 2 bit MSB result
  377. // Kiolvastuk az értéket, ami 0 és 1023 között lehet. Ha több a bekapcs idő, akkor kevesebb lesz a kikapcs idő.
  378. homero = iDelay;
  379. homero = iDelay;
  380.  
  381. // Kezdjük a ventillátorral 4=kb40fok *6kb38fok* 8kb55fok 9kb57fok  10kb60fok 11kb64fok
  382. //12kb66fok  13kb69fok 14kb73fok  15kb74fok ----16kb75fok----- 17kb78fok 18kb80fok
  383. //19kb81fok  20kb82fok  21kb83fok 22kb84 23kb87ig 24kb87-88 25kb88-89
  384. //26kb90-91 27 szintén 90-91 28kb92-93 29kb93 30kb95 31kb96 33kb97 34kb98
  385. // 75 foknál pihi, 85 foknál kikapcs
  386. //17 nél minden menjen lassabban
  387. //23-nál álljon le teljesen
  388.  
  389. //miszliknél 16
  390. if (homero <= 7)
  391. {
  392. oszto = 1;
  393. szorzo =1;
  394. csorlo_all = 1500;
  395. }
  396. if (homero >= 8 & homero <= 22)
  397. { //miszliknél 17
  398. oszto = 2;
  399. szorzo =1;
  400. control = 1;
  401. csorlo_all = 3000;
  402. }
  403. if (homero >= 19)  
  404. { // miszéoknél 23
  405. oszto = 1;
  406. szorzo =0;
  407. control = 0;
  408. //csorlo_all = csorlo_all*1;
  409. }
  410.  
  411. if (homero == 100) homero = 1000;
  412.  
  413.  
  414.  
  415. } //while
  416. }
Következő: »»   52 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem