Autor Tema: Resolviendo los ejercicios en CCS (desde 0)  (Leído 7058 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Resolviendo los ejercicios en CCS (desde 0)
« en: 17 de Diciembre de 2011, 09:15:27 »
Saludos. Estoy aprendiendo CCS resolviendo todos los ejercicios que vienen el libro de Pic autor:Palacio.
Pero todos los programas de ese libro están en lenguaje ensamblador y los ahora los quiero resolver en CCS.

Bueno, iré subiendo todos los ejercicios todos están simulados y probados en protoboard.

Espero me guíen cuando no pueda resolver alguno o cometa algún error.

Comenzando con los elementales.

ELEMENTAL_01:

Código: [Seleccionar]
//Por el Puerto B se obtinene el dato de las cinco lineas
//del Puerto A, al que esta conectado a un array de interruptores,
//sumandole el valor de una constante, por ejemplo 74 decimal.
//Es decir PORTC = PORTA +74
[/font]#include <16f877a.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOLVP
#use delay (clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA = 5
#byte PORTC = 7

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            PORTC=0x00;
            while(true)
                      {                    
                      PORTC=PORTA+74;
                      delay_us(100);
                      }    
            }
« Última modificación: 17 de Diciembre de 2011, 09:20:32 por frozen »

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #1 en: 17 de Diciembre de 2011, 09:19:37 »
Multiplicacion de un dato  x2  :) :)

ELEMENTAL_02:

Código: [Seleccionar]
//Por el Puerto C se obtiene el dato del Puerto A
//multiplicado por 2.

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            PORTC=0x00;
            while(true)
                        {
                        PORTC=PORTA*2;
                        delay_us(100);
                        }
            }

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #2 en: 17 de Diciembre de 2011, 09:26:16 »
Ahora aprendemos el uso de una OR. :) :)

ELEMENTAL_03:

Código: [Seleccionar]
//Por el Puerto C se obtiene el dato introducido
//por el Puerto A, pero los bits pares de la salida se fijan siempre en 1.
//El orden de los
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay (clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            PORTC=0x00;
           
            while(true)
                      {
                      PORTC=PORTA|0b01010101;
                      delay_ms(1);
                      }           
            }

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #3 en: 17 de Diciembre de 2011, 09:27:41 »
  Para hacer una multiplicación por 2 también se puede hacer un SHIFT a la izquierda.

  En ANSI C se puede hacer así

Código: C
  1. variable = variable << 1;

  habría que ver que tipo de código assembler genera cada forma como para saber cual es más eficiente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #4 en: 17 de Diciembre de 2011, 09:36:47 »
 habría que ver que tipo de código assembler genera cada forma como para saber cual es más eficiente.


Hola. Hay alguna opción para ver cuanto de memoria estoy utilizando, no quiero ver cual genera mas código porque también se puede comparar la cantidad de espacio que ocupan cierto.

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #5 en: 17 de Diciembre de 2011, 09:42:04 »
Estos es la informacion con usando multiplicar.

CCS PCM C Compiler, Version 4.108, 5353               16-dic-11 08:28

               Filename: D:\APRENDER CCS\Elemental_02\Elemental_02.lst

               ROM used: 30 words (0%)
                         Largest free fragment is 2048
               RAM used: 5 (1%) at main() level
                         5 (1%) worst case
               Stack:    0 locations

Esta es la información usando <<1
CCS PCM C Compiler, Version 4.108, 5353               17-dic-11 07:39

               Filename: D:\APRENDER CCS\Elemental_02\Elemental_02.lst

               ROM used: 30 words (0%)
                         Largest free fragment is 2048
               RAM used: 5 (1%) at main() level
                         5 (1%) worst case
               Stack:    0 locations

Vi los codigos y ambos generan el mismo.

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #6 en: 17 de Diciembre de 2011, 09:44:29 »
Usando AND.  :) :)

ELEMENTAL_04:

Código: [Seleccionar]
//Por el Puerto B se obtiene el contenido del Puerto A
//pero los bits impares de la salida se fijan a 0.

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            PORTC=0x00;
           
            while(true)
                        {
                        PORTC=PORTA&0x15;
                        delay_ms(1);
                        }           
            }

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #7 en: 17 de Diciembre de 2011, 09:47:01 »
Usar el Complemento. :) :)

ELEMENTAL_05:

Código: [Seleccionar]
//Por el Puerto B se obtiene el dato del Puerto A
//invertidos los unos y los ceros.

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            while(true)
                      {                     
                      PORTC = ~PORTA;
                      delay_ms(1);
                      }                     
            }

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #8 en: 17 de Diciembre de 2011, 09:50:02 »
Aqui es donde pido ayuda. jaja. En assembler se usa SWAPF para intercambiar el nibble alto por el nibble bajo.
En CCS que puedo usar?? :) :)

Código: [Seleccionar]
//Por el Puerto C se obtiene el dato del puerto A
//intercambiando los nibbles alto y bajo.
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4M)
#use fast_io(a)
#use fast_io(c)
#byte PORTA=5
#byte PORTC=7

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            PORTC=0x00;
            int dato;
            while(true)
                       {  
                       dato=PORTA;
                       #asm
                       swapf  dato,1    //ayuda aki!!!! :5] :5] :5]
                       #endasm
                       PORTC=dato;
                       delay_ms(1);
                       }
            }
« Última modificación: 17 de Diciembre de 2011, 09:52:16 por frozen »

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #9 en: 17 de Diciembre de 2011, 10:53:10 »
Con rotaciones podes resolverlo haciendolo en C. Sino podes crear un macro que lo haga en asm, mucho mas eficiente  :mrgreen:



Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #10 en: 17 de Diciembre de 2011, 12:50:16 »
Gracias Sucky. En assembler es sencillo crear una macro por ejemplo:

PUTC              MACRO   ASCII
         movlw   ASCII
         call           LCD_ENVIA_CAR
         ENDM

Me podrian dar un ejmplo q como hacer la macro para esto en ccs

#asm
  swapf DATO,1
#endasm

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #11 en: 17 de Diciembre de 2011, 13:12:58 »
Creo que debería de funcionar:

Código: C
  1. #define SwapByte(a) {#asm swapf a,1 #endasm}


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado frozen

  • PIC12
  • **
  • Mensajes: 53
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #12 en: 17 de Diciembre de 2011, 14:36:48 »
Creo que debería de funcionar:

Código: C
  1. #define SwapByte(a) {#asm swapf a,1 #endasm}


Saludos!

Otra vez gracias sucky  :)

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #13 en: 17 de Diciembre de 2011, 19:14:03 »
en la ayuda de CCS esta la funcion swap(x)
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Resolviendo los ejercicios en CCS (desde 0)
« Respuesta #14 en: 18 de Diciembre de 2011, 00:15:54 »
Atención, que si hace lo que dice la ayuda es bastante poco eficiente: byte = (byte << 4) | (byte >> 4);  :tongue:


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything