Programas hechos en MPLAB

Y pues es esto los errores que me salen

ESTOS ERRORES APARECEN CUNADO QUITO:

#byte PORTB=0x06
#byte PORTC=0x07
 

Adjuntos

  • Sin título.png
    Sin título.png
    132.8 KB · Visitas: 14
Mira eso es lógico.
Lo que el compilador te dice, es que no estas declarando las variables.
el compilador necesita de estas, y otras referidas al puerto que quieras usar.
Si quieres usar el puertoA te tacaria agregar


#byte PORTA=0x05

#byte PORTB=0x06
#byte PORTC=0x07
Son abligatorias, se deben declarar, no las borres
 
ok son variables esta bien no necesariamente tiene que llamarse PORTC, PORTB, PORTA,
ok pueden tener un nombre "x"
lo que no entiendo es por que esa variables no les puedo poner otra direcion por que a fuerza tiene que llevar esas direcciones ?
 
hola sshoice esparza

si miras la data del pic encontraras que el puerto A se encuentra en el banco 0 del mapa de memoria y su dirección es 0x05, es por eso que forzosamente debes de ponerle esta dirección, ya que en la RAM del pic esta reservado esta posición para el puerto A, de igual forma para el puerto B y C que tienen la direccion 0x06 y 0x07 respectivamente.

por lo tanto los valores 0x05, 0x06 y 0x07, hacen referencia a una posición fisica en la RAM del pic y si le pones otro valor, estarías escribiendo en otro registro especial del pic lo que podria darte problemas ya que varios de estos registros configuran al pic para que funcione de cierta manera,

bueno espero no te halla confundido mas si no me dices y espero podertelo explicar de otra manera

saludos!
 
hola JuanCarlosabigor


si lo pene a la hora de ver el datasheet del pic


entonces esas direciones por decir #byte PORTA=0x05 es donde puedo guardar mis variables por decir
algo?


y cual es la diferencia entre #byte PORTA=0x05 y #BYTE TRISA = 0X85 ?

o para cuales casos los puedo utilizar ?

gracias JuanCarlosabigor :p
 
bueno aquí hay cosas que aclarar

1. el porta es donde guardaras la información que leeas en el puerto A y asi con los otros puertos

2. los registro tris, como trisa, trisb o trisc etc, sirven para configurar los puertos ya sea de entrada o salida,
por ejemplo

si tu quieres que los 4 bits mas significativos del puerto A sean entradas y los 4 bits menos significativos sean salidas, pondrias trisa=0xf0; donde un "1" configura al pin como entrada y un "0" lo configura como salida
 
bueno se pone :

set_tris_a(0b11110000);
lo que llo tengo entendido lo que no eniendo e cuando se le pone el #byte ....
como :
TRISA = 0X85
se que tanben es algo sobre los bancos pero se me ase muy confuso por wue todabia no lo logro entender

:p
 
set_tris_a(0b11110000); es una funcion del compilador CCS, esta instruccion es equivalente a las siguientes declaraciones

#BYTE TRISA = 0X85 // posicion en la ram del pic
TRISA = 0XF0 // asignacion en el programa principal

con set_tris_a te ahorras el declarar #BYTE TRISA =0x85
 
y cual es lo equivalente de :

#byte PORTB=0x06
#byte PORTC=0x07



osea a declarar estos datos le estoy dicendo al pic que voi a utilizar el puerto b y el puerto c?

y asi a la hora de mencionar el puero b y c no marque error
por decir portb=0b11110000;
 
Última edición:
#byte PORTB=0x06
#byte PORTC=0x07

exactamente si pones esto, le indicas al compilador que utilizaras el puerto b y c, pero recuerda que si utilizas mayúsculas debes de utilizar mayúsculas, PORTB es diferente a portb, esto es un error comun que nos llega a pasar.
 
osea a declarar estos datos le estoy dicendo al pic que voi a utilizar el puerto b y el puerto c?

y asi a la hora de mencionar el puero b y c no marque error
por decir portb=0b11110000;

Si y no :D. No te enrriedes que en la mayoria de casos ni se usa esas declaraciones...
Con setear los TRISx con Set_tris_x() ya puedes usar los puertos para leer o escribir. Para eso ya se utiliza las otras funciones que dispone el CCS como output_b(0x0F);

Es decir que el equivalente de

Código:
#byte PORTB = 0x06
...
PORTB = 0b11110000
es simplemente
Código:
output_b(0b11110000);
- Ahora, creo que te pone en dudas el valor que se le asigna a #byte PORTB por ejemplo. Segùn la hoja de datos del PIC (que es importante leer) dice que el registro PORTB se encuentra en la direcciòn (posiciòn de memoria) 0x06 de la RAM (registro especial). Si cambias ese valor entonces solo se està apuntando a otro sitio dentro de la memoria RAM.
- El nombre que se pone luego de #byte es solo referencial. Lo mismo sucede si se pone
Código:
#byte SALIDAS = 0x06
...
SALIDAS = 0b11110000

Un saludo

PD: Revisa el archivo de ayuda del CCS que està todo (sintaxis, funciones, etc...)
 
Última edición:
ByAxel mi problema empeso cuando me tope con este programa no e terminado de comprenderlo en la cuestion de que es lo que hace :
#byte PORTB=0x06
#byte PORTC=0x07

no se si nadamas estoy declarando los puertos como entradas/salidas es donde estoi confunido
yo pense que era para eso para declarar entradas/salidas pero a cambiar la direccion como
#byte PORTB=0x00 (todos los pines salidas) me marca error en el compilador
de que portb no esta declarado o algo asi :S

#include <16f76.h>
#use delay (clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT

#byte PORTB=0x06
#byte PORTC=0x07

int dato;

void main(void)


{

set_tris_b(0x00);
set_tris_c(0xff);
portb=0x00;

while (true)
{
dato= portc;
switch(dato)
{
case 1: PORTB =0xff;
break;

case 2: portb=0b00001111;
break;


case 3: portb=0b00111100;
break;

default: portb=0x00;
break;


}

}

}
 
creo que te pone en dudas el valor que se le asigna a #byte PORTB por ejemplo. Segùn la hoja de datos del PIC (que es importante leer) dice que el registro PORTB se encuentra en la direcciòn (posiciòn de memoria) 0x06 de la RAM (registro especial). Si cambias ese valor entonces solo se està apuntando a otro sitio dentro de la memoria RAM.
- El nombre que se pone luego de #byte es solo referencial. Lo mismo sucede si se pone

Código:
#byte SALIDAS = 0x06
...
SALIDAS = 0b11110000;
 
bueno eso si lo entiendo ya me cheque en los bancos
pero para que sirbe declarala o no
(#byte PORTB=0x06 #byte PORTC=0x07) en el programa?
osea nadamas estoi declarando una variable?
i la estoy almacenando en esa direeccion por : 0x06
 
#byte PORTB no es para declarar entras o salidas, con eso solo le estas indicando al compilador que una posicion de memoria de la RAM va ser usado con el nombre PORTB, por eso lo indico mas arriba que el nombre PORTB solo es para simbolizar la direccion 0x06 que obviamente es del PORTB. Igual se puede poner otro nombre con la misma direccion y ser usado dentro del programa sin inconvenientes.

osea nadamas estoi declarando una variable?
i la estoy almacenando en esa direeccion por : 0x06

Sip. Cada vez que leas o escribas en la dicha variable la va estar haciendo en el PORTB para el caso del ejemplo.



El compilador dispone de las siguientes funciones para los puertos de I/O
Código:
[B]DISCRETE I/O[/B]

 
[LIST]
[*]get_tris_x( )
[*]input( )
[*]input_change_x( )
[*]input_state( )
[*]input_x( )
[*]output_X( )*
[*]output_bit( )
[*]output_drive( )
[*]output_float( )
[*]output_high( )
[*]output_low( )
[/LIST]

[LIST]
[*]output_toggle( )
[*]output_x( )+
[*]port_x_pullups( )*
[*]set_pullup( )+
[*]set_tris_x( )
[/LIST]

En tu ejemplo puedes reemplazar con:
Código:
portb=0x00; con output_b(0x00);
dato= portc; con dato = input_c();
...

Puedes usar uno u otro mètodo, es igual.
 
Última edición:
entonces cuando se declara una variable al mencionarla se debe escribir tal y como es ejemplo
portb = PORTB por que esto en el programa no afecta?
por que me la toma como la misma variable?
 
entonces cuando se declara una variable al mencionarla se debe escribir tal y como es ejemplo
portb = PORTB por que esto en el programa no afecta?
por que me la toma como la misma variable?

ok, creo que te confundes con la misma palabra byte, recuerda que escribir
#byte que se usa para acceder a los registros especiales es distinto de declarar una variable como byte dato; (tambien se escribe como int8 dato;) la cual es una variable que ocupa una posicion de memoria en la parte de la RAM denominada "registros para el usuario".

En portb = PORTB; y si no està activada una opcion para que el compilador sea sensible a mayusculas y minusculas entonces solo esta pasando el contenido de la misma a la misma variable.
 
Última edición:
eso ya me quedo entendido pero entonces en el programa para que hacedemos a los registros especiales?
y en que forma me afecta al borrarlo del programa?
#byte PORTB=0x06
#byte PORTC=0x07
 
eso ya me quedo entendido pero entonces en el programa para que hacedemos a los registros especiales?
y en que forma me afecta al borrarlo del programa?
#byte PORTB=0x06
#byte PORTC=0x07

Para el ejemplo que pones es mero gusto del quien hizo el programa. Puesto que dentro del programa utiliza lo que ha declarado.

Lo pongo de esta manera:

Código:
#include <16f76.h>
#use delay (clock=4000000)
#fuses XT,NOWDT,NOPUT,NOPROTECT
 
int8 dato;
 
void main(void)
    {
 
      set_tris_b(0x00);
      set_tris_c(0xff);
      output_b(0x00);
 
         while (true)
            {
              dato =  input_c();
              switch(dato)
                     {
              case 1: output_b(0xff);
              break;
 
              case 2: output_b(0b00001111);
              break;
 
 
              case 3: output_b(0b00111100);
              break;
 
              default: output_b(0x00);
              break;
                     }
            }
    }

He reemplazado las lineas de codigo que es para PORTB y PORTC haciendo lo mismo con la diferencia que he usado funciones del mismo compilador.

Parece que el CASE no està activado, por eso el compilador no distingue entre mayusculas y minusculas.
 
Atrás
Arriba