Witam.
Napisałem sterownik do serwa modelarskiego na Atmega 8. Teraz próbuje skomunikować ten sterownik z druga Atmegą 8, aby przesyłać pozycje zerwa z drugiej Atmegi do sterownika. Jednak napotkałem pewne kłopoty.
Oto program do drugiej Atmegi:
Ten program działa dobrze, jak i sam Uart. Sprawdzałem i dana jest wysyłąna.
Oto program sterownika:
Sam sterownik działa dobrze, tzn. sygnał do serwa jest dobrze generowany, serwo ustawia się w pozycji środkowej i trzyma. jednak nic nie jest odbierane przez Uart.
Czy ktoś z Was mógłby rzucić okiem na ten program. Może uda Wam się zauważyc błąd.
Pozdrawiam i z góry dziękuje za pomoc
Napisałem sterownik do serwa modelarskiego na Atmega 8. Teraz próbuje skomunikować ten sterownik z druga Atmegą 8, aby przesyłać pozycje zerwa z drugiej Atmegi do sterownika. Jednak napotkałem pewne kłopoty.
Oto program do drugiej Atmegi:
#include<avr/io.h>
#include<util/delay.h>
#include<uart.c>
unsigned char dana=100;
int i=0;
void USART_Init()
{
UBRRH = 0x00;
UBRRL = 6; //REJESTRY USTAWIAJĄCE PRĘDKOŚĆ TRANSMISJI (9600)
UCSRB = _BV(TXEN); //WL MODULU NADAWCZEGO
UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1); //Słowo 8 bitów, jeden bit stopu
}
void Zwieksz()
{
if((bit_is_clear(PINC,0)) && (dana < 240)) dana++;
}
void Zmniejsz()
{
if((bit_is_clear(PINC,1)) && (dana > 60)) dana--;
}
int main()
{
USART_Init();
DDRC=0x00;
PORTC=0xFF;
_delay_ms(3000);
while(1)
{
Zwieksz();
Zmniejsz();
UART_Wyslij(dana);
_delay_ms(100);
}
}
Ten program działa dobrze, jak i sam Uart. Sprawdzałem i dana jest wysyłąna.
Oto program sterownika:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<uart.c>
#include<HD44780.c>
#include<stdlib.h>
//-------- Sterownik 1 serw ---------
int Pwm=1500;
char buf[5];
int Skok = 10;
void USART_Init()
{
UBRRH = 0;
UBRRL = 6; //REJESTRY USTAWIAJĄCE PRĘDKOŚĆ TRANSMISJI (9600)
UCSRB = _BV(RXEN); //WL MODULU ODBIORCZEGO
UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1); //Słowo 8 bitów, jeden bit stopu
}
void Port_Init()
{
DDRB = 0xFF; //LCD
DDRC = 0xFF; //Serwo
}
void Timer1_Init()
{
TCCR1B |= ((1<<WGM12) | (1<<CS10)); //Timer 1 w trybie CTC bez preskalera
}
void Timer2_Init()
{
TCCR2 |= ((1<<WGM21) | (1<<CS20) | (1<<CS22)); //Timer 2 w trybie CTC z preskalerem przez 64
TIMSK |= (1<<OCIE2); //Zezwolenie na przerwanie od Timer 2
OCR2 = 156; //odliczanie 20 ms
}
void Timer1()
{
TCNT1 = 0x00;
TIFR |= (0<<OCF1A);
OCR1A = Pwm;
PORTC = 0xFF;
while (bit_is_clear (TIFR, OCF1A))
{
}
PORTC = 0x00;
}
int main()
{
LCD_Initalize();
LCD_Clear();
Port_Init();
Timer1_Init();
Timer2_Init();
sei();
while (1)
{
while(bit_is_clear(UCSRA, RXC))
{}
Pwm=UART_Odbierz()*10;
itoa(Pwm,buf,10);
LCD_Clear();
LCD_WriteText(buf);
_delay_ms(2);
}
}
ISR (TIMER2_COMP_vect)
{
Timer1();
}
Sam sterownik działa dobrze, tzn. sygnał do serwa jest dobrze generowany, serwo ustawia się w pozycji środkowej i trzyma. jednak nic nie jest odbierane przez Uart.
Czy ktoś z Was mógłby rzucić okiem na ten program. Może uda Wam się zauważyc błąd.
Pozdrawiam i z góry dziękuje za pomoc