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

[ATMega16] [C] RTC DS17887 - wlasna biblioteka

JmL(TM) 09 Cze 2008 23:15 1831 4
REKLAMA
  • #1 5230636
    JmL(TM)
    Poziom 24  
    Witam!

    Przeszukalem elektrode ale nie znalazlem nic do obslugi DS17887 w C.
    Czy ma ktos moze jakis przyklad? Ponoc uklad jest bardzo popularny a jednak ze zrodlami kiepsko to wyglada...
  • REKLAMA
  • Pomocny post
    #2 5324598
    pietia86
    Poziom 26  
    Załączam mój listing w C, co prawda jest on dla '51 ale myślę że z implementacją na AVR nie powinno być większych problemów. Ja sam dopiero zaczynam zabawę z AVR dlatego jak narazie nie potrafię tego przerobić :oops:

    
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    // Funkcja odczytuje i zwraca jeden bajt o podanym adresie
    char ReadFromRTC(unsigned char Address)
    {
    	unsigned char Temp;
    	Write = 1;
    	Read = 1;
    	Ale = 1;
    	RTC_BUS = Address;
    	Ale = 0;
    	RTC_BUS = 0xFF;
    	Read = 0;
    	Temp = RTC_BUS;
    	Read = 1;
    	Ale = 1;	
    	return Temp;
    }
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    // Funkcja zapisuje jeden bajt w podanym adresie
    void WriteToRTC(unsigned char Address, unsigned char DataToWrite)
    {	
    	Write = 1;
    	Read = 1;
    	Ale = 1;
    	RTC_BUS = Address;
    	Ale = 0;
    	RTC_BUS = DataToWrite;
    	Write = 0;
    	RTC_Delay(1);// czas na zapis danej do zegara
    	Write = 1;
    	Ale = 1;	
    }
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    


    Jeśli coś jest niezrozumiałe pytaj :]
  • REKLAMA
  • #3 5324833
    JmL(TM)
    Poziom 24  
    Dzieki za listing. Jak tylko polutuje uklad [bo narazie nie mialem czasu] to zajme sie przepisaniem tego na AVR. I choc ja rowniez jestem poczatkujacy to widze, ze z kodem nie bedzie problemu bo tu praktycznie jest "czarno na bialym" jak sterowac DS'em.

    Pozdrawiam!
  • REKLAMA
  • #4 5325236
    pietia86
    Poziom 26  
    Tzn wg mnie różnica będzie tylko w tym że w AVRach trzeba ustawić kierunek portu przy jakichkolwiek działaniach na nim no i chyba nie da się tak bezpośrednio zaadresować jednego bitu na porcie. Do tego służy o ile się nie mylę polecenie ~BV.

    Aha no i oczywiście opóźnienie przy zapisie będzie większe bo AVRki są szybsze...

    Jak już program będzie działał to podziel się wynikami :]
  • #5 5329210
    JmL(TM)
    Poziom 24  
    OK! Wiec jak narazie nie zlutowalem jeszcze ukladu ale zaczalem pisac biblioteke do obslugi DS17887. Jest juz 1:56 wiec moga byc jakies bledy. W kazdym razie zamieszczam to co narazie napisalem.

    DS17887.h
    #ifndef DS17887_H
    #define DS17887_H
    
    #define DS17887_PORT_INTERFACE
    
    #ifdef DS17887_PORT_INTERFACE
    	#ifndef DS17887_CTRL_PORT
    		// port i piny, ktore beda uzywane do linii kontrolnych
    		#define DS17887_CTRL_PORT           PORTD
    		#define DS17887_CTRL_DDR            DDRD
    
    		#define DS17887_CTRL_ALE            PD2
    		#define DS17887_CTRL_WR             PD3
    		#define DS17887_CTRL_RD             PD4
    	#endif
    	#ifndef DS_17887_DATA_POUT
    		// port, ktory bedzie uzyty jako linia danych
    		#define DS17887_DATA_POUT           PORTB
    		#define DS17887_DATA_PIN            PINB
    		#define DS17887_DATA_DDR            DDRB
    	#endif
    #endif
    
    #endif


    DS17887.c
    #include <avr/io.h>
    #include <util/delay.h>
    #include <compat/deprecated.h>
    
    #include "ds17887.h"
    
    typedef unsigned char u08;
    
    //---------------------
    // Adresy w DS17887
    //---------------------
    #define REG_SEKUNDA               0x00
    #define REG_MINUTA                0x02
    #define REG_GODZINA               0x04
    
    #define REG_DZIEN_TYG             0x06
    
    #define REG_DZIEN                 0x07
    #define REG_MIESIAC               0x08
    #define REG_ROK                   0x09
    
    #define REG_ALARM_SEKUNDA         0x01
    #define REG_ALARM_MINUTA          0x03
    #define REG_ALARM_GODZINA         0x05
    
    #define REG_A                     0x0A
    #define REG_B                     0x0B
    #define REG_C                     0x0C
    #define REG_D                     0x0D
    //*============================================================*//
    void DS17887_InitHW(void)
    {
    	// inicjacja portow I/O
    	#ifdef DS17887_PORT_INTERFACE
    
    		cbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);
    		cbi(DS17887_CTRL_PORT, DS17887_CTRL_WR);
    		cbi(DS17887_CTRL_PORT, DS17887_CTRL_RD);
    
    		sbi(DS17887_CTRL_DDR, DS17887_CTRL_ALE);
    		sbi(DS17887_CTRL_DDR, DS17887_CTRL_WR);
    		sbi(DS17887_CTRL_DDR, DS17887_CTRL_RD);
    
    		outb(DS17887_DATA_DDR, 0x00);
    		outb(DS17887_DATA_POUT, 0xFF);
    	#endif
    }
    //*============================================================*//
    
    char ReadFromRTC(u08 Address)
    {
    	u08 tmp;
    
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_WR);	// Write = 1
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_RD);	// Read = 1
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);	// Ale = 1
    
    	outb(DS17887_DATA_POUT, Address);			// RTC_BUS = Address
    
    	cbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);	// Ale = 0
    
    	outb(DS17887_DATA_POUT, 0xFF);				// RTC_BUS = 0xFF
    
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_RD);	// Read = 0
    
    	tmp = inb(DS17887_DATA_PIN);				// tmp = RTC_BUS
    
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_RD);	// Read = 1
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);	// Ale = 1
    
    	return tmp;
    }
    //*============================================================*//
    
    void WriteToRTC(u08 Address, u08 DataToWrite)
    {
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_WR);	// Write = 1
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_RD);	// Read = 1
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);	// Ale = 1
    
    	outb(DS17887_DATA_POUT, Address);			// RTC_BUS = Address
    
    	cbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);	// Ale = 0
    
    	outb(DS17887_DATA_POUT, DataToWrite);		// RTC_BUS = DataToWrite
    
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_WR);	// Write = 0
    
    	_delay_ms(10);								// czas na zapis danej do zegara [10ms]
    
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_WR);	// Write = 1
    	sbi(DS17887_CTRL_PORT, DS17887_CTRL_ALE);	// Ale = 1
    }


    Komentarze i uwagi oczywiscie mile widziane.
REKLAMA