Witam!
Chciałem dziś "pogadać" z układem scalonym przez SDIO w ten sposób że wysyłam informacje przez RS232 do µC a on "rozmawia" z urządzeniem peryferyjnym i odsyła z powrotem do PC otrzymane informacje.
Niby zadanie proste, tym bardziej że ATtiny2313 posiada wbudowaną obsługę szeregową.
Ale widocznie los nie jest tak łaskawy...
W pewnym momencie pisząc program postanowiłem go przetestować i zobaczyć czy połączy się z urządzeniem peryferyjnym. W tym momencie pojawił się problem taki, że kontroler odbiera informacje które mu wysyłam ale nic z nimi nie robi.
Kod:
I owy program powinien zadziałać tak, że gdy wysyłam powiedzmy liczbę 23 przez RS232 to taką także powinienem otrzymać. Efekt jest taki że otrzymuję liczbę 2 (czyli liczbę którą przypisałem przy deklarowaniu zmiennej).
Próbowałem to zrobić nawet za pomocą wskaźnika:
Ale efekt jest ten sam.
Siedzę nad tym niemal cały dzień i już skończyły mi się pomysły.
Programuję w środowisku Linux za pomocą AVRDUDE.
Pozdrawiam
Chciałem dziś "pogadać" z układem scalonym przez SDIO w ten sposób że wysyłam informacje przez RS232 do µC a on "rozmawia" z urządzeniem peryferyjnym i odsyła z powrotem do PC otrzymane informacje.
Niby zadanie proste, tym bardziej że ATtiny2313 posiada wbudowaną obsługę szeregową.
Ale widocznie los nie jest tak łaskawy...
W pewnym momencie pisząc program postanowiłem go przetestować i zobaczyć czy połączy się z urządzeniem peryferyjnym. W tym momencie pojawił się problem taki, że kontroler odbiera informacje które mu wysyłam ale nic z nimi nie robi.
Kod:
#include <avr/io.h> //główna biblioteka
#include <avr/interrupt.h> //biblioteka od przerwań
#define F_CPU 8000000UL //taktowanie wew. zegara 8MHz
#include <util/delay.h> //biblioteka od przerwań
#define UART_BAUD 9600 //prędkość transmisji szeregowej
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1) //obliczanie kodu
#define LED_ON PORTD |= _BV(3) //włącz diode sygnalizacyjną
#define LED_OFF PORTD &= ~_BV(3) //wyłącz diodę sygnalizacyjną
#define CAM1 0 //pin od urządzenia peryferyjnego
#define ON_CAM1 DDRB |= _BV(CAM1); PORTB &= ~_BV(CAM1) //włącz je
#define OFF_CAM1 DDRB &= ~_BV(CAM1); PORTB |= _BV(CAM1) //wyłącz je
unsigned int i, znak=2; //deklaracja zmiennych
//----------------------------------------------------------------------------------------------
void Init_RS232(void){ //Funkcja włączająca transmisję RS232
UBRRH = (unsigned char)(UART_CONST>>8); //wpisanie prędkości transmisji
UBRRL = (unsigned char)UART_CONST;
UCSRB = _BV(RXEN) | _BV(RXCIE) | _BV(TXEN); //transmisja w obydwie strony z obsługą przerwania od pobierania informacji
UCSRC = ~_BV(UMSEL); // transmisja asynchroniczna
}
void Init_Synchronics(void){ // Funkcja od transmisji SDIO
UBRRH = (unsigned char)(UART_CONST>>8); //wpisanie prędkości transmisji
UBRRL = (unsigned char)UART_CONST;
UCSRB = _BV(RXEN) | _BV(TXEN); //transmisja w obydwie strony
UCSRC = _BV(UMSEL) | _BV(UCSZ0) | _BV(UCSZ1) | ~_BV(USBS); //synchroniczna, 8bitów i 1bit stopu
}
SIGNAL(SIG_USART0_RECV) //przerwanie od pobierania danych z RS232
{
while( !(UCSRA & (1<<RXC)) ); //czekaj aż zakończona zostanie transmisja
znak = UDR; //wpisz otrzymaną daną do zmiennej "znak"
}
void wyslij(unsigned char data){ //funkcja od wysyłania informacji
while( !(UCSRA & (1<<UDRE)) );
UDR = data;
}
unsigned char odbior(void){ //funkcja od odbioru informacji
while( !(UCSRA & (1<<RXC)) );
return UDR;
}
int main(void) //--------------------------------------------------------------------
{
DDRD = 0x08; //pin 4 w stanie wysokiem
PORTD= 0xF7;
DDRB = 0xFF;
PORTB = 0xFE;
Init_RS232(); //inicjacja RS232
OFF_CAM1; //wyłącz urządzenie peryferyjne
sei(); //włącz przerwania
while(1){
wyslij(znak); //wyślij przez RS232 otrzymany znak
_delay_ms(255);
_delay_ms(255);
_delay_ms(255);
}
}I owy program powinien zadziałać tak, że gdy wysyłam powiedzmy liczbę 23 przez RS232 to taką także powinienem otrzymać. Efekt jest taki że otrzymuję liczbę 2 (czyli liczbę którą przypisałem przy deklarowaniu zmiennej).
Próbowałem to zrobić nawet za pomocą wskaźnika:
...
int *wektor = &znak;
...
SIGNAL(SIG_USART0_RECV)
{
while( !(UCSRA & (1<<RXC)) );
*wektor = UDR;
}
...Ale efekt jest ten sam.
Siedzę nad tym niemal cały dzień i już skończyły mi się pomysły.
Programuję w środowisku Linux za pomocą AVRDUDE.
Pozdrawiam