logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega 128] ATmega 128: Odbiór danych z zegara DS1305 przez SPI - błędy w kodzie?

bimbarabam 28 Mar 2012 16:06 1498 0
REKLAMA
  • #1 10729360
    bimbarabam
    Poziom 14  
    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.

    
    #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);
    }
  • REKLAMA
REKLAMA