Hola compañeros. Estoy haciendo un trabajo en el cual debo posicionar una base principal con 3 minibases mediante RF a 434MHz.
Utilizo para la principal la ATmega128 para poder utilizar dos UART(emisión de prioridad a minibases y emisión de datos a PC) y para las minis utilizo ATmega8 ya que solo necesito un TXD/RXD.
Mi idea surge de un proyecto anterior en el cual no funcionaba correctamente, ya que no podía dar prioridad a las minibases (Sólo disponía de ATmega8 y la base principal recibía de las minis y emitía al PC).
Ahora con ATmega128 mi intención es emitir una prioridad para poder luego triangular ya que no emitirían a la vez.
Resumen:
Base principal emite valor X durante z segundos
base1,base2 y base3 comparan valor con el suyo propio para saber cual debe responder
espera hasta que la base principal para de emitir
base1 emite valor Y durante z segundos
Base principal recibe valor Y y entonces cambia de valor de emisión para seleccionar otra base.
Como he comentado antes, vengo de un proyecto anterior, el cual está hecho en ensamblador, por simplicidad y variación de código, lo he portado todo a C. El problema viene que el proyectista anterior emitía 40veces con su prescaler ( el cual yo sigo utilizando) y luego paraba durante 1 segundo (TIMER1 hacia 3906 ciclos).
En mi caso, ese TIMER1 creo que no es necesario, solo que debería tener un timer o algo que desde que la minibase recibe el primer valor, ésta espere esos z segundos para emitir, ya que si no se solaparían las señales(todas a la misma frecuencia).
A continuación les muestro el código utilizado por el proyectista anterior.
Código ASM base 1(Adjunto imagen)
Este código sólo emitía.
El siguiente es el mio, hecho en C, el cual debería comparar y si es el valor deseado ( selección de base), emite.
USART_Transmit y USART_Init son los propios del datasheet.
Puse el delay en milisegundos para intentar hacer esperar, pero si no selecciona esta base, empieza a hacer retrasos dentro del bucle, que podría NO recibir señal cuando si que sea necesario.
Y otra duda es, el bucle de 40 que está en ensamblador está afectado por el prescaler? Ya que me idea es utilizar un for (como muestro en el código en C). Y emitir exactamente igual que él.
Gracias por la ayuda y feliz navidad.
El código utilizado viene del propio Datasheet, salvo pequeñas variaciones.
Utilizo para la principal la ATmega128 para poder utilizar dos UART(emisión de prioridad a minibases y emisión de datos a PC) y para las minis utilizo ATmega8 ya que solo necesito un TXD/RXD.
Mi idea surge de un proyecto anterior en el cual no funcionaba correctamente, ya que no podía dar prioridad a las minibases (Sólo disponía de ATmega8 y la base principal recibía de las minis y emitía al PC).
Ahora con ATmega128 mi intención es emitir una prioridad para poder luego triangular ya que no emitirían a la vez.
Resumen:
Base principal emite valor X durante z segundos
base1,base2 y base3 comparan valor con el suyo propio para saber cual debe responder
espera hasta que la base principal para de emitir
base1 emite valor Y durante z segundos
Base principal recibe valor Y y entonces cambia de valor de emisión para seleccionar otra base.
Como he comentado antes, vengo de un proyecto anterior, el cual está hecho en ensamblador, por simplicidad y variación de código, lo he portado todo a C. El problema viene que el proyectista anterior emitía 40veces con su prescaler ( el cual yo sigo utilizando) y luego paraba durante 1 segundo (TIMER1 hacia 3906 ciclos).
En mi caso, ese TIMER1 creo que no es necesario, solo que debería tener un timer o algo que desde que la minibase recibe el primer valor, ésta espere esos z segundos para emitir, ya que si no se solaparían las señales(todas a la misma frecuencia).
A continuación les muestro el código utilizado por el proyectista anterior.
Código ASM base 1(Adjunto imagen)
Código:
int_overflow:
IN srri, SREG ; guarda stack
ldi temp, (1<<TXEN) ; Encendemos la transmision de datos USART
out UCSRB, temp
LDI cnt,40 ; enviamos 40 veces
bucle:
LDI temp, 0x38 ; envia el valor 8 en ascii para la señal de la base1
RCALL USART_Transmit
DEC cnt
BRNE bucle
ldi temp, (0<<TXEN) ; apaga el USART
out UCSRB, temp
LDI rh, 0xF0 ; se pone el contador del TIMER1 a F0BE para contar 3906 ciclos y llegar al segundo
LDI rl, 0xBE
OUT TCNT1H, rh
OUT TCNT1L,rl
OUT SREG, srri ; retorna stack
RETI
El siguiente es el mio, hecho en C, el cual debería comparar y si es el valor deseado ( selección de base), emite.
Código:
#define FOSC 1000000// Clock Speed
#define BAUD 4800
#define MYUBRR (FOSC/BAUD)-1
void main(void)
{
unsigned char a;
unsigned char x;
int k;
a='8';
USART_Init(MYUBRR);
while(1)
{
x=USART_Receive();
if (x=='1')
{
//_delay_ms(100); Esto era mi intento de hacer esperar a la hora de emitir y no solapar.
for (k=0;k<40;k++)
{
USART_Transmit(a);
}
}
}
}
Puse el delay en milisegundos para intentar hacer esperar, pero si no selecciona esta base, empieza a hacer retrasos dentro del bucle, que podría NO recibir señal cuando si que sea necesario.
Y otra duda es, el bucle de 40 que está en ensamblador está afectado por el prescaler? Ya que me idea es utilizar un for (como muestro en el código en C). Y emitir exactamente igual que él.
Código:
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}
void USART_Init( unsigned int ubrr )
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* 2x speed */
UCSRA = (1 << U2X);
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
}
Gracias por la ayuda y feliz navidad.
El código utilizado viene del propio Datasheet, salvo pequeñas variaciones.
