Autor Tema: No consigo saber por qué hace mal este array  (Leído 2532 veces)

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

Desconectado JonGoten2

  • PIC10
  • *
  • Mensajes: 5
No consigo saber por qué hace mal este array
« en: 24 de Mayo de 2007, 17:06:41 »
Lo que hace el programa, es simplemente coger dato a dato de un array, y enviarlo por línea serie.
Pues bien, la primera vez (una vez encendido el micro), y con el primer dato del array, lo hace mal, y luego, lo hace bien siempre. Me explico:

El array es: int Viaje[10] = {0,1,2,3,4,5,6,7};
Y en el hyperterminal, se deberia de ver:
012345670123456701234567...

y en cambio, lo que se ve es:
~12345670123456701234567... Sí, con ese símbolo en primer lugar en vez de el 0

Os dejo el código (que es poquito), a ver si alguien sabe por qué pasa:



#include <16F88.h>
#define RAND_MAX 6
#include "stdlib.h"
#use delay(clock=4000000)
#fuses INTRC_IO, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, CCPB0, NOFCMEN, NOIESO
#use fast_io(B)
#use fast_io(A)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_A5,bits=8,stream=PC,errors,BRGH1OK)

#BYTE    PA = 0x05
#BYTE    PB = 0x06

int Viaje[10] = {0,1,2,3,4,5,6,7};
int i=0,j=0;

/********************************************************************************/
/*      PROGRAMA PRINCIPAL                  */
/********************************************************************************/
void main (void)

{
   set_tris_a(0xA1);   // 1: Entradas, 0: Salidas 10100001
   PA = 0x00;
   set_tris_b(0x00);   // 1: Entradas, 0: Salidas 00000000
   PB = 0x00;
   setup_oscillator(OSC_4MHZ);
   delay_ms(100);

     While (1)
   {
         j=0;
         do
         {
            delay_ms(100);
            printf("%d",Viaje[j]);
            j++;
         }
         while (j<=7);
   }
}

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: No consigo saber por qué hace mal este array
« Respuesta #1 en: 24 de Mayo de 2007, 18:18:50 »
Lo primero que haría sería poner while j<8 ya que el igual siempre puede traer problemas y lo segundo que probaría sería a quitar j=0 que tienes dentro del bucle while(1) ya que la tienes inicializada a cero en la declaración de la variable j y la metería despues del bucle, quedando el código así:

#include <16F88.h>
#define RAND_MAX 6
#include "stdlib.h"
#use delay(clock=4000000)
#fuses INTRC_IO, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, CCPB0, NOFCMEN, NOIESO
#use fast_io(B)
#use fast_io(A)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_A5,bits=8,stream=PC,errors,BRGH1OK)

#BYTE    PA = 0x05
#BYTE    PB = 0x06

int Viaje[10] = {0,1,2,3,4,5,6,7};
int i=0,j=0;

/********************************************************************************/
/*      PROGRAMA PRINCIPAL                  */
/********************************************************************************/
void main (void)

{
   set_tris_a(0xA1);   // 1: Entradas, 0: Salidas 10100001
   PA = 0x00;
   set_tris_b(0x00);   // 1: Entradas, 0: Salidas 00000000
   PB = 0x00;
   setup_oscillator(OSC_4MHZ);
   delay_ms(100);

     While (1)
   {
       
         do
         {
            delay_ms(100);
            printf("%d",Viaje[j]);
            j++;
         }
         while (j<8 );
         j=0;
   }
}

Y si no es primordial quitarías la sentencia BRGH1OK del rs232 pues no se para que sirve y es la primera vez que la veo, si eso pruebas lo que te he puesto y me explicas para que sirve dicha sentancia.

Un saludete y suerte.

Desconectado JonGoten2

  • PIC10
  • *
  • Mensajes: 5
Re: No consigo saber por qué hace mal este array
« Respuesta #2 en: 24 de Mayo de 2007, 18:43:25 »
Hola c4_esp_VR, pues con tu código hace exactamente lo mismo.

Lo del j=0 antes del while, es redundante. Como no funcionaba, por probar.
Y lo de BRGH1OK, según la ayuda del PICC: "Allow bad baud rates on chips that have baud rate problems." Lo tenía puesto porque había estado haciendo pruebas a otras velocidades.

Sigo sin saber por qué hace mal la primera vez :S
Seguiré investigando, si a alguien se le ocurre algo, que lo diga.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: No consigo saber por qué hace mal este array
« Respuesta #3 en: 25 de Mayo de 2007, 02:36:22 »
¿Has probado a otra velocidad?
Veo que en el #use no has declarado los bits de stop, quizás pudiera estar ahí el error, pero es rarito.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: No consigo saber por qué hace mal este array
« Respuesta #4 en: 25 de Mayo de 2007, 04:20:40 »
Hola JonGoten2!

El fuse 'INTRC_IO' lo pones para utilizar el oscilador interno del PIC y ahorrarte el oscilador de 4 Mhz?

No creo que tenga que ver, puesto que, te fuciona casi bien, pero... recuerdo haber leido por algún sitio que cuando haces una comunicación RS232 es recomendable utilizar un cristal de cuarzo.

No se me ocurre otra cosa, es muy extraño el problema ¿?¿?


Un saludo desde Alicante.

Desconectado JonGoten2

  • PIC10
  • *
  • Mensajes: 5
Re: No consigo saber por qué hace mal este array
« Respuesta #5 en: 25 de Mayo de 2007, 04:45:39 »
Lo de los bit de stop, tendré que probar a ver. A otras velocidades ya he probado, y hace lo mismo.

Sí que estoy utilizando el oscilador interno del pic. También es cierto que había pensado en uno externo para más precisión, pero a partir del primer dato, en ninguno más se produce error, así que no creo que sea la causa.

Parece más como que al enviar el primer caracter, la línea serie no se ha inicializado o algo así. Hace falta inicializarla de alguna forma? Se me ocurre mandar un caracter cualquiera en el arranque del PIC y así al enviar los datos ya no habría error... no sé. No me suena que haya que inicializar la línea serie.


 

anything