TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: frozen en 17 de Diciembre de 2011, 09:15:27

Título: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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);
                      }    
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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);
                        }
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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);
                      }           
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: AngelGris 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.
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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.
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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.
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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);
                        }           
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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);
                      }                     
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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);
                       }
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: Suky 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
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: Suky 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!
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen 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  :)
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: jhozate en 17 de Diciembre de 2011, 19:14:03
en la ayuda de CCS esta la funcion swap(x)
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: Suky 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!
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: Nocturno en 18 de Diciembre de 2011, 03:37:21
Es igual de eficiente, mira cómo lo compila:

....................    byte dato; 
.................... 
....................    swap(dato);
012E:  BCF    03.6
012F:  SWAPF  27,F
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen en 18 de Diciembre de 2011, 09:04:04
Gracias por sus aportes. Veo que lenguaje C en necesario ser muy eficientes ya que se cuenta con poca memoria.
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen en 18 de Diciembre de 2011, 09:14:17
usando desplazamiento a la izquierda <<1  :) :)

ELEMENTAL_07:
Código: [Seleccionar]
//Por el Puerto B se obtiene el dato del Puerto A
//desplazando un bit hacia la derecha, por la izquierda
//entrara un 1.

#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
#byte STATUS=3
void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            PORTC=0x00;
            while(true)
                        {
                        PORTC=(PORTA<<1)+1;
                        delay_ms(1);
                        }
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen en 18 de Diciembre de 2011, 09:16:14
Desplazar un bit  a la derecha >>1  :) :)

ELEMENTAL_08:
Código: [Seleccionar]
//Por el Puerto B se obtiene el dato del Puerto A
//desplazando un bit hacia la derecha, por la izquierda
//entrara un 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>>1;
                     delay_ms(1);
                     }
           }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen en 18 de Diciembre de 2011, 09:21:36
Con este terminamos con los elementales. :-/ :-/

ELEMENTAL_09:
Código: [Seleccionar]
//Por el Puerto C se obtiene el dato del Puerto A
//invirtiendo los bit pares. Los impares se dejan como en la entrada.

#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;
            int impares;
            int pares;
            while(true)
                        {
                        impares=PORTA&0b10101010;  //me quedo con los impares
                        pares=(~PORTA)&0b01010101; //Complemento
                        PORTC=pares | impares;     //los muestro
                        delay_ms(1);
                        }
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen en 18 de Diciembre de 2011, 09:48:25
9.12 PRACTICAS DE LABORATORIO   

Aprendiendo a usar la condicional IF

SALTOS_01:

Código: [Seleccionar]
//El Puerto C,que acuta como salida es controlado
//por el bit 0 del Puerto A,que actua como entrada
//De tal manera que:
//Si el bit 0 del PORTA = 1, se encienden todos los leds.
//Sie el bit 0 del PORTA = 0, solo se encienden los leds del nible alto.

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

void main()
            {
            set_tris_a(0x3F);
            set_tris_c(0x00);
            output_c(0x00);
            while(true)
                        {
                        delay_ms(1);
                        output_c(0xF0);
                        if(input(pin_A0)==1)
                        output_c(0xFF);               
                        }
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: frozen en 18 de Diciembre de 2011, 09:50:59
Comparando un dato con lo que ingresa por el puerto.  :) :)
SALTO_2:

Código: [Seleccionar]
//Compara el dato del puerto de entrada PORTA con un numero
//por ejm 13. Puede darse dos posibilidades:
//Si PORTA = numero, se encienden todos los leds.
//Si PORTA diferente al numero se encienden los leds pares.

#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)
                        {                       
                        if(PORTA==0x0D) PORTC=0xFF;
                        else            PORTC=0b01010101;
                        }
            }
Título: Re: Resolviendo los ejercicios en CCS (desde 0)
Publicado por: Suky en 18 de Diciembre de 2011, 12:06:54
Es igual de eficiente, mira cómo lo compila:

....................    byte dato; 
.................... 
....................    swap(dato);
012E:  BCF    03.6
012F:  SWAPF  27,F


Es bueno saberlo, ya estoy bastante alejado del CCS  :)


Saludos!