Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   88 / 118
(#) efiscp válasza mrcdcscc hozzászólására (») Júl 10, 2013 /
 
Na örülök, hogy megoldódott.

Az eszközökhöz tartozó header file-okban ezek a definíciók többnyire bitmaszkok. Ezért van az, hogy az argumentumban logikai OR-ral kell összefűzni, és úgy íródnak be valamelyik regiszterbe. Esetleg azt lehetne megnézni, hogy ezek jól vannak-e definiálva.

Ha nagyon nem megy, akkor is érdemesebb a #byte direktíva használata, amivel regisztert tudsz változóhoz rendelni. Ez valahogy így néz ki (help alapján):

  1. #byte status_reg=GETENV("SFR:STATUS")


Így el tudod kerülni az ASM használatát a C kódban. Ezek keverése inkább akkor ajánlott, ha a feladat összetettsége miatt ASM-ben nagyon durva lenne (pl. egy USB driver), viszont kellenek a programba olyan részek, ahol a gépi utasítás szintjén kell mozogni (pl. nagyon pontosan kell időzíteni, optimalizálási megfontolások, stb.).
A hozzászólás módosítva: Júl 10, 2013
(#) vilmosd hozzászólása Júl 10, 2013 /
 
En igy szoktam elintezni a regiszterek valrozokennt valo hasznalatat:
  1. #BYTE port_a = 5
  2. #BYTE port_b = 6
  3. #BYTE port_c = 7
  4. #BYTE port_d = 8
  5. #BYTE port_e = 9
  6. #BYTE intcon = 0x0B
  7. #BYTE option_r = 0x81
  8. #BYTE tris_a = 0x85
  9. #BYTE tris_b = 0x86
  10. #BYTE tris_c = 0x87
  11. #BYTE tris_d = 0x88
  12. #BYTE tris_e = 0x89
  13. #BIT  rec_s = port_a.4
  14. #BIT  rtccif = intcon.2
  15. #BIT  rtccie = intcon.5
  16. #BIT  rbpu = option_r.7
  17. #bit  T1=port_c.4
  18. #bit  T2=port_c.1
  19. #bit  z_led=port_b.4
  20. #bit  t_led=port_b.5
  21. #bit  f_led=port_b.6


Ez itt a hasznalat:
  1. rbpu=0;
  2. port_a=0;
  3.                 port_b=0;
  4.                 port_c=0;
  5.                 port_d=0;
  6.                 tris_b=0b00001111;
  7.                 tris_c=0b10100000;

Igy barmilyen regiszter barmilyen bitjet egyszeruen tudod irni, olvasni ASM betetek hasznalata nelkul, es meg a program hordozhatosaga is jobb.
(#) sysy válasza mrcdcscc hozzászólására (») Júl 10, 2013 / 1
 
Az interrupt-on-change titka a nevében is bent van. Szerintem azért nem válaszoltak a problémádra, mert azt hittük, hogy elolvastad a leírásban, hogyan kell használni.
Tehát:
Ha beüt a megszakítás, akkor be KELL olvasni a portot, hogy a belső tárolóban elmentésre kerüljön az állapota. És ehhez képest, ha megváltozik, akkor hívja megint a megszakítást.
Ez így prímán működik a CCS-ben.
(#) mrcdcscc válasza vilmosd hozzászólására (») Júl 10, 2013 /
 
De ezzel a #byte direktívával nem csak az első 256 regiszterhez (azaz a BANK0-ban levő regiszterekhez) tudok nevet rendelni?
(#) mrcdcscc válasza sysy hozzászólására (») Júl 10, 2013 /
 
Kedves sysy!

Köszönöm válaszodat! Viszont nem értem. A beolvasás alatt input_a() utasítást értesz? És ilynkor a port milyen belső tárolóban mentődik el?
(#) sysy válasza mrcdcscc hozzászólására (») Júl 10, 2013 /
 
Ez bele van építve a PIC port áramköreibe. Minden porthoz van egy D tároló. Abba írogatja bele az állapotát a portnak beolvasáskor. Semmi teendőd vele, csak olvass egyet a portról.
input_a(); ahogy írtad.
A hozzászólás módosítva: Júl 10, 2013
(#) sysy válasza mrcdcscc hozzászólására (») Júl 10, 2013 /
 
Minden regiszterhez használhatod a #byte direktívát. Én a regisztereknek a címeit is szoktam használni. Például:

#byte PORTA 0xF80
#byte LATA 0xF89
#byte INTCON 0xFF2

és így tovább...
(#) mrcdcscc válasza sysy hozzászólására (») Júl 12, 2013 /
 
Kedves sysy!

Csak most volt időm tovább foglalkozni a dologgal. Beolvastam a PORTA-t még a main-ben is, meg az interruptban is, de nem működik. Bele sem megy az interruptba.
A program bekapcsoláskor 1 másodpercre felkapcsolja a PORTC-n levő 8 LED-et, majd lekapcsolja. Ezt követően a PORTA2-re kötött optokapcsoló kikapcsolásával a PORTA2 magasra egy, meg kellene hívódnia az interruptnak, ami a PORTC-n levő LED-ek felét kapcsolgatja tesztelés céljából, de nem kapcsolódnak fel, azaz be sem lép az interruptba. Pedig a chip PORTA2-es lábán mérem is az alacsony és magas jelszintet.
Mi hiányzik még a programból?

  1. #include <16F1829.h>
  2. #fuses INTRC_IO, NOLVP, NOWDT, NOPROTECT,NOMCLR
  3. #use delay(clock=4000000)
  4.  
  5. int gomb = 0;
  6.  
  7. #INT_RA
  8. void interrupt_kezeles(void)
  9. {
  10.       input_a();
  11.       if (gomb==1) //egyik felfutó élre
  12.          {
  13.             gomb=0;
  14.              output_c(0xf0);
  15.          }
  16.          else //másik felfutó élre
  17.          {
  18.             gomb=1;
  19.             output_c(0x0f);
  20.            
  21.          }
  22.        
  23.        delay_ms(10);
  24.       CLEAR_INTERRUPT(INT_RA);
  25. }
  26.  
  27.  
  28.    
  29. void main(void)
  30. {
  31.    gomb=1;
  32.    output_c(0xff);
  33.    delay_ms(1000);
  34.    output_c(0x00);
  35.  
  36.    ENABLE_INTERRUPTS(INT_RA2_L2H);
  37.    ENABLE_INTERRUPTS(GLOBAL);
  38.    input_a();
  39.    int seged1, seged2;
  40.    while (TRUE)
  41.     {
  42.           seged1=0;
  43.           seged2=0;
  44.           seged1=0;
  45.           seged2=0;
  46.           seged1=0;
  47.           seged2=0;
  48.      }  
  49. }
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 12, 2013 /
 
Szia!
Proteus-ban szimulálva a programodat úgy működik ahogy írod, hogy működnie kellene.
Ha igaz a szimuláció, akkor a PORTA2 lábon nem érzékeli az átmenetet (Én kapcsolót tettem rá). Sajnos nem ismerem a CCS-t, de megpróbálhatnád a PORTA2 állapotát jelezni az egyik LED-el a while ciklusban.
(#) sysy válasza mrcdcscc hozzászólására (») Júl 12, 2013 /
 
Nem tudom, hogy Sasmadárnak hogyan működött a program, de a gomb bemenet nincs definiálva sehol. Nem változóként kellett volna definiálni, hanem hozzáre
  1.  
ndelni egy porthoz (RA.2)Itt van egy kis szösszenet, amit az MPLAB szimulátorában futtattam és ez szerint jól működött.

  1. #include <16F1829.h>
  2. #fuses INTRC_IO, NOLVP, NOWDT, NOPROTECT,NOMCLR
  3. #use delay(int=4000000)
  4.  
  5. #case
  6. /********************************************************************/
  7.  
  8. #byte   PORTA   =        0x00C             // gomb port
  9. #byte       LATC     =  0x10E             // LED port
  10.  
  11. #byte       LED      =  LATC
  12.  
  13. #bit                    gomb       =    PORTA.2           // optocsatoló bemenet
  14.  
  15. /********************************************************************/
  16.  
  17. //int gomb = 0;
  18.  
  19. /********************************************************************/
  20.  
  21. #INT_RA
  22. void interrupt_kezeles(void)
  23. {
  24.  
  25. //   input_a();
  26.    LED^=0xFF;                                                                 // minden felfutó élre mintát váltanak a LED-ek
  27.    clear_interrupt(INT_RA2_L2H);
  28. }
  29.  
  30. /********************************************************************/
  31.    
  32. void main(void)
  33. {
  34. int seged1, seged2;
  35.  
  36.    setup_oscillator(OSC_4MHZ);
  37.    setup_adc_ports(NO_ANALOGS);
  38.    output_c(0xff);
  39.    delay_ms(1000);
  40.    output_c(0x00);
  41.    set_tris_a(0x00000100);                // PORTA.2 bemenet (gomb)
  42.    enable_interrupts(INT_RA2_L2H);
  43.    enable_interrupts(GLOBAL);
  44.    output_c(0xF0);                        // LED bitmintát beállítani
  45.    input_a();
  46.  
  47.    while (TRUE)
  48.     {
  49.           seged1=0;
  50.           seged2=0;
  51.           seged1=0;
  52.           seged2=0;
  53.           seged1=0;
  54.           seged2=0;
  55.      }
  56. }
(#) Sasmadár válasza sysy hozzászólására (») Júl 12, 2013 /
 
Szia!
Ha jól látom gomb változó csak flag-ként van használva nem bemenetként. Ahogy írtam Proteus-ban működik.
Nincs ilyen processzorom, így valóságban nem tudtam próbálni.
(#) mrcdcscc válasza sysy hozzászólására (») Júl 12, 2013 /
 
Kedves sysy és Sasmadár!

Köszönöm, hogy foglalkoztok a problémámmal. Én sem ülök a babérjaimon, hanem próbálom kideríteni a hiba okát. A Bővebben: Link hozzászólásomban levő kis tesztprogramnak megnéztem a CCS C v4.114-ben történő fordításakor kapott lst file-ját:

  1. CCS PCM C Compiler, Version 4.114, 93460303               12-júl.-13 20:48
  2.  
  3.                Filename: D:\mikrovezerlok\levilagito\25_PIC16F1829_proba\25_PIC16F1829_proba.lst
  4.  
  5.                ROM used: 141 words (2%)
  6.                          Largest free fragment is 2048
  7.                RAM used: 14 (3%) at main() level
  8.                          27 (5%) worst case
  9.                Stack:    3 worst case (1 in main + 2 for interrupts)
  10.  
  11. *
  12. 0000:  MOVLP  00
  13. 0001:  GOTO   051
  14. 0002:  NOP
  15. *
  16. 0004:  CLRF   03
  17. 0005:  CLRF   0A
  18. 0006:  MOVLB  00
  19. 0007:  MOVF   77,W
  20. 0008:  MOVWF  20
  21. 0009:  MOVF   78,W
  22. 000A:  MOVWF  21
  23. 000B:  MOVF   79,W
  24. 000C:  MOVWF  22
  25. 000D:  MOVF   7A,W
  26. 000E:  MOVWF  23
  27. 000F:  BTFSS  0B.3
  28. 0010:  GOTO   013
  29. 0011:  BTFSC  0B.0
  30. 0012:  GOTO   01C
  31. 0013:  MOVF   20,W
  32. 0014:  MOVWF  77
  33. 0015:  MOVF   21,W
  34. 0016:  MOVWF  78
  35. 0017:  MOVF   22,W
  36. 0018:  MOVWF  79
  37. 0019:  MOVF   23,W
  38. 001A:  MOVWF  7A
  39. 001B:  RETFIE
  40. 001C:  MOVLP  00
  41. 001D:  GOTO   034
  42. .................... #include <16F1829.h>
  43. .................... //////// Standard Header file for the PIC16F1829 device ////////////////
  44. .................... #device PIC16F1829
  45. .................... #list
  46. ....................  
  47. .................... #fuses INTRC_IO, NOLVP, NOWDT, NOPROTECT,NOMCLR  
  48. .................... #use delay(clock=4000000)
  49. 001E:  MOVLW  20
  50. 001F:  MOVWF  05
  51. 0020:  MOVLW  0A
  52. 0021:  MOVWF  04
  53. 0022:  MOVF   00,W
  54. 0023:  BTFSC  03.2
  55. 0024:  GOTO   033
  56. 0025:  MOVLW  01
  57. 0026:  MOVWF  78
  58. 0027:  CLRF   77
  59. 0028:  DECFSZ 77,F
  60. 0029:  GOTO   028
  61. 002A:  DECFSZ 78,F
  62. 002B:  GOTO   027
  63. 002C:  MOVLW  4A
  64. 002D:  MOVWF  77
  65. 002E:  DECFSZ 77,F
  66. 002F:  GOTO   02E
  67. 0030:  GOTO   031
  68. 0031:  DECFSZ 00,F
  69. 0032:  GOTO   025
  70. 0033:  RETURN
  71. ....................  
  72. .................... int gomb = 0;
  73. ....................  
  74. .................... #INT_RA
  75. .................... void interrupt_kezeles(void)
  76. .................... {
  77. ....................       input_a();
  78. 0034:  MOVLW  FF
  79. 0035:  MOVLB  01
  80. 0036:  MOVWF  0C
  81. ....................       if (gomb==1) //egyik felfutó élre
  82. 0037:  MOVLB  00
  83. 0038:  DECFSZ 25,W
  84. 0039:  GOTO   042
  85. ....................          {
  86. ....................             gomb=0;  
  87. 003A:  CLRF   25
  88. ....................              output_c(0xf0);
  89. 003B:  MOVLB  01
  90. 003C:  CLRF   0E
  91. 003D:  MOVLW  F0
  92. 003E:  MOVLB  02
  93. 003F:  MOVWF  0E
  94. ....................          }
  95. ....................          else //másik felfutó élre
  96. 0040:  GOTO   049
  97. 0041:  MOVLB  00
  98. ....................          {
  99. ....................             gomb=1;  
  100. 0042:  MOVLW  01
  101. 0043:  MOVWF  25
  102. ....................             output_c(0x0f);
  103. 0044:  MOVLB  01
  104. 0045:  CLRF   0E
  105. 0046:  MOVLW  0F
  106. 0047:  MOVLB  02
  107. 0048:  MOVWF  0E
  108. ....................            
  109. ....................          }
  110. ....................          
  111. ....................        delay_ms(10);  
  112. 0049:  MOVLW  0A
  113. 004A:  MOVLB  00
  114. 004B:  MOVWF  2A
  115. 004C:  CALL   01E
  116. ....................       CLEAR_INTERRUPT(INT_RA);
  117. 004D:  BCF    0B.0
  118. .................... }
  119. ....................  
  120. ....................  
  121. ....................    
  122. 004E:  BCF    0B.0
  123. 004F:  MOVLP  00
  124. 0050:  GOTO   013
  125. .................... void main(void)  
  126. .................... {
  127. 0051:  CLRF   05
  128. 0052:  CLRF   04
  129. 0053:  MOVLW  1F
  130. 0054:  ANDWF  03,F
  131. 0055:  MOVLW  6C
  132. 0056:  MOVLB  01
  133. 0057:  MOVWF  19
  134. 0058:  MOVLB  00
  135. 0059:  CLRF   25
  136. 005A:  MOVLB  03
  137. 005B:  CLRF   0C
  138. 005C:  CLRF   0E
  139. 005D:  MOVLB  02
  140. 005E:  CLRF   12
  141. 005F:  CLRF   11
  142. 0060:  CLRF   14
  143. 0061:  CLRF   13
  144. ....................    int seged1, seged2;
  145. ....................    gomb=1;
  146. 0062:  MOVLW  01
  147. 0063:  MOVLB  00
  148. 0064:  MOVWF  25
  149. ....................    output_c(0xff);
  150. 0065:  MOVLB  01
  151. 0066:  CLRF   0E
  152. 0067:  MOVLW  FF
  153. 0068:  MOVLB  02
  154. 0069:  MOVWF  0E
  155. ....................    delay_ms(1000);
  156. 006A:  MOVLW  04
  157. 006B:  MOVLB  00
  158. 006C:  MOVWF  28
  159. 006D:  CLRF   24
  160. 006E:  BTFSC  0B.7
  161. 006F:  BSF    24.7
  162. 0070:  BCF    0B.7
  163. 0071:  MOVLW  FA
  164. 0072:  MOVWF  2A
  165. 0073:  CALL   01E
  166. 0074:  BTFSC  24.7
  167. 0075:  BSF    0B.7
  168. 0076:  DECFSZ 28,F
  169. 0077:  GOTO   06D
  170. ....................    output_c(0x00);
  171. 0078:  MOVLB  01
  172. 0079:  CLRF   0E
  173. 007A:  MOVLB  02
  174. 007B:  CLRF   0E
  175. ....................    
  176. ....................    ENABLE_INTERRUPTS(INT_RA2_L2H);
  177. 007C:  BSF    0B.3
  178. 007D:  MOVLB  07
  179. 007E:  BSF    14.2
  180. 007F:  BCF    15.2
  181. ....................    ENABLE_INTERRUPTS(GLOBAL);
  182. 0080:  MOVLW  C0
  183. 0081:  IORWF  0B,F
  184. ....................    input_a();  
  185. 0082:  MOVLW  FF
  186. 0083:  MOVLB  01
  187. 0084:  MOVWF  0C
  188. ....................  
  189. ....................    while (TRUE)
  190. ....................     {
  191. ....................           seged1=0;
  192. 0085:  MOVLB  00
  193. 0086:  CLRF   26
  194. ....................           seged2=0;
  195. 0087:  CLRF   27
  196. ....................           seged1=0;
  197. 0088:  CLRF   26
  198. ....................           seged2=0;
  199. 0089:  CLRF   27
  200. ....................           seged1=0;
  201. 008A:  CLRF   26
  202. ....................           seged2=0;
  203. 008B:  CLRF   27
  204. ....................      }  
  205. 008C:  GOTO   086
  206. .................... }
  207. ....................  
  208. ....................  
  209. ....................  
  210. 008D:  SLEEP
  211.  
  212. Configuration Fuses:
  213.    Word  1: 3F84   INTRC_IO NOWDT PUT NOMCLR NOPROTECT NOCPD BROWNOUT NOCLKOUT IESO FCMEN
  214.    Word  2: 1EFF   NOWRT PLL_SW STVREN BORV19 NODEBUG NOLVP


Ebben a következő furcsaságokat találtam:
1. A 004D sorban BCF 0B.0 van írva a clear_interrupt(INT_RA) megfelelőjének, ami BCF INTCON.IOCIF-et jelent, azaz törli a IOCIF flag-et. Azonban a PIC16F1829 chip adatlapjában a 13.3 Interrupt Flags fejezetben írják, hogy "The IOCIF bit of the INTCON register reflects
the status of all IOCAFx and IOCBFx bits." Illetve a 13.4 Clearing Interrupt Flags fejezetben
"The individual status flags, (IOCAFx and IOCBFx bits),
can be cleared by resetting them to zero." Továbbá a 8.6.1 INTCON REGISTER fejezetben "Note 1: The IOCIF Flag bit is read-only and cleared when all the Interrupt-on-Change flags in the IOCxF register have been cleared by software." Azaz szerintem nem úgy kell törölni az IOC megszakítás flag-jét, hogy törlöm az INTCON regiszter IOCIF bit-jét, hanem az IOCAFx regisztereket törlöm.

2. A 007D program sorban: MOVLB 07 = Bank 7 kiválasztása
007E programsorban BSF 14.2 = BSF IOCBP.2 azaz a PORTB 2-es pinjének pozitív átmenetének a figyelése!!! Azaz nem a PORTA 2-es pinjének figyelését állította be, hanem a PORTB 2-es pinjének.

3. A 0080 és 0081-es sor voltaképp 1-re állítja az INTCON regiszter GIE és PEIE bitjét. Hogy a PEIE bit-et minek kell 1-re állítani, azt nem tudom. Amikor ezt a teszt programot Assembly-be írtam meg, nem állítottam a PEIE bit-et 1-re, mégis működött a program.

4. A gomb változót csak arra használom, hogy az interruptot lekezelő szubrutinban hol egyik, hol másik sort hajtassam végre, azaz hol az első 4, hol a második 4 LED-et kapcsoljam fel, hogy lássam mikor lép be az interrupt-ba. Csak éppen egyszer sem lép be.

5. Kipróbáltam sysy a kódodat, de az sem működik.

6. A CCS C programnak megvolt a v4.108 verziója, de az még nem ismerte a PIC16F1829-es chipet. A legfrissebb CCS, amihez hozzájutottam, és már ismerte ezt a chipet, az a v4.114. Valószínűnek tartom, hogy ebben jelenhetett ez a chip meg először, és nem jól csinálták meg. Lehet a CCS C v5-össel már jól menne, de az sajnos nincs meg nekem.
A hozzászólás módosítva: Júl 12, 2013
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 12, 2013 /
 
Szia!
Én 5.09-el fordítottam. A project-et úgy állítottam be, hogy nincs analóg bemenet használva.
Ha Te nem állítottad be, akkor POTRA2 analóg bemenet reset után. ANSELA regiszter ANSA2
bit-et állítsd nullára, hogy digitális bemenet legyen.

Bocs! Közben látom, hogy az általad fordított lista is törli ANSELA-t. Mellékelem az Én hex.-emet, ha van kedved próbáld ki, hogy a valóságban működik-e?
A hozzászólás módosítva: Júl 12, 2013

main.hex
    
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 12, 2013 /
 
Megnéztem nálam jó regiszterekkel fordított:
  1. ....................        ENABLE_INTERRUPTS(INT_RA2_L2H);
  2. 0075:  BSF    0B.3
  3. 0076:  MOVLB  07
  4. 0077:  BSF    11.2
  5. 0078:  BCF    12.2
(#) mrcdcscc válasza Sasmadár hozzászólására (») Júl 13, 2013 /
 
Kipróbáltam a hex file-t. Azt csinálja, hogy kb 5 másodpercig világít az összes lámpa. Majd kialszik. Ezután ha az optokapcsolót kikapcsolom (és ekkor a PORTA,2-re magas jel jut), akkor elkezd váltakozva hol az első 4, hol a második 4 LED lámpa világítani. Azaz szerintem mostmár bement az interruptba, csak valószínűleg most is úgy akarta törölni az IOC flag-et, hogy az INTCON-ban törli a 0-s IOCIF bit-et, ami viszont nem törölhető, csak olvasható. És a chip meg folyamatosan azt látja emiatt, hogy megint van egy megszakítás (mivel a vlóságban az IOCIF bit éréke 1 maradt), és újra bemegy a megszakítást lekezelő interrupt-ba, és átváltja az egyik 4 LED világítását a másik 4 LED világítására. Érdekes, hogy még az 5.09-ben sem tudták ezt az IOC-t normálisan megcsinálni.

Feltöltenéd az lst file-t is? Megnézném benne, hogy hogy törli az interrupt flag-et a megszakítás szubrutinjában.
A hozzászólás módosítva: Júl 13, 2013
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 13, 2013 /
 
Mellékelem. Valóban törli INTCON-IOCIF-et még mindig. IOCAF.IOCAF2 bit-et viszont a programból kell törölni és ha IOCAF és IOCBF minden bitje 0, akkor törlődik INTCON.IOCIF.
Érdekes, hogy a szimulátorban csak a felfutó élekre váltanak a LED-ek.

main.lst
    
(#) mrcdcscc válasza Sasmadár hozzászólására (») Júl 13, 2013 /
 
Beírnál a program elejére egy #byte IOCAF = 0x393 sort, a megszakítást lekezelő szubrutin végére pedig egy IOCAF = 0x00 sort? És akkor ezzel szoftveresen törölnénk a megszakítás flag-et, és akkor szerintem már nem villognának felváltva a 4-4 LED. Ugyanis szerintem most is csak a felfutó élre vált a LED, csak mivel a megszakítást jelző flag nem lett törölve, így ahogy kijön a megszakítást lekezelő szubrutinból a program futás, már megy is vissza, mert azt hiszi, egy újabb felfutó él jött.

És akkor leellenőrizném a futását a chip-en élőben.
Szerintem ezzel meg is lesz oldva a dolog.

Illetve ha van 5.09-es CCS-ed, elküldenéd az ebben levő 16F1829.h header filet (valahol a Program Files\PICC\Devices könyvtárban vannak)? Meg szeretném nézni, hogy abban már benne van-e a PORTB-re vonatkozó IOC is. Ugyanis a v4.114-ben a header fileban csak a PORTA-ra vonatkozó IOC van benne, a chip adatlapja alapján (illetve Assembly-ben meg is csináltam) a PORTB-n is van IOC megszakítás.
A hozzászólás módosítva: Júl 13, 2013
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 13, 2013 /
 
Módosítottam. IOCAF törlését az adatlap szerinti metódussal érdemes csinálni, hogy ha esetleg közben történt még I/O esemény az ne vesszen el lekezeletlenül.
A hozzászólás módosítva: Júl 13, 2013

main.hex
    
(#) mrcdcscc válasza Sasmadár hozzászólására (») Júl 13, 2013 /
 
Köszi, ezt már csak holnap próbálom ki, mert már elraktam a próbapanelt meg programozót. Jó éjt.
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 13, 2013 /
 
Csatolom a header-t. Jó éjt.
A hozzászólás módosítva: Júl 13, 2013

16LF1829.h
    
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 13, 2013 /
 
Így törli IOCAF.IOCAF2-t is:
Idézet:
„.................... CLEAR_INTERRUPT(INT_RA2_L2H);
004D: MOVLB 07
004E: BCF 13.2
004F: BCF 0B.0
(#) sysy válasza Sasmadár hozzászólására (») Júl 13, 2013 /
 
Csak érdekességképpen jegyzem meg, hogy a PORTA.2 láb mellesleg az ext_int lába is a PIC-nek. Ezt használva és nem IOC-ként kezelve, nem kell játszadozni a bitekkel, mert ezt korrektül kezeli a CCS.
(#) mrcdcscc válasza Sasmadár hozzászólására (») Júl 14, 2013 /
 
Kedves Sasmadár!

Az általad a v5.09-el fordított program tökéletesen működik. Csak felfutó élre megy bele az iterruptba.

A v5.09-es CCS verzióból csatolt 16F1829.h header file-ban pedig már látom, hogy a PORTB IOC-je is benne van, nem csak a PORTA-é, mint nekem a v4.114 verzióban.

Bárcsak nekem is v5.09-es verzióm lenne, és nem vesztegettem volna el 2 hetet ezzel az IOC-vel a rossz működés miatt. Annak ellenére, hogy tudjuk, hogy a v5.09-ben már jól működik ez a 16F1829 chip esetén, ennek ellenére nekem ASM-ben kell ezt megírnom a v4.114-es CCS-emen belül, mert ráadásul nekem a PORTB-n kell ez a IOC funkció.

Azt még kipróbálhatnánk, hogy a v5.09 verzión belül kell-e az interruptban a PORT olvasása. Mert a 16F1829-es adatlapjában az IOC fejezetben én ezt nem olvastam, hogy "be KELL olvasni a portot, hogy a belső tárolóban elmentésre kerüljön az állapota. És ehhez képest, ha megváltozik, akkor hívja megint a megszakítást." Azaz ki kellene úgy is próbálni, hogy az interruptnál meghívott szubrutin elejéről ki kellene törölni az input_a() sort.
(#) mrcdcscc válasza sysy hozzászólására (») Júl 14, 2013 /
 
Kedves sysy.

Ez igaz, de nekem 2 db PORTB lábon kell IOC funkció majd.

Le is írom, hogy mihez csinálom ezt az egészet. Egy majdan saját használatú nyák levilágító berendezés vezérlését tervezem. A mikrovezérlő a következőképpen fog működni:
Egy egérből kiszedtem a görgetőgomb és az alatt levő nyomógomb részt (a görgetővel együtt az ott levő Infraled-et és annak jelét vevő fototranzisztort, ami ráadásul olyan kivitelű, hogy kettő az egyben, mivel kettő kell ahhoz, hogy az egérgomb forgatásának irányát is meg lehessen határozni). Namost ha benyomkodom a gombot, azzal kiválaszthatom, hogy a levilágítás időtartamát, vagy a melegítés időtartamát, vagy a melegítés hőmérsékletét akarom beállítani. Ezek közül amelyik ki van választva, annak az időtartamát meg a görgő görgetésével tudom beállítani. Lesz még egy nyomógomb, aminek megnyomásával a levilágítás vagy a melegítés indítható.
A levilágítás alatt azt értem, hogy a fóliára kinyomtatott áramkört ráteszem a lakkal befújt nyáklapra, és UV lámpával világítom a beállított ideig.
A melegítés alatt pedig azt értem, hogy a lakkal befújt nyáklapot valamilyen hőforrással (még nem tudom mi lenne a legalkalmasabb erre a célra) melegítem, hogy a lakk minél hamarabb megszáradjon a nyáklapon.
Ez egy ládaszerű berendezés volna, aminek a lehajtható tető részében lenne a melegítő rész, az alja felén meg a levilágító UV csövek.
Mert jelenleg filctollal rajzolom az áramkört a nyákra, és maratom le utána vas-kloriddal a felesleges rezet. És ez a filctollas áramkör átrajzolás meglehetősen időigényes.
A berendezésen a kapcsolattartást egy LCD kijelző biztosítja (8bites üzemmódra terveztem meg a nyákot, aztán jutott eszembe, hogy 4bittel is lehet vezérelni). Kell még 2 pin az LCD enable és utasítás/adat pinjéhez. Kell 1-1 pin a funkció választó nyomógombnak illetve a start gombnak, ami a levilágítást vagy a melegítést indítja. Kell 2 pin a görgőnek. Kell 2 pin az Uv csöveket illetve a melegítő egység reléjét kapcsoló tranzisztornak, valamint 1 pin a hőmérséklet mérő szenzornak (a DS1820 hőmérséklet szenzorral 1 pinen is lehet kommunikálni). És ekkor 17 pin-nél járunk. Kell még 1-1 pin a föld és a Vdd-nek. Így jött ki, hogy egy 20 pin-es chip kell.
Mondjuk első körben csak a levilágító részt fogom megépíteni, a melegítést majd megoldom manuálisan egy hajszárítóval kezdetben. Csak úgy akartam ezt az egészet megcsinálni, hogy alkalmas legyen melegítéses funkcióra is. A nyákra terveztem egy 4 pinen csatlakozási lehetőséget ICSP (áramkörön belüli programozás) célra, hogy ha esetleg módosítani kell a chip-en a programot, akkor azt is meg tudjam csinálni.
2 éve kezdtem tanulgatni ezt a mikrovezérlős dolgot, mert érdekelt, egyébként gépészmérnök vagyok, és nagyon élvezem ezt a dolgot. Hála istennek itt van ez az internet is, ahol csomó tudást össze lehet szedni, köszönhetően azon önzetlen embereknek, akik ilyen kis bevezető leírásokat, jegyzeteket készítenek, illetve akik pl. ilyen fórumokon is segítenek azoknak, akik megakadtak valamiben. Kár, hogy nem fiatalabb koromban találták ki ezt az internetet.
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 14, 2013 /
 
Szia!
Kivettem a port olvasást csatolom a hex-et. Proteus-ban működik így is.

main.hex
    
(#) mrcdcscc válasza mrcdcscc hozzászólására (») Júl 14, 2013 /
 
Egy kis kiegészítés az előző hozzászólásomhoz. Először meghatároztam, hogy milyen chip kell a feladathoz, és meg is vettem. Aztán azért kell a PORTB-s IOC, mert előre ittam a medve bőrére, és mivel láttam a 16F1829 adatlapján, hogy a PORTB-n is van IOC, én oda terveztem azokat a dolgokat, amihez az IOC kell. És már le is gyártottam a nyákot, és ezután kezdtem neki a vezérlőprogram megírásához. Akkor szembesültem azzal, hogy a nekem meglevő CCS v4.086 nem is ismeri ezt a chip-et. Akkor ami frissebb verzióhoz "hozzájutottam", az a v4.114 volt. Ez már ismerte, bár azt a header file alapján rögtön furcsáltam, hogy miért csak a PORTA-s IOC-t ismeri. Mindenesetre elkeztem próbálkozni a PORTA-s IOC-vel, ami nem sikerült vele. Akkor írtam ASM-ben ilyen LED villogtatást az IOC tesztelésére, és az működött mind a PORTA, mind PORTB esetén. Azaz a chip az jó. Úgyhogy tovább próbálkoztam a CCS-el PORTA-s IOC-t csinálni, hátha csak én rontottam el valamit, és jártam ezt a fenti kanosszajárást.

Mindenesetre most ma hozzájutottam az 5-ös CCS-hez köszönhetően Nektek. Úgyhogy mostmár menni fog egyszerűen a dolog. Köszönöm segítségeteket.
A hozzászólás módosítva: Júl 14, 2013
(#) mrcdcscc válasza Sasmadár hozzászólására (») Júl 14, 2013 /
 
Kedves Sasmadár!

Kipróbáltam, és ahogy sejtettem, így is tökéletesen működik élőben is. Csak a felfutó élre indul az interrupt, és csak egyszer fut le egy felfutó élre.
(#) mrcdcscc válasza mrcdcscc hozzászólására (») Júl 14, 2013 /
 
Viszont most hogy már nekem is van CCS 5, kipróbáltam az IOC funkciót PORTB 4-es pinjére, aztán a 7-es pinjére is, de itt már a lefutó élnél is belemegy a megszakítást lekezelő ciklusba. Megírtam a teljes programot MPLAB-ban assembly-ben, és annál is úgy működött, hogy a lefutó élre is belement a megszakításba. Ez viszont már valami CHIP probléma lehet.
(#) Sasmadár válasza mrcdcscc hozzászólására (») Júl 14, 2013 /
 
Errata nem ír ilyen hibáról. Proteus-ban működik átírva PORTB4-re és PORTB7-re.
(#) sysy válasza mrcdcscc hozzászólására (») Júl 15, 2013 /
 
Nem valószínű, hogy chip probléma lenne (bár semmit sem szabad kizárni).
Menni kell annak.
Következő: »»   88 / 118
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