Witam, mam taki problem: napisałem program, który ma pobierać czas za pomoca zegara DS1305 przez magistrale SPI i wysyłać wyniki przez RS232. Chwilowo program ma odbierać tylko sekundy. A date wrzucilem taka losowa
Problem jest taki ze ta magistrala nic nie odbiera (na RS nie wyswietlaja mi sie wyniki tj wyswietla mi sie tylko krzak maly, tam gdzie jest wypisywanie chara z wynikiem pomiaru na RS, a wyniku konwersji na system 16tkowy odebranych danych wogole nie ma). RS-232 jest napewno skonfigurowany dobrze. Spojrzcie prosze, czy nie zrobilem gdzies bledow w kodzie jezeli chodzi o SPI, bo mi już się kończą pomysły.
Problem jest taki ze ta magistrala nic nie odbiera (na RS nie wyswietlaja mi sie wyniki tj wyswietla mi sie tylko krzak maly, tam gdzie jest wypisywanie chara z wynikiem pomiaru na RS, a wyniku konwersji na system 16tkowy odebranych danych wogole nie ma). RS-232 jest napewno skonfigurowany dobrze. Spojrzcie prosze, czy nie zrobilem gdzies bledow w kodzie jezeli chodzi o SPI, bo mi już się kończą pomysły.
#define F_CPU 14746500
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#define CS PE0
void SPI_init();
void SPI_transmit(unsigned char, unsigned char);
unsigned char SPI_receive(unsigned char);
void USART_init();
void USART_transmit(unsigned char);
void print_word(unsigned char *);
volatile unsigned char w2;
volatile unsigned char dane[16];
int main(int argc, char* argv[]) {
DDRC = (1 << DDC0);
PORTC = (1 << PC0);
USART_init();
SPI_init();
SPI_transmit(0x8f, 0x00);
SPI_transmit(0x8f, 0x00);
unsigned char w1 = '2';
//ustawienie zegara
SPI_transmit(0x80, 0x03);
SPI_transmit(0x81, 0x03); //minuty
SPI_transmit(0x82, 0x03); //godziny
SPI_transmit(0x83, 0x09); //dzien tygodnia
SPI_transmit(0x84, 0x01); //dzien
SPI_transmit(0x85, 0x02); //miesiac
SPI_transmit(0x86, 0x05); //rok
for (;;) {
PORTC = ~PORTC;
w2 = SPI_receive(0x00);
USART_transmit(w2);
itoa((unsigned int)w2,dane,16);
print_word(dane);
_delay_ms(1000);
}
return 0;
}
void USART_init() {
UBRR1H = 0;
UBRR1L = 7;
UCSR1B = (1 << RXEN) | (1 << TXEN);
UCSR1C = (1 << USBS) | (3 << UCSZ0);
}
void USART_transmit(unsigned char data) {
while (!(UCSR1A & (1 << UDRE)))
;
UDR1 = data;
}
void SPI_init() {
DDRB = (1 << DDB2) | (1 << DDB1)| (1 << DDB0);
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1);
DDRE = (1 << DDE0);
PORTE = (0 << PE0);
}
void SPI_transmit(unsigned char adr, unsigned char data) {
PORTE = (1 << CS);
SPDR = adr;
while(!(SPSR))
;
SPDR = data;
while(!(SPSR))
;
PORTE =~PORTE;
}
unsigned char SPI_receive(unsigned char adr) {
PORTE = (1 << CS);
SPDR = adr;
while(!(SPSR))
;
SPDR = 0;
while(!(SPSR))
;
PORTE = ~PORTE;
return SPDR;
}
void print_word(unsigned char *word) {
char *ptr;
for (ptr = word; *ptr != '\0'; ptr++)
USART_transmit(*ptr);
}