Vai al contenuto
PLC Forum


ripetere il ciclo una sola volta pic 16f629


vergalabs

Messaggi consigliati


Così dice poco perchè alla locazione 3FC potrebbe non andarci mai, vista la serie di goto.

Bisogna vedere la lista delle riche "C" con espasione ASM, verifica che non ci sia un'opzione da settare nel compilatore.

Inoltre bisogna vedere a cosa si riferiscono quelle istruzioni, visto che il locatore le ha poste verso la fine della memoria.

Link al commento
Condividi su altri siti

Il programma al simulatore funziona come previsto. Quando i è uguale a 5  salta a 0x3fc e poi 0x0.

Al reset c'è un salto alla locazione 0x3fe e da qui a 0x3b6 (come si vede nel disassemblato) dove inizia il main.

Purtroppo il masm listing non riporta il codice C.

 

   166     03B6                     _main:	
   167                           ;psect for function _main
   168                           
   169     03B6                     l626:	
   170                           ;incstack = 0
   171                           ; Regs used in _main: [wreg+status,2+status,0+btemp+1]
   172                           
   173     03B6  1683               	bsf	3,5	;RP0=1, select bank1
   174     03B7  0185               	clrf	5	;volatile
   175     03B8  1283               	bcf	3,5	;RP0=0, select bank0
   176     03B9  0185               	clrf	5	;volatile
   177     03BA  01A2               	clrf	main@i
   178     03BB  01A3               	clrf	main@i+1
   179     03BC  2BEF               	goto	l640
   180     03BD                     l628:
   181     03BD  3021               	movlw	33
   182     03BE  1283               	bcf	3,5	;RP0=0, select bank0
   183     03BF  00A1               	movwf	??_main+1
   184     03C0  3076               	movlw	118
   185     03C1  00A0               	movwf	??_main
   186     03C2                     u37:
   187     03C2  0BA0               	decfsz	??_main,f
   188     03C3  2BC2               	goto	u37
   189     03C4  0BA1               	decfsz	??_main+1,f
   190     03C5  2BC2               	goto	u37
   191     03C6  0000               	nop
   192     03C7                     l630:
   193     03C7  1283               	bcf	3,5	;RP0=0, select bank0
   194     03C8  1405               	bsf	5,0	;volatile
   195     03C9  3007               	movlw	7
   196     03CA  00A1               	movwf	??_main+1
   197     03CB  307D               	movlw	125
   198     03CC  00A0               	movwf	??_main
   199     03CD                     u47:
   200     03CD  0BA0               	decfsz	??_main,f
   201     03CE  2BCD               	goto	u47
   202     03CF  0BA1               	decfsz	??_main+1,f
   203     03D0  2BCD               	goto	u47
   204     03D1                     l632:
   205     03D1  1283               	bcf	3,5	;RP0=0, select bank0
   206     03D2  1005               	bcf	5,0	;volatile
   207     03D3  3007               	movlw	7
   208     03D4  00A1               	movwf	??_main+1
   209     03D5  307D               	movlw	125
   210     03D6  00A0               	movwf	??_main
   211     03D7                     u57:
   212     03D7  0BA0               	decfsz	??_main,f
   213     03D8  2BD7               	goto	u57
   214     03D9  0BA1               	decfsz	??_main+1,f
   215     03DA  2BD7               	goto	u57
   216     03DB                     l634:
   217     03DB  1283               	bcf	3,5	;RP0=0, select bank0
   218     03DC  1485               	bsf	5,1	;volatile
   219     03DD  3007               	movlw	7
   220     03DE  00A1               	movwf	??_main+1
   221     03DF  307D               	movlw	125
   222     03E0  00A0               	movwf	??_main
   223     03E1                     u67:
   224     03E1  0BA0               	decfsz	??_main,f
   225     03E2  2BE1               	goto	u67
   226     03E3  0BA1               	decfsz	??_main+1,f
   227     03E4  2BE1               	goto	u67
   228     03E5                     l636:
   229     03E5  1283               	bcf	3,5	;RP0=0, select bank0
   230     03E6  1085               	bcf	5,1	;volatile
   231     03E7                     l638:
   232     03E7  0822               	movf	main@i,w
   233     03E8  3E01               	addlw	1
   234     03E9  00A2               	movwf	main@i
   235     03EA  0823               	movf	main@i+1,w
   236     03EB  1803               	skipnc
   237     03EC  3E01               	addlw	1
   238     03ED  3E00               	addlw	0
   239     03EE  00A3               	movwf	main@i+1
   240     03EF                     l640:
   241     03EF  0823               	movf	main@i+1,w
   242     03F0  3A80               	xorlw	128
   243     03F1  00DF               	movwf	btemp+1
   244     03F2  3080               	movlw	128
   245     03F3  025F               	subwf	btemp+1,w
   246     03F4  1D03               	skipz
   247     03F5  2BF8               	goto	u25
   248     03F6  3005               	movlw	5
   249     03F7  0222               	subwf	main@i,w
   250     03F8                     u25:
   251     03F8  1C03               	skipc
   252     03F9  2BFB               	goto	u21
   253     03FA  2BFC               	goto	u20
   254     03FB                     u21:
   255     03FB  2BBD               	goto	l628
   256     03FC                     u20:
   257     03FC                     l18:
   258     03FC  2800               	ljmp	start
   259     03FD                     __end_of_main:
   260     005E                     btemp	set	94	;btemp
   261     005E                     wtemp0	set	94

 

Comunque anche in un programmino con solo un paio di assegnamenti alla fine si trova un goto 0x0 secco.

Ciao.

 

 

 

 

 

Link al commento
Condividi su altri siti

Per curiosità provo a riesumare quache mio vecchio programma e verifico.

 

Da moderatore

giacomo56 ma tu e vergablas sieto lo stesso utente? Perchè vedo che ti sei accodato alla discussione aperta da vergablas e sembra una normale prosecuzione della discussione.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Io uso/usavo prevalentemente CCSC come compilatore.

Di seguito riporto il listato con espanso in asm di un programmino

 

.................... BYTE CONST LED_MAP[10] = {0x90,0xb7,0x19,0x15,0x36,0x54,0x50,0xb5,0,0x24};
....................
....................
.................... void wait() {           // This function waits for either ~2ms or until a
....................   int countdown;        // event happens (in this case a rs232 character)
....................
....................   countdown=200;
*
002A:  MOVLW  C8
002B:  MOVWF  25
....................   while((--countdown!=0)&&!kbhit())
....................     delay_us(10);
002C:  DECF   25,F
002D:  BTFSC  03.2
002E:  GOTO   037
002F:  BTFSC  0C.5
0030:  GOTO   037
0031:  MOVLW  10
0032:  MOVWF  77
0033:  DECFSZ 77,F
0034:  GOTO   033
0035:  NOP
0036:  GOTO   02C
.................... }
0037:  RETLW  00
....................
.................... void display_segs(char c) {
....................   if((c>'9')||(C<'0'))
*
0012:  MOVF   25,W
0013:  SUBLW  39
0014:  BTFSS  03.0
0015:  GOTO   01A
0016:  MOVF   25,W
0017:  SUBLW  2F
0018:  BTFSS  03.0
0019:  GOTO   020
....................     output_b(0xff);
001A:  BSF    03.5
001B:  CLRF   06
001C:  MOVLW  FF
001D:  BCF    03.5
001E:  MOVWF  06
....................   else
001F:  GOTO   029
....................     output_b(LED_MAP[c-'0']);
0020:  MOVLW  30
0021:  SUBWF  25,W
0022:  CALL   004
0023:  MOVWF  27
0024:  BSF    03.5
0025:  CLRF   06
0026:  BCF    03.5
0027:  MOVF   27,W
0028:  MOVWF  06
.................... } 
0029:  RETLW  00
....................
....................  
.................... void display( char one, char two) {
....................    display_segs(one);
*
0038:  MOVF   23,W
0039:  MOVWF  25
003A:  CALL   012
....................    output_high(PIN_A0);
003B:  BSF    03.5
003C:  BCF    05.0
003D:  BCF    03.5
003E:  BSF    05.0
....................    wait();
003F:  CALL   02A
....................    output_low(PIN_A0);
0040:  BSF    03.5
0041:  BCF    05.0
0042:  BCF    03.5
0043:  BCF    05.0
....................    display_segs(two);
0044:  MOVF   24,W
0045:  MOVWF  25
0046:  CALL   012
....................    output_high(PIN_A1);
0047:  BSF    03.5
0048:  BCF    05.1
0049:  BCF    03.5
004A:  BSF    05.1
....................    wait(); 
004B:  CALL   02A
....................    output_low(PIN_A1); 
004C:  BSF    03.5
004D:  BCF    05.1
004E:  BCF    03.5
004F:  BCF    05.1
.................... }
0050:  BCF    0A.3
0051:  BCF    0A.4
0052:  GOTO   072 (RETURN)
....................  
....................
.................... void main() {
0053:  CLRF   04
0054:  BCF    03.7
0055:  MOVLW  1F
0056:  ANDWF  03,F
0057:  MOVLW  81
0058:  BSF    03.5
0059:  MOVWF  19
005A:  MOVLW  A6
005B:  MOVWF  18
005C:  MOVLW  90
005D:  BCF    03.5
005E:  MOVWF  18
005F:  BSF    03.5
0060:  BSF    1F.0
0061:  BSF    1F.1
0062:  BSF    1F.2
0063:  BCF    1F.3
....................   char pos1, pos2;
....................
....................   set_tris_b(0);
0064:  MOVLW  00
0065:  MOVWF  06
....................   output_b(0);
0066:  CLRF   06
0067:  BCF    03.5
0068:  CLRF   06
....................
....................   pos1='0'; 
0069:  MOVLW  30
006A:  MOVWF  21
....................   pos2='1';
006B:  MOVLW  31
006C:  MOVWF  22
....................
....................   while(TRUE) {
....................     display(pos1,pos2);
006D:  MOVF   21,W
006E:  MOVWF  23
006F:  MOVF   22,W
0070:  MOVWF  24
0071:  GOTO   038
....................     if(kbhit()) {
0072:  BTFSS  0C.5
0073:  GOTO   07A
....................        pos1=pos2;
0074:  MOVF   22,W
0075:  MOVWF  21
....................        pos2=getc();
0076:  BTFSS  0C.5
0077:  GOTO   076
0078:  MOVF   1A,W
0079:  MOVWF  22
....................     }
....................   }
007A:  GOTO   06D
....................
.................... }
007B:  SLEEP

Configuration Fuses:
   Word  

 

Il main inizia alla locazione 0x53 a 0x6D inizia un ciclo di while infinito che termina a 0x7A. Se dovesse uscire dal ciclo infinito il processore viene messo in modo SLEEP, da cui esce o per rest o per un interrupt

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...