Discussion:
manejo de matrices
(demasiado antiguo para responder)
j***@gmail.com
2007-05-01 15:20:38 UTC
Permalink
Hola a ***@s de nuevo.

Aqui estoy peleandome con migo mismo :)


Trabajo con el microcontrolador ATMEGA32 y avr-libc.

Tengo este programa:

main (void)
{

int *pa;

int numeros[][11] =
{
// Valores de los numeros del 0 al 9
0x3F, 0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67, 0xFF
};

pa= &numeros[4];

DDRB=0xFF; //Puerto de datos del 7-segmentos
DDRA=0xFF; // Puerto de control de 7-segmentos.
PORTA |= _BV(PD0); //seet del 7-segmentos de decenas.

PORTB= *pa;



} //main(void)

al compilar me da esto.

***@cuelebre:~/avr$ sh compilar.sh DS1631.c
DS1631.c: In function 'main':
DS1631.c:66: warning: assignment from incompatible pointer type
Atmel AVR ATmega32 is found.
Erasing device ...
Reinitializing device
Atmel AVR ATmega32 is found.
Atmel AVR ATmega32 is found.
Uploading: flash

Y en el 7 segmentos en vez de mostrarme el nº 4, me pone datos
erroneos..

Que hago mal.?

S2.
j***@gmail.com
2007-05-01 15:28:36 UTC
Permalink
Nada ***@s:

Ya esta solucionado :)

Estaba haciendo mal la matriz

int numeros[][11] =

y debe ser

int numeros[11] =

S2, y gracias de todos modos.
Zephryn Xirdal
2007-05-01 16:10:10 UTC
Permalink
Pues te está funcionando de potra. Mira mi otro mensaje.
Post by j***@gmail.com
Ya esta solucionado :)
Estaba haciendo mal la matriz
int numeros[][11] =
y debe ser
int numeros[11] =
S2, y gracias de todos modos.
--
Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
========================================
Si hubiera un solo hombre inmortal sería asesinado por los envidiosos.
-- Chumy Chomez.
j***@gmail.com
2007-05-01 17:56:19 UTC
Permalink
Vale, voy a probar como tu me dices.

¿Como sabes que es un unsigned char el tipo de dato que se debe enviar
al puerto.?

S2.
Zephryn Xirdal
2007-05-01 18:00:46 UTC
Permalink
Post by j***@gmail.com
Vale, voy a probar como tu me dices.
¿Como sabes que es un unsigned char el tipo de dato que se debe enviar
al puerto.?
S2.
No lo sé con certeza, pero generalmente los puertos de un micro de 8 bits
son de 8 bits.
--
Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
========================================
Si hubiera un solo hombre inmortal sería asesinado por los envidiosos.
-- Chumy Chomez.
j***@gmail.com
2007-05-01 18:07:42 UTC
Permalink
Hola de nuevo, mira este es el codigo que estoy probando ahora mismo.

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iocompat.h>
#include <util/twi.h>

#define F_CPU 1000000UL // 1 MHz
//#define F_CPU 14.7456E6

#include <util/delay.h>

void _delay_sg( uint16_t segundos)
{
uint8_t tiempo;
tiempo= segundos *4;
while( tiempo >0)
{
_delay_ms(250);
tiempo--;
}
}


imprime(int8_t valor)
{
char buffer[3];
char numero;
int digito;
int espera= 15;
int numeros[10] =
{
// Valores de los numeros del 0 al 9
0x3F, 0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67
};

itoa(valor, buffer,10);
if (valor<10)
{
while (espera> 0)
{
PORTA = _BV(PD0) | ~(_BV(PD1));
PORTB= numeros[buffer[0]-48];
_delay_ms(10);
PORTA = ~(_BV(PD0)) | _BV(PD1);
PORTB= numeros[0];
_delay_ms(10);
espera--;
PORTA &= _BV(PD0) | ~(_BV(PD1));
}
}
else
{
while (espera> 0)
{
PORTA = _BV(PD0) | ~(_BV(PD1));
PORTB= numeros[buffer[1]-48];
_delay_ms(10);
PORTA = ~(_BV(PD0)) | _BV(PD1);
PORTB= numeros[buffer[0]-48];
_delay_ms(10);
espera--;
PORTA &= _BV(PD0) | ~(_BV(PD1));
}
}
}

main (void)
{



DDRB=0xFF;
DDRA=0xFF;
int cont;
cont=0;
while (1)
{
imprime(cont);
cont++;
if (cont>99) cont=0;
}




} //main(void)

Y funciona bien.

S2.
Zephryn Xirdal
2007-05-01 19:00:59 UTC
Permalink
Teóricamente, el sacar por un puerto de 8 bits un valor de 16 saca la
parte baja y descarta la alta, lo que no entiendo es cómo no te avisa el
compilador.
Post by j***@gmail.com
Hola de nuevo, mira este es el codigo que estoy probando ahora mismo.
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iocompat.h>
#include <util/twi.h>
#define F_CPU 1000000UL // 1 MHz
//#define F_CPU 14.7456E6
#include <util/delay.h>
void _delay_sg( uint16_t segundos)
{
uint8_t tiempo;
tiempo= segundos *4;
while( tiempo >0)
{
_delay_ms(250);
tiempo--;
}
}
imprime(int8_t valor)
{
char buffer[3];
char numero;
int digito;
int espera= 15;
int numeros[10] =
{
// Valores de los numeros del 0 al 9
0x3F, 0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67
};
itoa(valor, buffer,10);
if (valor<10)
{
while (espera> 0)
{
PORTA = _BV(PD0) | ~(_BV(PD1));
PORTB= numeros[buffer[0]-48];
_delay_ms(10);
PORTA = ~(_BV(PD0)) | _BV(PD1);
PORTB= numeros[0];
_delay_ms(10);
espera--;
PORTA &= _BV(PD0) | ~(_BV(PD1));
}
}
else
{
while (espera> 0)
{
PORTA = _BV(PD0) | ~(_BV(PD1));
PORTB= numeros[buffer[1]-48];
_delay_ms(10);
PORTA = ~(_BV(PD0)) | _BV(PD1);
PORTB= numeros[buffer[0]-48];
_delay_ms(10);
espera--;
PORTA &= _BV(PD0) | ~(_BV(PD1));
}
}
}
main (void)
{
DDRB=0xFF;
DDRA=0xFF;
int cont;
cont=0;
while (1)
{
imprime(cont);
cont++;
if (cont>99) cont=0;
}
} //main(void)
Y funciona bien.
S2.
--
Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
========================================
Si hubiera un solo hombre inmortal sería asesinado por los envidiosos.
-- Chumy Chomez.
j***@gmail.com
2007-05-01 22:11:51 UTC
Permalink
Disculpa, pero me he perdido.

¿Cual es el valor de 16 bits al que te refieres.?

S2.
Zephryn Xirdal
2007-05-02 08:25:19 UTC
Permalink
Post by j***@gmail.com
Disculpa, pero me he perdido.
¿Cual es el valor de 16 bits al que te refieres.?
S2.
defines un array de enteros, que en un micro de 8 bits han de ser de 16
bits.

Luego tomas un valor de ese array de enteros y lo asignas a un puerto de 8
bits:

int hola;

unsigned char *puerto=(unsigned char *)0x0345; //La dirección es inventada

*puerto=hola;
--
Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
========================================
Si hubiera un solo hombre inmortal sería asesinado por los envidiosos.
-- Chumy Chomez.
Zephryn Xirdal
2007-05-01 16:06:34 UTC
Permalink
Programar hardware no es lo mismo que programar software.

En primer lugar el puerto serie recibe unsiged char, y tu estás enviando
int. Primer problema.

Segundo: el array debe ser de unsigned char, y el puntero también.
Posiblemente por el puerto estés poniendo el byte siguiente al que quieres
sacar.
Post by j***@gmail.com
Aqui estoy peleandome con migo mismo :)
Trabajo con el microcontrolador ATMEGA32 y avr-libc.
main (void)
{
int *pa;
int numeros[][11] =
{
// Valores de los numeros del 0 al 9
0x3F, 0x06,0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67, 0xFF
};
pa= &numeros[4];
DDRB=0xFF; //Puerto de datos del 7-segmentos
DDRA=0xFF; // Puerto de control de 7-segmentos.
PORTA |= _BV(PD0); //seet del 7-segmentos de decenas.
PORTB= *pa;
} //main(void)
al compilar me da esto.
DS1631.c:66: warning: assignment from incompatible pointer type
Atmel AVR ATmega32 is found.
Erasing device ...
Reinitializing device
Atmel AVR ATmega32 is found.
Atmel AVR ATmega32 is found.
Uploading: flash
Y en el 7 segmentos en vez de mostrarme el nº 4, me pone datos
erroneos..
Que hago mal.?
S2.
--
Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
========================================
Si hubiera un solo hombre inmortal sería asesinado por los envidiosos.
-- Chumy Chomez.
Loading...