TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Vanesa en 24 de Mayo de 2006, 08:32:41
-
Hola, hola!!
Grabar datos de 8 bits en la memoria interna del 16f84 es fácil con la instrucción de write, igual que leerlos con read eeprom, pero alguien sabe como se graban datos de 16 bits?? Supongo que habrá que indicar que utilizas dos posiciones, pero no tengo ni idea de como hacerlo.
Gracias!
-
Hola:
Vanesa, utilizas basic?
-
Vaya, como siempre se me ha olvidado que utilizo C, concretamente el compilador CCS. Qué cabeza que tengo... :D
-
Hola:
No se si CCS tenga una funcion para eso, de lo contrario te tocaria separar en 8 bits y guardarlo en dos posiciones diferentes.
-
Sí, supongo que me tocará separar el número en bloques de 8 bits (lo cual tampoco sé como se hace) y guardarlo en dos posiciones, pero esperemos que alguien sepa como grabar los 16 bits a la vez para no tener que complicarme tanto la vida.
-
un numeros de 16bits el valor maximo es 131072 binario decimal.
tienes que dividir el numero tal por 100000 y si el numero es mayor de 100000
el carri se activaria y entonces tienes una centena de 1000. si el carri no se activa entonces el numero es menor que 100000.
y asi sucesivamente.
asi es para multiplicar a 16 bits .es tedioso
no se si te de la idea de convertir de 16bits a numeros de ocho bits.
tienes que hacer la inversa.
suerte
el valor maximo de este ejemplo es 500000
para hacer sumas secesivas de ochos bits hasta 32 bits.
hay bitsL bitsH bits_alto
para convertir un numero de 16bits tendra que hacer lo contrario
dividir por 100000 despues por 1000 y sacaras las centenas de mil,. decenas de mil, unidad de mil y asi sucesivamente.
dividir son restas sucesivas.
te anexo algo que te puede servir.
suerte
INICIO
BSF STATUS,5
BCF STATUS,6
CLRF PORTB
MOVLW B'00000001'
MOVWF PORTA
BCF STATUS,5
CLRF RESULT_L
CLRF RESULT_H
CLRF RESULTALTO
CLRF YOYO
;CLRF CEN
;CLRF MIL
;CLRF DEC
;MOVLW 3
;MOVWF MIL_H
;MOVLW H'E8'
;MOVWF MIL_L
;MOVLW .100
;MOVWF CEN_L
MOVLW .0
MOVWF VALORH
MOVLW .50
MOVWF VALORL
MOVLW .232
MOVWF REFE_L
MOVLW .1
MOVWF REFE_H
COMI MOVF VALORH,W
ADDWF RESULT_H,1
BTFSS STATUS,0
GOTO MR
GOTO RE
MR MOVF VALORL,0
ADDWF RESULT_L,1
BTFSS STATUS,C
GOTO HE
GOTO MO
HE DECFSZ REFE_L,1
GOTO COMI
MOVF REFE_H,0
XORLW .0
BTFSS STATUS,2
GOTO KI
TER GOTO TER
KI INCF YOYO,1
MOVF REFE_H,0
SUBWF YOYO,0
XORLW .1
BTFSS STATUS,2
GOTO COMI
GOTO TER
RE INCF RESULTALTO,1
MOVF VALORL,0
ADDWF RESULT_L,1
BTFSS STATUS,0
GOTO HE
GOTO MO
MO MOVLW .1
ADDWF RESULT_H,1
BTFSS STATUS,0
GOTO HE
INCF RESULTALTO,1
GOTO COMI
END
disculpa el enredo
-
En C se hace de la siguiente forma:
nValLow = lValue & 0x00FF;
nValHigh = (lValue & 0xFF00)>>8;
Donde lValue es el número de 16 bits, nValLow el byte bajo del número y nValHigh el byte alto del numero.
Saludos.
-
hola, fijate en este codigo que encontre, las funciones son para escribir y leer numeros de 16bits a/desde la eeprom:
void write_eeprom16(int address1, int address2, int16 value)
{
int8 lowerhalf = 0;
int8 upperhalf = 0;
lowerhalf = make8(value,0);
write_eeprom(address1,lowerhalf);
upperhalf = make8(value,1);
write_eeprom(address2,upperhalf);
}
int16 read_eeprom16(int address1, int address2)
{
int16 finalvalue = 0;
int8 lowerhalf = 0;
int8 upperhalf = 0;
upperhalf = read_eeprom(address2);
lowerhalf = read_eeprom(address1);
finalvalue = make16(upperhalf,lowerhalf);
return finalvalue;
} espero te sirva