Autor Tema: contador de 0 a 999 en C  (Leído 13620 veces)

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

Desconectado sir_alex

  • PIC10
  • *
  • Mensajes: 5
contador de 0 a 999 en C
« en: 09 de Abril de 2010, 23:21:37 »
Hola que tal, adentrandome en la programacion de AVR's, estoy trabajando en un programa que se supondria es sencillo, sin embargo salio lo contrario.

Bien explico; la idea es hacer en C (uso codevision) un programa para  un conteo leido por un PINC (en este caso uso el puerto C), y que lo muestre en un lcd 2x16, que valla contando de 0 a 999, uso un atmega48, realmente solo lo he simulado por ahora.

Tengo poblemas porque no me muestra el caracter si le pongo la variable (var1), pero si lo pongo en hexadecimal si lo muestra el lcd, ahora, se supone que debe incrementar el dato cada vez que se oprima el pushboton, pero no logro que se muestre, a lo mejor estoy usando otro tipo de variable, pero estoy seguro que con "char" deberia funcionar, bien les dejo el pequeño condigo y un link donde esta armado en proteus, ojala me puedan auxiliar.
No es justificacion, pero a penas he comenzado con C y he estado estudiando estas ultimas hrs, quiza es porq deba despejarme un poco y despues piense mejor, suele pasar, pero si alguien sabe mas, que mejor, saludos! gracias

Código: [Seleccionar]
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.6 Evaluation
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : codevision_contador_m48_01
Version : 1.00
Date    : 09/04/2010
Author  : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type           : ATmega48
Clock frequency     : 1.000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 128
*****************************************************/

#include <mega48.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x05 ;PORTB
#endasm
#include <lcd.h>

// Declare your global variables here
#define sensor PINC.0

bit sensorp;
bit sensora;
unsigned char var1;

const char tablanumeros[var1]={
                                0x30,
                                0x31,
                                0x32,
                                0x33,
                                0x34,
                                0x35,
                                0x36,
                                0x37,
                                0x38,
                                0x39,
                               
                            };

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 8
#pragma optsize-
CLKPR=0x80;
CLKPR=0x03;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTC=0x7F;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;

// LCD module initialization
lcd_init(16);

while (1)
      {
        lcd_gotoxy(15,0);
        lcd_putchar(0x30);
        delay_ms(200); //Delay de 1 segundo para poder ver el efecto
        if (sensor==0)
        {
            var1++;
            lcd_clear();
            lcd_gotoxy(15,0);
            lcd_putchar(var1);
            delay_ms(4000);
                       
        }
     
     
      };
}


liga a codigo y simulacion

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: contador de 0 a 999 en C
« Respuesta #1 en: 16 de Abril de 2010, 19:20:51 »
Hola, supongo que en "#define sensor PINC.0" se sustituye el valor del pin 0 del puerto C cada vez que el pulsador se va a tierra.


La variable var1 es de tipo char, si quieres iniciar un conteo debes almacenarlo en un int y así que para poder mostrarla en una pantalla LCD debes transformar de int a ASCII usando una función como itoa().

Creo que te falta definir el valor inicial de Var1  :D, además en la línea "delay_ms(200); //Delay de 1 segundo para poder ver el efecto" pondría "delay_ms(1000)" porque mil milisegundos equivalen a un segundo.

¿Para que definiste "const char tablanumeros[var1]" ? ¿Dónde la ocupas? :?

« Última modificación: 17 de Abril de 2010, 01:54:25 por The_Chosen »

Desconectado sir_alex

  • PIC10
  • *
  • Mensajes: 5
contador de 0 a 999 en C (traduccion)
« Respuesta #2 en: 20 de Abril de 2010, 17:04:29 »
Hola que tal, he hallado un codigo para contar de 0 a 99, pero esta programado en BASCOM, y lo necesito para C (codevisionavr compiler C) por favor, si alguien puede ayudarme a traducir el programa, parece sensillo, lo que no entiendo es al momento de llamar la tabla :(, como se debe llamar... bueno y ya probe el codigo en Proteus funciona perfectamente, y bueno si la verdad quisiera contar hasta 1000. pero con que entienda ese codigo en C para codevision seria perfecto gracias saludos! :oops:

Código: [Seleccionar]
#include <16F628A.h>
#fuses INTRC_IO,NOCPD,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOMCLR
#use delay(clock=4M)
#define use_portb_lcd TRUE
#include <lcd.c>

char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0;

void visualizar()
{
   lcd_gotoxy(8,1);
   printf(lcd_putc, "%c",tabNum[i]);
   printf(lcd_putc, "\b");
   
   lcd_gotoxy(7,1);
   printf(lcd_putc, "%c",tabNum[j]);
   printf(lcd_putc, "\b");
   
}

void cuenta()
{
   if(!input(PIN_A0))
   {
      do
      {
      }while(!input(PIN_A0));
      i++;
      if(i>=10)
      {
         i=0; j++;
         if(j>=10)
         {
            j=0;
         }
      }
   }
}

void main(void)
{
   lcd_init();
   printf(lcd_putc, "Presione Boton\n para continuar ");
   
   do
   {
   }while(input(PIN_A0)==1);
   printf(lcd_putc, "\f");
   printf(lcd_putc, " \n  CONTADOR LCD");
   lcd_gotoxy(8,1);
   
   do
   {
      visualizar();
      cuenta();
   }while(TRUE);
}
           


Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: contador de 0 a 999 en C (traduccion)
« Respuesta #3 en: 20 de Abril de 2010, 18:14:21 »
Hola que tal, he hallado un codigo para contar de 0 a 99, pero esta programado en BASCOM, y lo necesito para C (codevisionavr compiler C) por favor, si alguien puede ayudarme a traducir el programa, parece sensillo, lo que no entiendo es al momento de llamar la tabla :(, como se debe llamar... bueno y ya probe el codigo en Proteus funciona perfectamente, y bueno si la verdad quisiera contar hasta 1000. pero con que entienda ese codigo en C para codevision seria perfecto gracias saludos! :oops:

Código: [Seleccionar]
#include <16F628A.h>
#fuses INTRC_IO,NOCPD,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOMCLR
#use delay(clock=4M)
#define use_portb_lcd TRUE
#include <lcd.c>

char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0;

void visualizar()
{
   lcd_gotoxy(8,1);
   printf(lcd_putc, "%c",tabNum[i]);
   printf(lcd_putc, "\b");
   
   lcd_gotoxy(7,1);
   printf(lcd_putc, "%c",tabNum[j]);
   printf(lcd_putc, "\b");
   
}

void cuenta()
{
   if(!input(PIN_A0))
   {
      do
      {
      }while(!input(PIN_A0));
      i++;
      if(i>=10)
      {
         i=0; j++;
         if(j>=10)
         {
            j=0;
         }
      }
   }
}

void main(void)
{
   lcd_init();
   printf(lcd_putc, "Presione Boton\n para continuar ");
   
   do
   {
   }while(input(PIN_A0)==1);
   printf(lcd_putc, "\f");
   printf(lcd_putc, " \n  CONTADOR LCD");
   lcd_gotoxy(8,1);
   
   do
   {
      visualizar();
      cuenta();
   }while(TRUE);
}
           



jejejeje, interesante programa. En realidad no cuenta nada, lo que hace es mostrar los caracteres ascii almacenados en char tabNum[10] y mostrarlos según los valores de las variables i y j.
Creo que lo que tu quieres es modificar una variable almacenada previamente, aumentarla por una señal externa y que se muestre luego en un pantalla LCD. ¿Cierto? Depende de tu respuesta, los programas para ambos casos son ligeramente distintos.

Desconectado FuYiVape

  • PIC12
  • **
  • Mensajes: 69
    • Electronica y Sistemas
Re: contador de 0 a 999 en C
« Respuesta #4 en: 20 de Abril de 2010, 23:53:32 »
Hola sir_alex

te paso un codigo para que te des una idea de como haerlo de forma sencilla.

Código: [Seleccionar]
//Puntero a char
char *TextLCD;

//array de chars para guardar el resultado
char FormatedString[17]; //16 chars Linea LCD

//Contador
unsigned int cuenta = 0;



void main(void)
{

...
LOOP
while(input(PIN_A0)==1);  //nota***
cuenta++;

//formateamos el numero
sprintf(FormatedString, "%s%04d", "CUENTA: ", cuenta, );

//Si es necesario, hacemos que el puntero apunte al array
TextLCD = FormatedString; //Mis rutinas de LCD reciben punteros, por eso lo hago asi.

//Enviamos el string al LCD
....

if(cuenta>999)
cuenta = 0;
LOOP

Con la funcion sprintf formateas el string y lo guardas en el array FormatedString para luego enviarlo al LCD.
El parametro %04d en la funcion sprintf, indica que debe formatear el entero a decimal ascii usando 4 digitos y llenando con ceros a la izquierda.
Donde digo "//Enviamos el string al LCD" tienes que aplicar el codigo que necesites para hacerlo.


Yo codifico usando AVRGCC, pero supongo que las declaraciones son las mismas.

nota***: input(pin) no es de AVRGCC

Espero te sirva!
Saludos.

Desconectado sir_alex

  • PIC10
  • *
  • Mensajes: 5
CONCLUSION contador de 0 a 999 en C
« Respuesta #5 en: 29 de Abril de 2010, 13:54:44 »
Hola que tal les cuento que ya pude realizar este programa, aqui se los dejo (el codigo) para que lo prueben. saludos y gracias por sus respuestas
 :-/ :-/ :-/ 8)

Código: [Seleccionar]
//contador
//*******************************
#define boton PINC.0


char var1;
char var2;
char var3;
//bit botonp;
//bit botona;

const unsigned char tablanumeros[10]={
                                0x30,
                                0x31,
                                0x32,
                                0x33,
                                0x34,
                                0x35,
                                0x36,
                                0x37,
                                0x38,
                                0x39,
                               
                            };
//**************

while (1)
      {
        lcd_clear();
        delay_ms(100);
       
        if (boton==0)       //condicion se boton esta oprimido
        {
            var1++;         
            delay_ms(40);     
        }
        if (var1==10)
        {
                var1=0;
                var2++;
                delay_ms(400);
        }
        if (var2==10)
        {
                var2=0;
                var3++;
                delay_ms(500);
        }
                lcd_gotoxy(15,0);
                lcd_putchar(tablanumeros[var1]);
                lcd_gotoxy(14,0);
                lcd_putchar(tablanumeros[var2]);
                lcd_gotoxy(13,0);
                lcd_putchar(tablanumeros[var3]);
                delay_ms(150);
               
      }


 

anything