TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: alanmexb en 04 de Agosto de 2013, 12:30:35
-
estoy haciendo un trabajo de un voltimetro para la escuela pero no puedo convertirlo a .hex no se si alguien me pueda ayudar porque lo trate de convertir a asm y me queda un poco raro y el programa no me lo lee bien pero carge el programa en proteus con mi circuito simulado y me corre perfecto
asi en version c
#include <16F877A.h> // seleccionas el PIC a utilizar
#fuses XT //definimos un crystal externo
#device adc=8 // bits para el ADC 0-255
#use delay (clock=4M) // frecuencia del oscilador
#byte TRISB=0x86 // definimos los TRIB en la memoria
#byte PORTB=0x06 // definimos el PORTB en la memoria
float valor11; //coonstantes
int valor,valor1,digito1,digito2,digito3,digito4;
void main() {
TRISB=0x00; // toda el puerto B es salida
PORTB=0x00; // todo el puerto B estra en estado logico 0
setup_adc(ADC_CLOCK_INTERNAL); // seleccionamos el reloj para el ADC
setup_adc_ports(AN0); // puerto que seran AN0
for(;; ){
set_adc_channel(0); // que canal se utilizara, en este caso el canal 0
delay_us(10); // retardo necesario antes de hacer la lectura
valor= read_adc(); //leemos el dato del canal
valor1=valor*30.0/255.0; //15 una regla de 3 simple para trabajar con 30V
digito1=valor1/10; //15/10=1 obtenemos el primer digito
digito2=valor1 - digito1*10; //15-1*10=5 obtenemos el segundo digito
valor11=valor*30.0/255.0; // (15.30)*10=153.0
digito3=valor11*10 - valor1*10; //153.0 - 15*10=3.0
digito4=valor11*100 - valor1*100 - digito3*10;
// multiplexaccion del puerto B
PORTB=0b00010000 + digito1;
delay_ms(5);
PORTB=0b00100000 + digito2;
delay_ms(5);
PORTB=0b01000000 + digito3;
delay_ms(5);
PORTB=0b10000000 + digito4;
delay_ms(5);
}
}
y de esta forma es como me lo convierte en asm
CCS PCM C Compiler, Version 4.104, 5967 04-ago-13 09:31
Filename: C:\Users\PC\Desktop\microelectronica programable\lcdcc.lst
ROM used: 1129 words (14%)
Largest free fragment is 2048
RAM used: 19 (5%) at main() level
35 (10%) worst case
Stack: 1 locations
*
0000: MOVLW 03
0001: MOVWF 0A
0002: GOTO 311
0003: NOP
.................... #include <16F877A.h> // seleccionas el PIC a utilizar
.................... //////// Standard Header file for the PIC16F877A device ////////////////
.................... #device PIC16F877A
.................... #list
....................
.................... #fuses XT //definimos un crystal externo
.................... #device adc=8 // bits para el ADC 0-255
.................... #use delay (clock=4M) // frecuencia del oscilador
02FC: MOVLW 2A
02FD: MOVWF 04
02FE: BCF 03.7
02FF: MOVF 00,W
0300: BTFSC 03.2
0301: GOTO 310
0302: MOVLW 01
0303: MOVWF 78
0304: CLRF 77
0305: DECFSZ 77,F
0306: GOTO 305
0307: DECFSZ 78,F
0308: GOTO 304
0309: MOVLW 4A
030A: MOVWF 77
030B: DECFSZ 77,F
030C: GOTO 30B
030D: GOTO 30E
030E: DECFSZ 00,F
030F: GOTO 302
0310: RETURN
.................... #byte TRISB=0x86 // definimos los TRIB en la memoria
.................... #byte PORTB=0x06 // definimos el PORTB en la memoria
.................... float valor11; //coonstantes
.................... int valor,valor1,digito1,digito2,digito3,digito4;
.................... void main() {
0311: CLRF 04
0312: BCF 03.7
0313: MOVLW 1F
0314: ANDWF 03,F
0315: BSF 03.5
0316: BSF 1F.0
0317: BSF 1F.1
0318: BSF 1F.2
0319: BCF 1F.3
031A: MOVLW 07
031B: MOVWF 1C
.................... TRISB=0x00; // toda el puerto B es salida
031C: CLRF 06
.................... PORTB=0x00; // todo el puerto B estra en estado logico 0
031D: BCF 03.5
031E: CLRF 06
.................... setup_adc(ADC_CLOCK_INTERNAL); // seleccionamos el reloj para el ADC
031F: BSF 03.5
0320: BCF 1F.6
0321: BCF 03.5
0322: BSF 1F.6
0323: BSF 1F.7
0324: BSF 03.5
0325: BCF 1F.7
0326: BCF 03.5
0327: BSF 1F.0
.................... setup_adc_ports(AN0); // puerto que seran AN0
0328: BSF 03.5
0329: BCF 1F.0
032A: BSF 1F.1
032B: BSF 1F.2
032C: BSF 1F.3
....................
.................... for(;; ){
.................... set_adc_channel(0); // que canal se utilizara, en este caso el canal 0
032D: MOVLW 00
032E: MOVWF 78
032F: BCF 03.5
0330: MOVF 1F,W
0331: ANDLW C7
0332: IORWF 78,W
0333: MOVWF 1F
.................... delay_us(10); // retardo necesario antes de hacer la lectura
0334: MOVLW 03
0335: MOVWF 77
0336: DECFSZ 77,F
0337: GOTO 336
.................... valor= read_adc(); //leemos el dato del canal
0338: BSF 1F.2
0339: BTFSC 1F.2
033A: GOTO 339
033B: MOVF 1E,W
033C: MOVWF 24
.................... valor1=valor*30.0/255.0; //15 una regla de 3 simple para trabajar con 30V
033D: CLRF 2F
033E: MOVF 24,W
033F: MOVWF 2E
0340: CALL 004
0341: MOVF 7A,W
0342: MOVWF 2D
0343: MOVF 79,W
0344: MOVWF 2C
0345: MOVF 78,W
0346: MOVWF 2B
0347: MOVF 77,W
0348: MOVWF 2A
0349: CLRF 31
034A: CLRF 30
034B: MOVLW 70
034C: MOVWF 2F
034D: MOVLW 83
034E: MOVWF 2E
034F: CALL 021
0350: MOVF 77,W
0351: MOVWF 2A
0352: MOVF 78,W
0353: MOVWF 2B
0354: MOVF 79,W
0355: MOVWF 2C
0356: MOVF 7A,W
0357: MOVWF 2D
0358: MOVWF 31
0359: MOVF 79,W
035A: MOVWF 30
035B: MOVF 78,W
035C: MOVWF 2F
035D: MOVF 77,W
035E: MOVWF 2E
035F: CLRF 35
0360: CLRF 34
0361: MOVLW 7F
0362: MOVWF 33
0363: MOVLW 86
0364: MOVWF 32
0365: CALL 096
0366: MOVF 7A,W
0367: MOVWF 2D
0368: MOVF 79,W
0369: MOVWF 2C
036A: MOVF 78,W
036B: MOVWF 2B
036C: MOVF 77,W
036D: MOVWF 2A
036E: CALL 160
036F: MOVF 78,W
0370: MOVWF 25
.................... digito1=valor1/10; //15/10=1 obtenemos el primer digito
0371: MOVF 25,W
0372: MOVWF 2A
0373: MOVLW 0A
0374: MOVWF 2B
0375: GOTO 17F
0376: MOVF 78,W
0377: MOVWF 26
.................... digito2=valor1 - digito1*10; //15-1*10=5 obtenemos el segundo digito
0378: MOVF 26,W
0379: MOVWF 2E
037A: MOVLW 0A
037B: MOVWF 2F
037C: CALL 196
037D: MOVF 78,W
037E: SUBWF 25,W
037F: MOVWF 27
.................... valor11=valor*30.0/255.0; // (15.30)*10=153.0
0380: CLRF 2F
0381: MOVF 24,W
0382: MOVWF 2E
0383: CALL 004
0384: MOVF 7A,W
0385: MOVWF 2D
0386: MOVF 79,W
0387: MOVWF 2C
0388: MOVF 78,W
0389: MOVWF 2B
038A: MOVF 77,W
038B: MOVWF 2A
038C: CLRF 31
038D: CLRF 30
038E: MOVLW 70
038F: MOVWF 2F
0390: MOVLW 83
0391: MOVWF 2E
0392: CALL 021
0393: MOVF 77,W
0394: MOVWF 2A
0395: MOVF 78,W
0396: MOVWF 2B
0397: MOVF 79,W
0398: MOVWF 2C
0399: MOVF 7A,W
039A: MOVWF 2D
039B: MOVWF 31
039C: MOVF 79,W
039D: MOVWF 30
039E: MOVF 78,W
039F: MOVWF 2F
03A0: MOVF 77,W
03A1: MOVWF 2E
03A2: CLRF 35
03A3: CLRF 34
03A4: MOVLW 7F
03A5: MOVWF 33
03A6: MOVLW 86
03A7: MOVWF 32
03A8: CALL 096
03A9: MOVF 7A,W
03AA: MOVWF 23
03AB: MOVF 79,W
03AC: MOVWF 22
03AD: MOVF 78,W
03AE: MOVWF 21
03AF: MOVF 77,W
03B0: MOVWF 20
.................... digito3=valor11*10 - valor1*10; //153.0 - 15*10=3.0
03B1: MOVF 23,W
03B2: MOVWF 2D
03B3: MOVF 22,W
03B4: MOVWF 2C
03B5: MOVF 21,W
03B6: MOVWF 2B
03B7: MOVF 20,W
03B8: MOVWF 2A
03B9: CLRF 31
03BA: CLRF 30
03BB: MOVLW 20
03BC: MOVWF 2F
03BD: MOVLW 82
03BE: MOVWF 2E
03BF: CALL 021
03C0: MOVF 77,W
03C1: MOVWF 2A
03C2: MOVF 78,W
03C3: MOVWF 2B
03C4: MOVF 79,W
03C5: MOVWF 2C
03C6: MOVF 7A,W
03C7: MOVWF 2D
03C8: MOVF 25,W
03C9: MOVWF 2E
03CA: MOVLW 0A
03CB: MOVWF 2F
03CC: CALL 196
03CD: MOVF 78,W
03CE: CLRF 2F
03CF: MOVWF 2E
03D0: CALL 004
03D1: BSF 03.1
03D2: MOVF 2D,W
03D3: MOVWF 31
03D4: MOVF 2C,W
03D5: MOVWF 30
03D6: MOVF 2B,W
03D7: MOVWF 2F
03D8: MOVF 2A,W
03D9: MOVWF 2E
03DA: MOVF 7A,W
03DB: MOVWF 35
03DC: MOVF 79,W
03DD: MOVWF 34
03DE: MOVF 78,W
03DF: MOVWF 33
03E0: MOVF 77,W
03E1: MOVWF 32
03E2: CALL 1BB
03E3: MOVF 7A,W
03E4: MOVWF 2D
03E5: MOVF 79,W
03E6: MOVWF 2C
03E7: MOVF 78,W
03E8: MOVWF 2B
03E9: MOVF 77,W
03EA: MOVWF 2A
03EB: CALL 160
03EC: MOVF 78,W
03ED: MOVWF 28
.................... digito4=valor11*100 - valor1*100 - digito3*10;
03EE: MOVF 23,W
03EF: MOVWF 2D
03F0: MOVF 22,W
03F1: MOVWF 2C
03F2: MOVF 21,W
03F3: MOVWF 2B
03F4: MOVF 20,W
03F5: MOVWF 2A
03F6: CLRF 31
03F7: CLRF 30
03F8: MOVLW 48
03F9: MOVWF 2F
03FA: MOVLW 85
03FB: MOVWF 2E
03FC: CALL 021
03FD: MOVF 77,W
03FE: MOVWF 2A
03FF: MOVF 78,W
0400: MOVWF 2B
0401: MOVF 79,W
0402: MOVWF 2C
0403: MOVF 7A,W
0404: MOVWF 2D
0405: MOVF 25,W
0406: MOVWF 2E
0407: MOVLW 64
0408: MOVWF 2F
0409: CALL 196
040A: MOVF 78,W
040B: CLRF 2F
040C: MOVWF 2E
040D: CALL 004
040E: BSF 03.1
040F: MOVF 2D,W
0410: MOVWF 31
0411: MOVF 2C,W
0412: MOVWF 30
0413: MOVF 2B,W
0414: MOVWF 2F
0415: MOVF 2A,W
0416: MOVWF 2E
0417: MOVF 7A,W
0418: MOVWF 35
0419: MOVF 79,W
041A: MOVWF 34
041B: MOVF 78,W
041C: MOVWF 33
041D: MOVF 77,W
041E: MOVWF 32
041F: CALL 1BB
0420: MOVF 77,W
0421: MOVWF 2A
0422: MOVF 78,W
0423: MOVWF 2B
0424: MOVF 79,W
0425: MOVWF 2C
0426: MOVF 7A,W
0427: MOVWF 2D
0428: MOVF 28,W
0429: MOVWF 2E
042A: MOVLW 0A
042B: MOVWF 2F
042C: CALL 196
042D: MOVF 78,W
042E: CLRF 2F
042F: MOVWF 2E
0430: CALL 004
0431: BSF 03.1
0432: MOVF 2D,W
0433: MOVWF 31
0434: MOVF 2C,W
0435: MOVWF 30
0436: MOVF 2B,W
0437: MOVWF 2F
0438: MOVF 2A,W
0439: MOVWF 2E
043A: MOVF 7A,W
043B: MOVWF 35
043C: MOVF 79,W
043D: MOVWF 34
043E: MOVF 78,W
043F: MOVWF 33
0440: MOVF 77,W
0441: MOVWF 32
0442: CALL 1BB
0443: MOVF 7A,W
0444: MOVWF 2D
0445: MOVF 79,W
0446: MOVWF 2C
0447: MOVF 78,W
0448: MOVWF 2B
0449: MOVF 77,W
044A: MOVWF 2A
044B: CALL 160
044C: MOVF 78,W
044D: MOVWF 29
.................... // multiplexaccion del puerto B
.................... PORTB=0b00010000 + digito1;
044E: MOVLW 10
044F: ADDWF 26,W
0450: MOVWF 06
.................... delay_ms(5);
0451: MOVLW 05
0452: MOVWF 2A
0453: CALL 2FC
.................... PORTB=0b00100000 + digito2;
0454: MOVLW 20
0455: ADDWF 27,W
0456: MOVWF 06
.................... delay_ms(5);
0457: MOVLW 05
0458: MOVWF 2A
0459: CALL 2FC
.................... PORTB=0b01000000 + digito3;
045A: MOVLW 40
045B: ADDWF 28,W
045C: MOVWF 06
.................... delay_ms(5);
045D: MOVLW 05
045E: MOVWF 2A
045F: CALL 2FC
.................... PORTB=0b10000000 + digito4;
0460: MOVLW 80
0461: ADDWF 29,W
0462: MOVWF 06
.................... delay_ms(5);
0463: MOVLW 05
0464: MOVWF 2A
0465: CALL 2FC
....................
.................... }
0466: BSF 03.5
0467: GOTO 32D
.................... }
....................
0468: SLEEP
no se si alguien me pueda decir que tengo q modificar para q quede y lo pueda tener en .hex para cargarlo a mi pic
-
Hola, el archivo .hex es el resultado de un proceso de compilación realizado por alguna plataforma de desarrollo ya sea Mplab, CCS, etc., básicamente lo que tienes que hacer es abrirlo en alguno de estos aplicativos, crear un proyecto, si así lo requiere la plataforma y luego compilar, si no hay errores el archivo .hex se genera automáticamente y los puedes pasar al PIC.
Saludos.
-
Hola, el archivo .hex es el resultado de un proceso de compilación realizado por alguna plataforma de desarrollo ya sea Mplab, CCS, etc., básicamente lo que tienes que hacer es abrirlo en alguno de estos aplicativos, crear un proyecto, si así lo requiere la plataforma y luego compilar, si no hay errores el archivo .hex se genera automáticamente y los puedes pasar al PIC.
Saludos.
diego tengo una duda pues ya compile el programa pero no me genera el archivo .hex que puedo hacer pues no lo encuentro por ningun lado te agradeceria tu ayuda
-
Por lo que veo, si no te genera el .hex, deberia tener un problema o error el programa.
Yo no te podria ayudar, ya que uso asm y compilo con el MPLAB, y este mismo si tiene un error, lo marca y no crea el .hex hasta que sea corregido.
Espero lo hallas podido solucionar ... Saludos !!!
-
Creo que sería conveniente que postearas tu circuito ya que aunque describes el multiplex de los dígitos en el programa no encuentro las salidas correspondientes a los elementos del multiplex. Como aparenta en el programa y tal como lo alcanzo a entiender todos los digitos despliegan la misma información al mismo tiempo. Si tu lectura fuera por ejemplo 1234 lo que se vería en el display seria 1111, 2222, 3333, 4444 y se estaría repitiéndo ese proceso. Si la velocidad de barrido es alta el display sería ilegible.
A manera de ejemplo te dejo el link a uno de los modelos de display que uso en mis equipos comerciales. Para tu aplicación no son necesarios los chips auxiliares que se ven pero sí los transistores que se observan.
http://www.imageshack.com/i/f5e5kpj
Los transistores son activados uno por uno en correspondencia con el dígito que se despliegue. Así entonces si el dato a desplegar es el mismo 1234 el display mostrará 1234. A mayor velocidad de barrido menor será la intensidad de los dígitos ó si es muy baja la velocidad de barrido se verán intensos pero titilando (parpadeando).
Para realizar el multiplex podrías utilizar bits del puerto C para activar los transistores.
Con respecto a la lectura del puerto AN0 déjame releer un programa que hice hace tiempo para el PIC12F675 para ver si se puede adaptar al 877.
Un saludo.