Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1087 / 1320
(#) trudnai válasza kezdo001 hozzászólására (») Aug 8, 2012 /
 
De ha Windows-ozol, akkor kiprobalhatod a WinMerge nevu programot, baromi jo grafikus kulonbseg nezegeto:

Bővebben: Link
(#) kezdo001 válasza trudnai hozzászólására (») Aug 9, 2012 /
 
Köszönöm a válaszokat!
Ezzel "kicsit" gyorsabban észrevenni a különbséget
(#) Hp41C válasza kezdo001 hozzászólására (») Aug 12, 2012 /
 
Total Commander: File / Compare by content.
(#) Krisszes hozzászólása Aug 12, 2012 /
 
Sziasztok!
Egy olyan kérdésem lenne, hogy miért indul állandóan újra a PIC-em? Biztos nyilvánvaló a hiba, de nem jövök rá.
(#) _vl_ válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Tipikus probléma pl. a nem megfelelő tápellátás, pláne ha be van kapcsolva a Brown-Out-Reset.
(#) El_Pinyo válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
A bekapcsolt watchdog is okozhat ilyen problémát. Azonban nem vagyunk távgyógyítók, ha Te nem mellékelsz sem kapcsrajzot, sem programot, akkor nehéz lesz többet segíteni.
(#) vicsys válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Hiányzó MCLR felhúzó ellenállás is lehet...
(#) Krisszes válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Brown-out tiltva
wdt tiltva
reset áramkör 1 és 10 kohm-mal szabályosan bekötve
még a verem túlcsordulás reset-et is tiltottam
a táp a PicKit2

(még eléggé az elején vagyok, lehet a programmal van baj, de LCD kezelésnél is, de főleg egy egyszerű RB4 interrupt-nál van jelen ami annyit csinál, hogy az RA1-et első nyomásra felhúzza következőre meg le)
(#) Krisszes válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Nézzétek el hogy nincs komment

#include "p18f4550.h"
#include "delays.h"

volatile unsigned char out, port4;

#define SW1 PORTBbits.RB4

void lo_isr(void);
void hi_isr(void);

#pragma code high_vector_addr=0x08
void high_vector(void) {
_asm GOTO hi_isr _endasm
}

void low_vector(void) {
_asm GOTO lo_isr _endasm
}

#pragma code
#pragma interrupt hi_isr
void hi_isr(void) {
Delay10KTCYx(1500);
LATA^=0x01;
port4=PORTB;

INTCONbits.RBIF=0;
}

#pragma interrupt hi_isr
void lo_isr(void) {
}

void main(void) {
//------Megszakítási beállítása---------

TRISA=0x00;
PORTA=0x00;

RCON=0b1000000; //7.bit: Kétszintü megszakjtási mód beállítása
TRISB=0x10;
INTCON=0b10101000; //7.bit: A magas prioritású interrupt engedélyezése, 6.bit: alacsony prioritású interrupt tiltása, 5.bit: engerélyezi tulcsorduláskor a megszakítást stb.
INTCON2=0b00000001; //3.bit: RB magas prioritású


while(1) {
while(SW1==1) {
Delay10KTCYx(500);
}
while(SW1==0) {
Delay10KTCYx(500);
}
}
}
(#) _vl_ válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Idézet:
„a táp a PicKit2”

És mi van a PIC-re kötve még, amit a Pickit2-nek táplálnia kéne tudni?
(#) Krisszes válasza _vl_ hozzászólására (») Aug 12, 2012 /
 
Egy led

RB4 INT.png
    
(#) _vl_ válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Ezt a GOTO-s ISR hívogatósdit megnézted assembly-ben? Jó kódot generál így a fordító? Mert nekem gyanús a dolog...
(#) icserny válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
VDD és VSS bekötése rossz, remélem, hogy a valóságban nem így van!
(#) Krisszes válasza icserny hozzászólására (») Aug 12, 2012 /
 
Természetesen a rajz hibás.
A jelenség amúgy a led kaotikus villogása...
(#) Krisszes válasza _vl_ hozzászólására (») Aug 12, 2012 /
 
mindjárt átnézem. De ha LCD-kezelek az is újra indul csak ritkábban, és abban nincs interrupt.
(#) Krisszes válasza _vl_ hozzászólására (») Aug 12, 2012 /
 
Elméletileg jónk néz ki, az IT rutin elejére ugrik.
(#) Krisszes hozzászólása Aug 12, 2012 /
 
Olyan beállítási lehetőség van amivel az IT például csak felfutó élre kerül meghívásra?
(#) Hp41C válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Szia!

Mit is csinál a programod, ha a SW1 (azaz RB4 láb) kezdeti magas szinje után alacsonyra, majd magasra vált avagy kezdeti alacsony szintről magasra vált. A megfejtés: kilép a main függvényből. :csodalk: Egy másik programomban egy ugrást találok itt az inicializálásra aztán a main újbóli meghívása jön.
A main függényben egy végtelen ciklusnak kellene lennie...

Megszakítás kiszolgálásában ne használj delay függvényeket, programozott várakozásokat.
(#) Krisszes válasza Hp41C hozzászólására (») Aug 12, 2012 /
 
Kivettem a szoftveres pergésmentesítést a main-ből (úgy is ott a kondi SW1-nél), csak az inicializálás és egy végtelen ciklus van ahogy írod. Most úgy néz ki, hogy helyre állnak a dolgok, viszont két élváltozás van, így kétszer fut le az IT.

Jól látom az adatlapon, hogy csak az RB0-2 van lehetőség jelváltozás milyenségének a figyelésére?
(#) Hp41C válasza Krisszes hozzászólására (») Aug 12, 2012 /
 
Szia!
Kétféle változásfigyelési megszakítás kérésre van lehetőség:
INT0 - RB0, INT1 - RB1, INT2 - RB2: Az INTCON2 6., 5., 4. bitjével állítható, hogy melyik él váltsa ki a kérést.
Az RB4 .. RB7 lábakon az Interrupt on change funkció aktivizálható. Ezeknél minden változás megszakítás kérést okoz. A megszakítás kérés törléréhez ki kell olvasni a PORTB regiszter. Ha amúgyis be kell olvasni az új állapotot, akkor a program már el tudja dönteni, hogy magasra vagy alacsonyra váltott egy (vagy több) bemenet...
(#) Krisszes hozzászólása Aug 12, 2012 /
 
Köszönöm az építő jellegű gondolatokat.

Sikerült minden hibát elhárítani.
(#) brumibali hozzászólása Aug 13, 2012 /
 
Sziasztok
Ismét a segítségeteket szeretném kérni.
A timer 0 megszakításban szeretnék szoftveres pwm jelet kiadni(később többet is), és a fő programban szeretném variálni ezt a a pwm jel kitöltési tényezőt. Már hónapok óta szenvedek vele, de nem sikerül igazán. Itt az utolsó változat.
  1. #include <16F690.h>
  2. #device adc=8
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  5. #FUSES NOCPD                    //No EE protection
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES NOMCLR                   //Master Clear pin used for I/O
  8. #FUSES PUT                    //No Power Up Timer
  9. #FUSES NOBROWNOUT               //No brownout reset
  10.  
  11.  
  12. #use delay(clock=4000000)
  13. #ZERO_RAM
  14.  
  15. #include <Flex_LCD420_jav.c>
  16.  
  17. #define   pwm1   PIN_C2
  18. #define   pwm2   PIN_C3
  19. #define   pwm3   PIN_C4
  20. #define   pwm4   PIN_C5
  21.  
  22.  
  23.  
  24. //==============================================================
  25. //Változók dekralálása
  26. //==============================================================
  27.  
  28. long era, i=1, x=5 , tim_1_0, tim_1_1, tim_1, tim_2_1, tim_2, tim_2_0;
  29. int timer_1_0=50, timer_1_1=0, timer_2_0=50, timer_2_1=0 ;
  30. //==============================================================
  31. //Változók dekralálás vége
  32. //==============================================================
  33. //megszakitások
  34. //==============================================================
  35. #int_TIMER0//timer0 időzítő megszakitó mprogramja
  36. void TIMER0_isr()
  37. {
  38. while (x==5)
  39. {
  40. timer_2_0= 100-timer_1_0;
  41. tim_1_0 = timer_1_0*i;
  42. tim_2_0 = timer_2_0*i;
  43. printf(lcd_putc,"\n%10.0w",tim_1_0);//kiíratás
  44. x++;
  45. }
  46. Output_high (pwm1);
  47. while(tim_2_0==tim_1_0)
  48. {
  49. x=5;
  50. return;
  51. }
  52. while(tim_1_0>0)
  53. {
  54. tim_1_0--;
  55. return;
  56. }
  57. while(tim_1_0==0)
  58. {
  59. Output_low (pwm1);
  60. while(tim_2_0>0)
  61. {
  62. tim_2_0-;
  63. return;
  64. }
  65. return;
  66. }
  67. }
  68.  
  69. //==============================================================
  70. //megszakitások vége
  71. //==============================================================
  72.  
  73. void main()
  74. {
  75. //==============================================================
  76. //Analóg digitál átalakító beállításai
  77. //==============================================================
  78. setup_comparator(NC_NC_NC_NC);
  79.         setup_adc(ADC_CLOCK_INTERNAL);
  80.         setup_adc_ports(sAN0);
  81. //==============================================================
  82. //Analóg digitál átalakító beállításainak vége
  83. //==============================================================
  84. //lcd ébresztés
  85. //==============================================================
  86.  
  87. delay_ms(2000);
  88. output_low (LCD_RW);//LCD_RW lehúzás testre
  89. delay_us(2);
  90. lcd_init();
  91. delay_us(20);
  92.  
  93.  printf(lcd_putc, "\fABCDEFGHIJKLMNOPQRST");
  94.  printf(lcd_putc, "\nabcdefghijklmnopqrst");
  95.  printf(lcd_putc, "\n12345678901234567890");
  96.  printf(lcd_putc, "\n!@#$^&*(){}[]:;<>?/=");
  97.  delay_ms(1000);
  98.  printf(lcd_putc, "\f");
  99. //==============================================================
  100. //lcd ébresztés vége
  101. //==============================================================
  102. //megszakitás beállítása
  103. //==============================================================
  104.  
  105. //timer0 megszakitás beállítása
  106. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);//Timer előosztó 1:256
  107. enable_interrupts(INT_TIMER0); //TMR0 megszakítás be
  108. enable_interrupts(GLOBAL); //GIE bekapcsol
  109.  
  110. //==============================================================
  111. //megszakitás beállításának vége
  112. //==============================================================
  113. //teszt
  114. //==============================================================
  115. x=5;
  116. i=1;
  117. tim_1_0=50;
  118. timer_1_0=50;
  119. tim_2_0=50;
  120. timer_2_0=50;
  121. //==============================================================
  122. //teszt vége
  123. //==============================================================
  124. //főpprogram innen indul
  125. //==============================================================
  126.  
  127. while(1)
  128. {
  129. printf(lcd_putc,"\ffő program futása be:");
  130. timer_1_0=50;
  131. timer_2_0= 100-timer_1_0;
  132. while(100>timer_1_0)
  133. {
  134. timer_1_0=timer_1_0+1;
  135. delay_ms(1);
  136. //printf(lcd_putc,"\n%10.0w",timer_1_0);//kiíratás
  137. }
  138.  
  139. }
  140.  
  141. //==============================================================
  142. //főpprogram vége
  143. //==============================================================
  144. }//end main


A fejlécbe a későbbi programbővitéshez szereppel ad meg még pár dolog. Köszönöm előre is a segitségetek
(#) vilmosd válasza brumibali hozzászólására (») Aug 13, 2012 / 1
 
Nem volt idom vegignezni mindent, de a TMR0 IT-ben nem ajanlatos "printf()" hivast kezdemenyezni, mert elegge elhuzza az idot. En hasznalok ilyen PWM-et de lassu (1 Hz) periodusidovel.
(#) brumibali válasza vilmosd hozzászólására (») Aug 13, 2012 /
 
Észrevettem, amikor megszakitás nélkül csináltam szoft pwm-et, de ha nem volt ott akkor is..
nagyon halványan villog a led.. és évi egyszer tér be adatér a printf-részbe.
(#) brumibali válasza brumibali hozzászólására (») Aug 15, 2012 /
 
Valakinek vmi ötlete?
köszönöm
(#) Hp41C válasza brumibali hozzászólására (») Aug 15, 2012 / 1
 
Szia!

A szomszéd topikban ott a megoldás 8 csatornára...
(#) baloka hozzászólása Aug 16, 2012 /
 
Sziasztok!
Az volna a kérdésem, a PICKit 2 vel hogy lehet titkosítani. Azaz, ne lehessen többé kiolvasni/módosítani a beégetett programot.
(#) Hp41C válasza baloka hozzászólására (») Aug 16, 2012 / 1
 
Szia!
A konfigurációs szóban - szavakban be kell állítani a kódvédelmi bitet - biteket. Ld. a kontroller adatlapja és programozási adatlapja.
(#) baloka hozzászólása Aug 16, 2012 /
 
Köszönöm! A hétvégén hazavágok pár PIC-et...
(#) gyerek67 válasza baloka hozzászólására (») Aug 16, 2012 /
 
Milyen megfontolásból?
Következő: »»   1087 / 1320
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