Autor Tema: 16f683 no hace lo que se le dice  (Leído 4136 veces)

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

10f206

  • Visitante
16f683 no hace lo que se le dice
« en: 13 de Febrero de 2006, 11:55:00 »
Tengo que colocar gp0,gp1,gp2,gp4,gp5 en high medio segundo y luego todas en low medio segundo y repetir el ciclo indefinidamente, si ya se que esto es una pendejada ya que es un "blink a led" con esteroides, por favor sigan leyendo.

Primero, por su simplicidad utilice PicBasic Pro 2.46 (este no es le hilo pero me sirve como historia)

ansel=0
option_reg.5=0
inicio:
for j = 0 to 5
  high j
next
pause 500
for j = 0 to 5
  low j
next
goto inicio

Ok, problema resuelto, compilo todo bien, programo todo bien, lo colocon en el protoboard, con las patas conectadas a resistencias de 220ohm en serie con leds de los mas simples a sus anodos, sus patas positivas a 5v, y comienzan a titilar las patas gp2,gp3,gp4, las gp0, y gp1 estan encendias pero no hacen solo eso.

Basic cateto, por eso es que hay que usar C, tengo mi buen CCS C, y escribo algo como esto.

#include <12f683>
#fuses INRC, NOWDT, NOPROTECT, NOMCLR
main(){
output_high(gp0);
output_high(gp1);
output_high(gp2);
output_high(gp4);
output_high(gp5);
delay_ms(500);
output_low(gp0);
output_low(gp1);
output_low(gp2);
output_low(gp4);
output_low(gp5);
delay_ms(500);}

compilo, programo sin problemas, coloco el chip donde debe, titilan todas excepto ahora gp4!!!!!!!!!!!!!!!!!!! se queda encendido.

ideas?

Gracias por la ayuda.

Desconectado grouchy

  • PIC10
  • *
  • Mensajes: 39
RE: 16f683 no hace lo que se le dice
« Respuesta #1 en: 13 de Febrero de 2006, 19:17:00 »
Escrito originalmente por 10f206
Tengo que colocar gp0,gp1,gp2,gp4,gp5 en high medio segundo y luego todas en low medio segundo y repetir el ciclo indefinidamente, si ya se que esto es una pendejada ya que es un "blink a led" con esteroides, por favor sigan leyendo.

Primero, por su simplicidad utilice PicBasic Pro 2.46 (este no es le hilo pero me sirve como historia)

ansel=0
option_reg.5=0
inicio:
for j = 0 to 5
  high j
next
pause 500
for j = 0 to 5
  low j
next
goto inicio

Ok, problema resuelto, compilo todo bien, programo todo bien, lo colocon en el protoboard, con las patas conectadas a resistencias de 220ohm en serie con leds de los mas simples a sus anodos, sus patas positivas a 5v, y comienzan a titilar las patas gp2,gp3,gp4, las gp0, y gp1 estan encendias pero no hacen solo eso.

Basic cateto, por eso es que hay que usar C, tengo mi buen CCS C, y escribo algo como esto.

#include <12f683>
#fuses INRC, NOWDT, NOPROTECT, NOMCLR
main(){
output_high(gp0);
output_high(gp1);
output_high(gp2);
output_high(gp4);
output_high(gp5);
delay_ms(500);
output_low(gp0);
output_low(gp1);
output_low(gp2);
output_low(gp4);
output_low(gp5);
delay_ms(500);}

compilo, programo sin problemas, coloco el chip donde debe, titilan todas excepto ahora gp4!!!!!!!!!!!!!!!!!!! se queda encendido.

ideas?

Gracias por la ayuda.

mmm, creo que tengo algunas ideas, no se si sepas que el Pic q estas ocupando tienen un ADC, entonces lo primero q hay que hacer es apagarlo, para que todas las entradas sean entradas/salidas digitales,  enotnces tu código quedaria de la siguiente manera:

#include <12f683>
#fuses INTRC, NOWDT, NOPROTECT, NOMCLR
#use delay (clock=100000)          // Introduce la frecuencia de reloj
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
set_tris_a(0x00);
while (true)
{
   output_high(PIN_A0);
   output_high(PIN_A1);
   output_high(PIN_A2);
   output_high(PIN_A4);
   output_high(PIN_A5);
   delay_ms(500);
   output_low(PIN_A0);
   output_low(PIN_A1);
   output_low(PIN_A2);
   output_low(PIN_A4);
   output_low(PIN_A5);
   delay_ms(500);
}
}
Como podras ver es muy simple, sin embargo hay  detalles q preguntarte,  estas ocupando un cristal o un arreglo RC ??? para el reloj del pic, porque segun el código que pusiste tienes un un arreglo de RC, por otra parte para poder ocupar la instruccion delay_ms() requiere de que pongas el #use delay (clock=XXXXXXX), donde XXXXXX es la frecuencia a la que esta trabajando el pic. Por ejemplo si tienes un cristal de 4MHz entonces en la parte de #Fuses cambia INTRC por XT, y utiliza un #use delay (clock=4000000) ....................Espero que se arregle tu problema.............SALUDOSRebotado

10f206

  • Visitante
RE: 16f683 no hace lo que se le dice
« Respuesta #2 en: 14 de Febrero de 2006, 11:38:00 »
Gracias grouchy por tu respuesta, voy por partes, ayer estaba un poco enojado con este proyecto por que necestio terminarlo pero no logro que este fregadito haga lo que necesito, aclaro esto por que omiti estupidamente partes muy importantes que tu muy amablemente me has hecho ver.

Se usa el oscilador interno de 4Mhz, es decir que deberia tener las 5 patas de salidas intactas.

Es de mi conocimiento que tengo un ADC en mis manos es por eso que en mi codigo en basic coloco ansel en 0, pero omiti estas instrucciones en C, lo curioso es que al hacerlo (no de la forma en que tu dices, sino de la forma en lo figure yo, erroneamente por cierto) daba exactamente el mismo efecto.

He programado C desde hace ya varios años, pero este es mi primer programa en C para pic, estoy usando la version CCS C 2.241, ya que es lo que consegui.
Ciertamente el codigo en C aqui presentado no compila, ya que en su momento me parecio que no era trascendente, solo intentaba dar la idea.

Amen del problema descrito, creo que necesito un curso ADC de CCS C para saber que apagar o encender, he leido ya varias veces la especificiacion del 12f683, y supuestamente basta con colocar ansel en 0, pero al parecer esto no es asi, tu codigo me parece que va a resolver esto.

Anoche volvi a reprogramar todo en assembler colocando el option bit 5 en 0 y ansel en 0 pero me da el problema que solo titilan gp2, gp4 y gp5, casualmente como lo hace el programa en BASIC, es decir que el BASIC genero un codigo mas parecido al comportamiento del ASSEMBLER que el C mismo, se que es por mi falta de experiencia que esto esta sucediendo.

Te agradezco muchisimo el impulso y te comunicare lo mas pronto posible el resultado, por que me convierto en principe solo por las noches, en el dia soy el esclavo que trabaja por dinero, en la noche trabaja por placer =o)

Saludos cordiales.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: 16f683 no hace lo que se le dice
« Respuesta #3 en: 14 de Febrero de 2006, 12:28:00 »
Buenas!!!bueno discrepo ligeramente con lo que dices de que el lenguaje basic es mas feaciente al asm que el c....simplemente hay que conocer como trabaja el compilador CCS para un funcionamiento correcto de nuestro programa, pero en cuanto empieces a trabajar con el veras que no es tan complicado!


Suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

10f206

  • Visitante
RE: 16f683 no hace lo que se le dice
« Respuesta #4 en: 15 de Febrero de 2006, 15:47:00 »
Hola otra vez, les cuento que ya funciono, pero lo que no entiendo es por que, aqui va el codigo:

#include <12f683.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, NOMCLR
#use delay (clock=4000000) // Introduce la frecuencia de reloj
void main()
{
/* setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
set_tris_a(0x00); */
while (true)
{
output_high(PIN_a0);
output_high(PIN_a1);
output_high(PIN_a2);
output_high(PIN_a4);
output_high(PIN_a5);
delay_ms(500);
output_low(PIN_a0);
output_low(PIN_a1);
output_low(PIN_a2);
output_low(PIN_a4);
output_low(PIN_a5);
delay_ms(500);
}
}

como podran ver solo cambie el oscilador al INTRC_IO, al parecer las instrucciones del ADC no tuvieron ninguna incidencia, es decir que el C en si resetea el PIC a digital, por otro lado lo programe en ASSEMBLER, con este codigo:

__config 0x30D5

status    equ 0x03
trisio    equ 0x05
ansel    equ 0x1f
optionr   equ 0x01
gpio    equ 0x05
v1      equ 0x20
v2      equ 0x21

reset    org 0x00
      goto inicio
inicio    org 0x05
      movlw b"001000"
      bsf status,5
      movwf trisio
      clrf ansel
      bsf optionr,5
      bcf status,5

ciclo    bsf gpio,0
      bsf gpio,1
      bsf gpio,2
      bsf gpio,4
      bsf gpio,5
      call retardo
      bcf gpio,0
      bcf gpio,1
      bcf gpio,2
      bcf gpio,4
      bcf gpio,5
      call retardo
      goto ciclo

retardo   movlw 0x03
      movwf v1
dos      movlw 0x03
      movwf v2
uno      decfsz v2,1
      goto uno
      decfsz v1,1
      goto dos
      return
      end

En este caso los pines gp0 y gp1 se quedan encendidos y otra vez se parece a lo que hace el BASIC, el C al resetear todo a digital (esto es un supuesto) medio arregla el problema, por cierto alguien sabe como arreglar este problema en ASSEMBLER y BASIC, se que no es el hilo, pero ya llevo un poco de camino recorrido aqui.

Se que falta a la instruccion de seteo de algo que no encuentro.

Como motivador le obsequiare un 10f206 al que me lo pueda responder =o).

Saludos Cordiales.
















10f206

  • Visitante
RE: 16f683 no hace lo que se le dice
« Respuesta #5 en: 15 de Febrero de 2006, 15:48:00 »
Hola otra vez, les cuento que ya funciono, pero lo que no entiendo es por que, aqui va el codigo:

#include <12f683.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, NOMCLR
#use delay (clock=4000000) // Introduce la frecuencia de reloj
void main()
{
/* setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
set_tris_a(0x00); */
while (true)
{
output_high(PIN_a0);
output_high(PIN_a1);
output_high(PIN_a2);
output_high(PIN_a4);
output_high(PIN_a5);
delay_ms(500);
output_low(PIN_a0);
output_low(PIN_a1);
output_low(PIN_a2);
output_low(PIN_a4);
output_low(PIN_a5);
delay_ms(500);
}
}

como podran ver solo cambie el oscilador al INTRC_IO, al parecer las instrucciones del ADC no tuvieron ninguna incidencia, es decir que el C en si resetea el PIC a digital, por otro lado lo programe en ASSEMBLER, con este codigo:

__config 0x30D5

status    equ 0x03
trisio    equ 0x05
ansel    equ 0x1f
optionr   equ 0x01
gpio    equ 0x05
v1      equ 0x20
v2      equ 0x21

reset    org 0x00
      goto inicio
inicio    org 0x05
      movlw b"001000"
      bsf status,5
      movwf trisio
      clrf ansel
      bsf optionr,5
      bcf status,5

ciclo    bsf gpio,0
      bsf gpio,1
      bsf gpio,2
      bsf gpio,4
      bsf gpio,5
      call retardo
      bcf gpio,0
      bcf gpio,1
      bcf gpio,2
      bcf gpio,4
      bcf gpio,5
      call retardo
      goto ciclo

retardo   movlw 0x03
      movwf v1
dos      movlw 0x03
      movwf v2
uno      decfsz v2,1
      goto uno
      decfsz v1,1
      goto dos
      return
      end

En este caso los pines gp0 y gp1 se quedan encendidos y otra vez se parece a lo que hace el BASIC, el C al resetear todo a digital (esto es un supuesto) medio arregla el problema, por cierto alguien sabe como arreglar este problema en ASSEMBLER y BASIC, se que no es el hilo, pero ya llevo un poco de camino recorrido aqui.

Se que falta a la instruccion de seteo de algo que no encuentro.

Como motivador le obsequiare un 10f206 al que me lo pueda responder =o).

Saludos Cordiales.
















10f206

  • Visitante
RE: 16f683 no hace lo que se le dice
« Respuesta #6 en: 15 de Febrero de 2006, 15:48:00 »
Hola otra vez, les cuento que ya funciono, pero lo que no entiendo es por que, aqui va el codigo:

#include <12f683.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, NOMCLR
#use delay (clock=4000000) // Introduce la frecuencia de reloj
void main()
{
/* setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
set_tris_a(0x00); */
while (true)
{
output_high(PIN_a0);
output_high(PIN_a1);
output_high(PIN_a2);
output_high(PIN_a4);
output_high(PIN_a5);
delay_ms(500);
output_low(PIN_a0);
output_low(PIN_a1);
output_low(PIN_a2);
output_low(PIN_a4);
output_low(PIN_a5);
delay_ms(500);
}
}

como podran ver solo cambie el oscilador al INTRC_IO, al parecer las instrucciones del ADC no tuvieron ninguna incidencia, es decir que el C en si resetea el PIC a digital, por otro lado lo programe en ASSEMBLER, con este codigo:

__config 0x30D5

status    equ 0x03
trisio    equ 0x05
ansel    equ 0x1f
optionr   equ 0x01
gpio    equ 0x05
v1      equ 0x20
v2      equ 0x21

reset    org 0x00
      goto inicio
inicio    org 0x05
      movlw b"001000"
      bsf status,5
      movwf trisio
      clrf ansel
      bsf optionr,5
      bcf status,5

ciclo    bsf gpio,0
      bsf gpio,1
      bsf gpio,2
      bsf gpio,4
      bsf gpio,5
      call retardo
      bcf gpio,0
      bcf gpio,1
      bcf gpio,2
      bcf gpio,4
      bcf gpio,5
      call retardo
      goto ciclo

retardo   movlw 0x03
      movwf v1
dos      movlw 0x03
      movwf v2
uno      decfsz v2,1
      goto uno
      decfsz v1,1
      goto dos
      return
      end

En este caso los pines gp0 y gp1 se quedan encendidos y otra vez se parece a lo que hace el BASIC, el C al resetear todo a digital (esto es un supuesto) medio arregla el problema, por cierto alguien sabe como arreglar este problema en ASSEMBLER y BASIC, se que no es el hilo, pero ya llevo un poco de camino recorrido aqui.

Se que falta a la instruccion de seteo de algo que no encuentro.

Como motivador le obsequiare un 10f206 al que me lo pueda responder =o).

Saludos Cordiales.
















Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: 16f683 no hace lo que se le dice
« Respuesta #7 en: 15 de Febrero de 2006, 17:09:00 »
Hace años no uso el CCS pero si mal no recuerdo a delay_ms no le puedes mandar 500 como parámetro! sino uno numero que va entre 0 y 255.

Puede que el delay que ejecute sea muy pequeño y entonces no lo veas parpadear.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
RE: 16f683 no hace lo que se le dice
« Respuesta #8 en: 16 de Febrero de 2006, 03:20:00 »
Tengo el CCS 3221 y puedo asegurar haber usado delay_ms de 500 y 1000 sin ningun problema jejeje

10f206

  • Visitante
RE: 16f683 no hace lo que se le dice
« Respuesta #9 en: 16 de Febrero de 2006, 11:21:00 »
Encontre el problema, y por supuesto no es delay, es simplemente que el C efectua cun CMCON0=7, es decir que desactiva el comparador, lo cual es muy inteligente de parte de CCS, ya que el datasheet no habla nada que debe desactivarse aun con las patan en digital, es decir con ANSEL=0, es decepcionante ya que nadie habla de esta "caracteristica", comprendo que el 12f683 es uno de los pics con mas caracteristicas en pequeño paquete, pero me da miedo iniciar con el 18f4550 y tengo algunas docenas de 18f4620, ya que no se que sorpresas me esperan.

Es una lastima que nadie se quedara con 10f206 =o(

SC


P.S. Alguien sabe algo del MikroC, MikroPascal y MikroBasic.