Duda ATmega8/128 contador/TIMER

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)
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
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.

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);
				}
			
		}
			
	}
}
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.

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.

osci.jpg
 
Atrás
Arriba