Autor Tema: Ensamblador embebido en CCS, problemas con compatibilidad  (Leído 6489 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Ensamblador embebido en CCS, problemas con compatibilidad
« en: 11 de Marzo de 2011, 20:51:01 »
Hola de nuevo, amigos estoy tratando de hacer una librería para el manejo de cualquier dispositivo 1_wire, para lo cuál necesito hacer temporizaciones muy precisas de algunos us, por lo que opté por hacerlas con ensamblador embebido en el CCS usando #asm y #endasm, pero no estoy seguro de si la sintaxis es la misma, ya que no me lo compila, hice un ejemplo de parpadear un LED para ver si funciona, pero no lo hace, posteo el código para ver si alguien me hecha una manita por favor
Código: [Seleccionar]
#include <16F628A.h>
#fuses INTRC_IO, NOWDT, NOMCLR,NOPROTECT, BROWNOUT, NOPUT, NOLVP
#use delay(clock = 4MHz)
#use fast_io(B)

#reserve 0x20:0x25     //reservo esas posiciones para los contadores del retardo

void parpadeo();

void main()
{
set_tris_A(0x00);
set_tris_B(0x00);
while(TRUE)
{
parpadeo();
}
}

void parpadeo()
{
int8 PDel0;
int8 PDel1;
#locate PDel0=0x20        ;guardo las variables en las posiciones reservadas
#locate PDel1=0x21
#asm
clrf 0x03          ;me voy al banco 0
bcf 0x06,5    ;apago
call DEMORA       ;retardo
bsf 0x06,5      ;prendo
call DEMORA      ;retardo

DEMORA movlw    .239      ; 1 set numero de repeticion  (B)
        movwf    PDel0      ; 1 |
PLoop1 movlw      .232      ; 1 set numero de repeticion  (A)
        movwf      PDel1      ; 1 |
PLoop2 clrwdt              ; 1 clear watchdog
PDelL1 goto PDelL2      ; 2 ciclos delay
PDelL2 goto PDelL3      ; 2 ciclos delay
PDelL3 clrwdt              ; 1 ciclo delay
        decfsz    PDel1,1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4 goto PDelL5      ; 2 ciclos delay
PDelL5 goto PDelL6      ; 2 ciclos delay
PDelL6 goto PDelL7      ; 2 ciclos delay
PDelL7 clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
#endasm
}

Saben si se programa exactamente igual que con ensamblador dentro de #asm-#endasm ?
Los retardos los generé con PDel, de antemano gracias por su ayuda.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #1 en: 11 de Marzo de 2011, 21:18:03 »
¿cuál es el error que te indica el compilador?

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #2 en: 11 de Marzo de 2011, 21:30:13 »
Gracias por responder.

Me dice "uso incorrecto de pnemonico" y me pone el nombre de la primer etiqueta
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #3 en: 11 de Marzo de 2011, 22:12:23 »
la directiva asm endasm es correcta

el error debe estar en una de esas lineas en asm. ya casi no recuerdo el assembler  :(
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #4 en: 11 de Marzo de 2011, 22:28:37 »
  Yo tampoco me acuerdo demasiado de asm, pero siempre que iba a utilizar un call  tenía la precaución de tener definido de antemano el sitio al cual quería ir. Te pongo un ejemplo para que se entienda mejor

Código: ASM
  1. ; supongamos que aquí comienza el codigo en asm
  2.  
  3. goto comienzo
  4.  
  5. etiqueta
  6.   bcf PORTB,0
  7.   return
  8.  
  9. comienzo
  10.   call etiqueta
  11. .......
  12. ........
  13. ........
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #5 en: 11 de Marzo de 2011, 23:14:51 »
Y es muy necesario el uso del asm? Quiza con C se pueda realizar sin perder mucha exactitud. No podria aconsejarte algo pues, al no saber asm, no se que es lo que intentas hacer.

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #6 en: 11 de Marzo de 2011, 23:16:43 »
  Yo tampoco me acuerdo demasiado de asm, pero siempre que iba a utilizar un call  tenía la precaución de tener definido de antemano el sitio al cual quería ir. Te pongo un ejemplo para que se entienda mejor

Código: ASM
  1. ; supongamos que aquí comienza el codigo en asm
  2.  
  3. goto comienzo
  4.  
  5. etiqueta
  6.   bcf PORTB,0
  7.   return
  8.  
  9. comienzo
  10.   call etiqueta
  11. .......
  12. ........
  13. ........

Ya revise que haya todas las etiquetas a las que me refiero, no creo que allí este el problema, el problema en si es que no me toma las etiquetas si no tienen los 2 puntos, y con los 2 puntos no funciona el programa.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #7 en: 11 de Marzo de 2011, 23:18:23 »
Y es muy necesario el uso del asm? Quiza con C se pueda realizar sin perder mucha exactitud. No podria aconsejarte algo pues, al no saber asm, no se que es lo que intentas hacer.

Ya lo estoy haciendo en C, aunque no descarto mejorarlo atraves de assembler, aunque esto de implementar protocolos esta complicado!, creo que lo más complicado es decifrar el datasheet, ahorita estoy hasciendo una libreria del protocolo one-wire tanto para EEPROMS como para termómetros
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #8 en: 11 de Marzo de 2011, 23:29:44 »
  Pero yo me refería al orden en que aparecen, que igualmente no estoy seguro que tenga que ser como indiqué. En tu programa hay un "call DEMORA", pero la rutina DEMORA aparece abajo del llamado y tal vez ese sea el problema.

  También me parece que como está hecho puede pasar lo siguiente (más allá del error que ya te está generando)

Código: ASM
  1. clrf            0x03          ;me voy al banco 0
  2.                         bcf                     0x06,5    ;apago
  3.                         call            DEMORA       ;retardo
  4.                         bsf                     0x06,5      ;prendo
  5.                         call            DEMORA      ;retardo
  6.        
  7.         DEMORA movlw            .239            ; 1 set numero de repeticion  (B)
  8.                 movwf           PDel0           ; 1 |
  9.         PLoop1 movlw            .232            ; 1 set numero de repeticion  (A)
  10.                 movwf           PDel1           ; 1 |
  11.         PLoop2 clrwdt                   ; 1 clear watchdog
  12.         PDelL1 goto             PDelL2      ; 2 ciclos delay
  13.         PDelL2 goto             PDelL3      ; 2 ciclos delay
  14.         PDelL3 clrwdt                   ; 1 ciclo delay
  15.                 decfsz          PDel1,1         ; 1 + (1) es el tiempo 0  ? (A)
  16.                 goto            PLoop2          ; 2 no, loop
  17.                 decfsz          PDel0,1         ; 1 + (1) es el tiempo 0  ? (B)
  18.                 goto            PLoop1          ; 2 no, loop
  19.         PDelL4 goto             PDelL5      ; 2 ciclos delay
  20.         PDelL5 goto             PDelL6      ; 2 ciclos delay
  21.         PDelL6 goto             PDelL7      ; 2 ciclos delay
  22.         PDelL7 clrwdt                   ; 1 ciclo delay
  23.                 return                  ; 2+2 Fin.

  el primer "call DEMORA" llama a dicha rutina y al finalizar la misma retorna (mediante el la instrucción return) al punto donde fue llamado. Luego está la instrucción "bsf 0x06,5 ;prendo" y otro llamado a DEMORA. Nuevamente retorna la función, pero ahora vuelve a ejecutarse la función DEMORA, ya que es lo que sigue en el programa y en este punto, cuando llegue al final, se encuentra otra vez con la instrucción "return" pero... ¿a donde retorna.....? no se puede asegurar ya que en este caso entró a la función DEMORA pero sin ser llamada desde ningún lado....

  Por eso fijate que en el código que yo mostré, primero está la implementación de lo que sería la función "etiqueta" y se la llama desde más adelante en el programa.

  Básicamente es al igual que en C, salvo que el C te permite definir la función (sin que sea necesaria su implementación) antes del main.

  O sea que en asm, tiene que figurar la implementación de una función antes de que se la pueda llamar mediante un call.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #9 en: 11 de Marzo de 2011, 23:35:15 »
 Básicamente es al igual que en C, salvo que el C te permite definir la función (sin que sea necesaria su implementación) antes del main.

  O sea que en asm, tiene que figurar la implementación de una función antes de que se la pueda llamar mediante un call.

Ok, ok, ya comprendí, lo hice así debido a que en ensamblador es correcto llamar una subrutina antes de la etiqueta a ella, sin embargo es probable que debido a que estoy trabajando dentro de las reglas del CCS sea necesario hacer lo mismo que comunmente se haría.

Voy a probar a poner las etiquetas antes de llamarlas haber si con eso se arregla, sabes si la sintaxis que utiliza el #asm es igual a como si se estuviera programando en asembler?, lo que pasa es que en asembler para cargar un decimal se hace .34, pero desde el CCS con el #asm solo me lo acepta sin el punto.

Muchas gracias por tu ayuda AngelGris
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #10 en: 11 de Marzo de 2011, 23:45:56 »
  Creo que en asm se usaba el punto cuando el radix era distinto al decimal, pero si se utilizaba radix decimal el punto no era necesario. Supongo que CCS "utiliza" radix decimal y por ello no toma el punto. O quizá para mantener una coherencia entre el código hecho en C al código hecho en asm.
  Como ejemplo, si no me equivoco, en asm se podía asignar un valor en hexa poniendo algo así "movlw 01Fh" pero no creo que el CCS lo tome y sin embargo si te permite expresarlo como "movlw 0x1F", que es la forma en que sí te permite asignarle un valor a una variable en C.


  También hay que ver si te deja hacer uso del "call" y del "goto" dentro de una función.

  Hace un tiempo había probado algo así con el compilador HiTech C y dentro de una función no me permitía el uso de "call" ni de "goto". En cambio dentro del main sí me lo permitía.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #11 en: 12 de Marzo de 2011, 01:23:49 »
falflores según te leo, dices que requieres precisión en los retardos, pero

¿y sabes los tiempos que se gasta C al momento de entrar y salir de la función parpadeo?

porque podrías intentar hacer los retardos por interrupciones al timer (en C), y mediante simulación, calculas los tiempos (teóricamente ) asignando puntos de rupturas en las lineas de código a retener.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Ensamblador embebido en CCS, problemas con compatibilidad
« Respuesta #12 en: 12 de Marzo de 2011, 01:30:14 »
falflores según te leo, dices que requieres precisión en los retardos, pero

¿y sabes los tiempos que se gasta C al momento de entrar y salir de la función parpadeo?

porque podrías intentar hacer los retardos por interrupciones al timer (en C), y mediante simulación, calculas los tiempos (teóricamente ) asignando puntos de rupturas en las lineas de código a retener.



Si PalitroqueZ, soy conciente de esos tiempos extras, lo que pasa es que estaba usando esa función de parpadeo solo para probar que funcionara la funcion, ya una vez me funcionara, la iba a cambiar por la que realmente requiere el protocolo 1-wire, y en esta última no importa el tiempo del llamado a dicha función, ya que el tiempo comienza a ser crítico una vez que se cambia de estado el pin de comunicacion, y esto se hace dentro de la funcion.

De todas formas ya no creo continuar con el código en asembler, por que ya encontre una librería de 1 wire que funciona de 10, lo que voy a hacer ahora es tratar de meterle algunas otras cosas estras, y luego la posteo por aca.

Gracias a todos por su ayuda.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Librerias para comunicación 1 wire y DS18B20/DS18S20
« Respuesta #13 en: 12 de Marzo de 2011, 01:35:51 »
por cierto, si a alguien le interesa la libreria del protocolo 1 wire para las EEPROM y sensores de temp de dallas semiconductor, son las siguientes, una para el protocolo y otra para el sensor DS18S20/DS18B20

Libreria 1 wire
Código: [Seleccionar]
// (C) copyright 2003 j.d.sandoz / jds-pic !at! losdos.dyndns.org

// released under the GNU GENERAL PUBLIC LICENSE (GPL)
// refer to http://www.gnu.org/licenses/gpl.txt

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

/***********************1Wire Class***********************/
/*Description: This class handles all communication */
/* between the processor and the 1wire */
/* sensors.
/*********************************************************/

/*-------1-wire definitions-------*/
#define ONE_WIRE_PIN PIN_B5

/*******************1-wire communication functions********************/

/************onewire_reset*************************************************/
/*This function initiates the 1wire bus */
/* */
/*PARAMETERS: */
/*RETURNS: */
/*********************************************************************/

void onewire_reset()  // OK if just using a single permanently connected device
{
output_low(ONE_WIRE_PIN);
delay_us(500); // pull 1-wire low for reset pulse
output_float(ONE_WIRE_PIN); // float 1-wire high
delay_us(500); // wait-out remaining initialisation window.
output_float(ONE_WIRE_PIN);
}

/*********************** onewire_write() ********************************/
/*This function writes a byte to the sensor.*/
/* */
/*Parameters: byte - the byte to be written to the 1-wire */
/*Returns: */
/*********************************************************************/

void onewire_write_byte(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us(2); // pull 1-wire low to initiate write time-slot.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire
delay_us(60); // wait until end of write slot.
output_float(ONE_WIRE_PIN); // set 1-wire high again,
delay_us(2); // for more than 1us minimum.
}
}

/*********************** read1wire() *********************************/
/*This function reads the 8 -bit data via the 1-wire sensor. */
/* */
/*Parameters: */
/*Returns: 8-bit (1-byte) data from sensor */
/*********************************************************************/

int onewire_read_byte()
{
int count,data;
for (count=0;count<8;++count)
{
output_low(ONE_WIRE_PIN);
delay_us(2); // pull 1-wire low to initiate read time-slot.
output_float(ONE_WIRE_PIN); // now let 1-wire float high,
delay_us(8); // let device state stabilise,
shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result.
delay_us(120); // wait until end of read slot.
}
return(data);
}

Libreria DS18S20/DS18B20
Código: [Seleccionar]
float ds1820_read()
{
int8 busy=0,temp1,temp2;
signed int16 temp3;
float result;
onewire_reset();
onewire_write_byte(0xCC);
onewire_write_byte(0x44);
 
while (busy == 0) busy = onewire_read_byte();

onewire_reset();
onewire_write_byte(0xCC);
onewire_write_byte(0xBE);
temp1=onewire_read_byte();
temp2=onewire_read_byte();
temp3=make16(temp2, temp1);
//result=(float)temp3/2.0);   //Calculation for DS18S20 with 0.5 deg C resolution
result=(float)temp3/16.0;  //Calculation for DS18B20 with 0.1 deg C resolution
delay_ms(200);
return(result);
}

Funciona de maravillas!
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Cambio de titulo a un post
« Respuesta #14 en: 12 de Marzo de 2011, 01:43:47 »
Debido a que este post cambio de tema, me gustaria saber si hay forma de cambiarle el título, algo como "Librerias para uso de EEPROM y DS18B20 por 1wire"
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com