Autor Tema: Preguntas de novato con 16F84A?  (Leído 3175 veces)

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Preguntas de novato con 16F84A?
« en: 12 de Noviembre de 2006, 20:00:47 »
Hola, soy bastante nuevo en todo esto de la programacio de uC, pero toda la informacion que hay en este foro me esta ayudando mucho, sobre todo los ejemplos de vszener y RedPic.
Estoy queriendo hace un programita que tiene que tiene unas cuantas salidas y solo tres entradas, ellas son RA0, RA1 y RA2.
Por otro lado, las salidas son todas las demas que tiene el pic 16f84a (ra3, ra4 y rb0-7).
mi primer problema es que no puedo utilizar RA4 como salida, supongo que sera xq este pin tambien se puede usar como TMR0, y habra que desactivarlo, pero mis conocimientos no llegan a tanto  :(

otra duda que tengo es si el siguiente codigo esta bien empleado, en vez de escribir output_high/low(PIN_A0), prefiero algo mas corto y significativo... pero no funciona... que ocurre?

#bit LED=0x05.0

void main (void)
{
do{
    LED=1;
    delay_ms(1000);
    LED=0;
    delay_ms(1000);
    }while(TRUE);
}

mi ultima duda es como podria crear una matriz o algo semejante que me permita tener dentro pines del pic, y al escribir por ejemplo Nombre_matriz(x)=1 me permita poner en HIGH la patilla x del pic. no se si se entiende...
me explico mejor:
supongamos que quiero hacer las lucesitas del coche fantastico, entonces creo una matriz de 8 elementos (que seran 8 pines de un pic) que llamamos "LED(x)" donde x es un numero del 0 al 7 que hace referencia a un pin especifico del pic...
con el siguiente codigo las luces irian de un lado para otro (no volverian en sentido contrario, solo para no complicar el ejemplo):

x=0;
do{
  LED(x)=1;
  if(x==0)
    LED(7)=0;
  else
    LED(x-1)=0;
  x=x+1;
  delay_ms(100);
  if(x==7)
    x=0;
}while(TRUE);

bueno, creo que se entiende lo que hace, el codigo seguramente no es el optimo, pero lo hice sobre la marcha para que entendais a que me refiero: va encendiendo leds cada 0.1s y a la vez que apaga el anterior. como consigo que LED(x) señale a un pin?

mil gracias a todos por este foro tan productivo, espero aprender mucho de aqui.
si alguien sabe contestar a alguna o todas mis preguntas se lo agradezco de antemano
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: Preguntas de novato con 16F84A?
« Respuesta #1 en: 12 de Noviembre de 2006, 20:35:43 »
el pin ra4 es de tipo colector abierto, coloca entre el pin y los 5 volts un resistor de 4,7k .

para que ande el pin "led" fijate si tenes configurado el tris del puerto a para ese pin como salida:

ejemplo si el pin es del puerto a y es el numero 5 , en el trisa tenes que colocar : trisa(0b00000000). el sexto cero contando de derecha a izquierda es el del pin del ejemplo: 0 es salida y 1 es entrada . si quisieras configurarlo como entrada , seria : trisa(0b00100000).

Con respecto a la matriz , pegate una leida a bit set () en la ayuda del css.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Preguntas de novato con 16F84A?
« Respuesta #2 en: 13 de Noviembre de 2006, 15:10:16 »
Hola Marttyn, para el ejemplo que expones sobre los leds ascendente,

Código: C
  1. // rotacion de leds encendidos de RA0 a RA7
  2.  
  3. int t;
  4. int const puertoa=40;
  5. #byte  porta = 5
  6.  
  7. main(){
  8.  set_tris_a(0);
  9.  porta=0;
  10.  for( t=0;t<8;t++){
  11.   output_high(puertoa+t)
  12.   delay_ms(100);
  13.   output_low (puertoa+t)
  14.   delay_ms(100);
  15.  }
  16. }

prueba este código

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Preguntas de novato con 16F84A?
« Respuesta #3 en: 13 de Noviembre de 2006, 17:16:39 »
Gracias fastyx y PalitroqueZ por vuestras respuestas!
RA4 esta configurado como salida, e hice lo que me dijiste del colector abierto, pero sigue sin funcionar...
Lo del bit_set es muy interesante, no lo sabia y parece practico, pero no me soluciona lo que estoy haciendo, porque si quisiera que los pines no estuvieran en orden? osea, si quiero usar algunes pines del port a y otros del port b no hay manera de poder encenderlos con un bucle FOR por ejemplo. Pasa lo mismo con el ejemplo que dio PalitroqueZ, si quisiera que sean los pines del port a los que se encendieran en el orden de 0 a 7 supongo que esto funcionaria, pero no si el orden es otro o hay pines de varios puertos...
por cierto, para que sirve "int const puertoa=40" ?? parece como si fuera equivalente a PIN_Ax y x fuera un valor que va cambiando. pero de donde sale ese 40? los pines del port a van del 0x05.0 al 0x05.4 no?
veo que me falta mucho por aprender, pero desde luego que todos vosotros sois de gran ayuda!
el que pueda responder a algo mas se lo agradeceria mucho
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: Preguntas de novato con 16F84A?
« Respuesta #4 en: 13 de Noviembre de 2006, 21:34:17 »
colocate el codigo completo con los fuses y demas a ver que pasa...

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Preguntas de novato con 16F84A?
« Respuesta #5 en: 14 de Noviembre de 2006, 07:40:15 »
Buenas!!! lo del colector abierto significa que tienes que ponerle una resistencia de pull-up, de todas formas, este tema del pin RA4 ya está tratado en este post: Problemas en RA4

Con respecto al número 40 que define el pin RA0 del puerto A, lo podrás ver en la libreria del microcontrolador a usar, símplemente tienes que irte a la carpeta donde se instaló tu compilador en el disco duro, y en la carpeta de 'device' (creo que recordar que es esa, sino en una de las que están ahí), estará la librería del pic a usar, ábrela y verás sus periféricos definidos.

Ahora bien, es verdad que en el data sheet pone que el puerto A está definido en la posición 0x05, ¿de dónde sale el 40 entonces? Bien, el número 0x05 en binario es 101, el número 40 en binario es el 101000, el compilador recoge los tres primeros bit's más significativos donde declara el puerto a tratar, en este caso del número 40, los tres bit's más significativos son 101 que en hexadecimal corresponde al 0x05, y los tres bit's menos significativos definen el pin del puerto a usar.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Preguntas de novato con 16F84A?
« Respuesta #6 en: 14 de Noviembre de 2006, 12:48:06 »
Siguiendo en la línea de lo explicado por vszener, si buscas en la ayuda de CCS, sobre la instrucción output_high(), y en general las instrucciones que usen PIN_Xn, verás los siguiente:


 
Observen la expresión 5*8+3=43, donde 5 es la dirección del PORTA, y el producto por 8 es el desplazamiento de ese 5 en 3 posiciones hacia la izquierda (recuerda que para rotar un bit hacia la izquierda, se multiplica por 2 si es una vez) y como en este caso son 3, entonces 2^3=8.

ej: 2d=10b
si roto 10 una vez a la derecha -> 100b = 4d en terminos de sistema decimal estoy multiplicando el 2 * 2

si revisas el archivo de cabecera del 16F84A por ej:

Código: C
  1. #define PIN_A0  40   // corresponde a 5*8+0
  2. #define PIN_A1  41   // corresponde a 5*8+1
  3. #define PIN_A2  42   // corresponde a 5*8+2
  4. #define PIN_A3  43   // corresponde a 5*8+3
  5. #define PIN_A4  44
  6.  
  7. #define PIN_B0  48   //  corresponde a 6*8+0
  8. #define PIN_B1  49   //  corresponde a 6*8+1
  9. #define PIN_B2  50   //  corresponde a 6*8+2
  10. #define PIN_B3  51   //  corresponde a 6*8+3
  11. #define PIN_B4  52   //     ...
  12. #define PIN_B5  53   //   ...
  13. #define PIN_B6  54
  14. #define PIN_B7  55

ahí se observa la dirección del puerto y sumado al pin de cada puerto ó RB(n), dá el número de cada PIN de ese puerto.

en fin la ecuación general podría ser: dirección_puerto*8+Rpuerto(n)

En el caso del ejemplo de arriba, para utilizar el bucle, sería mejor llamar al pin por los números siguiendo la ecuación, que usando la constante ya establecida.


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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Preguntas de novato con 16F84A?
« Respuesta #7 en: 14 de Noviembre de 2006, 14:21:33 »
yo sigo flipando con todo lo que estoy aprendiendo!  :shock:
en solo un hilo se aprende mas que en varias semanas del FP de electronica que estoy haciendo   :-/

pues nada, ya se unas cuantas cosas mas, muy utiles todas!!!

pero me sigue rondando en la cabeza lo de la matriz...
os voy a explicar lo que quiero hacer:
mi idea es hacer las luces del coche fantastico, pero con 10 leds, y claro, cualquier puerto tiene max 8 salidas, con lo que tengo que usar pines de 2 puertos como minimo...
la solucion que yo encuentro mas facil de escribir es un bucle for que vaya encendiendo una luz a la vez que apaga la anterior
serian solo tres o cuatro lineas de codigo si tuviese una matriz llamada "LED(x)" y que cada x sea un pin...
sin esto tengo que hacer un bucle para un puerto y luego otro para el otro.... y si bien no es COMPLICADO de hacer, simplemente no me gusta y me parece que se complica a la lectura y comprension...
estoy casi seguro de que tiene que haber alguna manera de hacer esto.... pero no se cual  :(

con respecto al pin A4 intente buscar algun hilo con este contenido... pero el buscador solo permite palabras de 4 o mas letras  :5]
bueno, aun habiendo puesto un pull up no me funciona... de hecho, en el proteus lo simulo, y las patitas que tienen un 1 se ponene rojas, y las que tienen un 0 se ponen azules... pero la A4 con pull up se pone gris  :?: y sin pull up se queda siempre azul

en fin... seguire leyendo el post del famoso RA4 a ver si saco algo en claro
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Preguntas de novato con 16F84A?
« Respuesta #8 en: 14 de Noviembre de 2006, 15:02:43 »
Marttyn reacomodé el ejemplo de arriba según lo que entendí, verás es este:
 
Código: C
  1. // rotacion de leds encendidos de RA0 a RA7 y RB0,RB1
  2.  
  3.  int t;
  4.  int const puertoa=40;
  5.  #byte  porta = 5
  6.  #byte  portb = 5
  7.   main(){
  8.   set_tris_a(0);
  9.   set_tris_b(xxxxxx00);    // las x son la config de esos pines a tu eleccion
  10.   porta=0;
  11.   portb=0;
  12.   for( t=0;t<10;t++){
  13.     if(t>=8){
  14.       porta=0;
  15.       output_high(puertoa+t)
  16.       delay_ms(100);
  17.       output_low (puertoa+t)
  18.       delay_ms(100);
  19.      }else{
  20.       output_high(puertoa+t)
  21.       delay_ms(100);
  22.       output_low (puertoa+t)
  23.       delay_ms(100);
  24.      }
  25.     }
  26.   }

cuando t=8 se debe encender el led que está en RB0, pues bien, RBO sería 6*8+0=48
y aprovechando el 40 del puertoa le sumo el valor de t en esa condición:
40+8=48 -> RB0
y
40+9=49 -> RB1

sería en esos 2 casos solamente cuando t>7

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Preguntas de novato con 16F84A?
« Respuesta #9 en: 14 de Noviembre de 2006, 20:33:16 »
// rotacion de leds encendidos de RA0 a RA7 y RB0,RB1

 :?: el 16f84a solo tiene hasta RA4...
mirare la conficuracion de los pins, supongo que tiene facil solucion

lo ue no entiendo es porque pones porta=0 en el if.... y para que es el if si al fin y al cabo hace lo mismo que el else...
gracias por tu respuesta.... de esta manera se consigue lo que necesitaba...
pero me sigue picando la curiosidad lo de la matriz... suponte que ademas de ir los leds de derecha a izq y de izq a der, tambien quiero que vayan del centro a los lados o no se.... por decir algo... creo que tiene que haber una solucion con matrices o algo por el estilo y seguro que tiene que valer para muchas cosas... o aunque sea para unir 2 puertos con el fin de poder llamar a sus pines desde una sola variable "PIN(x)" donde x es el nº de pin correspondiente al pic.... en fin... :mrgreen:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Preguntas de novato con 16F84A?
« Respuesta #10 en: 15 de Noviembre de 2006, 13:34:28 »
jeje, tienes razón Marttyn, me concentré en el código y perdí de vista al 16F84

creo que este código después de todo no sirve para el PORTA, sería para 2 puertos, donde el primero tendría 8 pines, la razón del if (suponiendo que ese porta tuviera los 8 pines) es que se van a ejecutar 2 cosas distintas:

si t<7 (se ejecuta lo dentro del else) y t>=8 (se ejecuta lo dentro del if). Pero la idea de ese código es para que veas como se puede jugar con los números asignados a cada pin de los puertos, y en función de ellos puedas llamarlo desde un bucle sin escribir muchas lineas.

respecto a lo de la matriz, debes plantear un caso concreto para decidir si vas a usar matrices (que yo lo llamo arrays bidimensionales) para poder escribir el programa.

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