mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RTC-Baustein DS17287-5 von Dallas an ATMega16


Autor: 1.8T-Passat (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe aus einem alten Tektronix-Laserdrucker einen RTC-Baustein 
ausgebaut. (Datenblatt im Anhang). Ich versuche seit Tagen, ihn zum 
Leben zu erwecken am ATMega16.

Dieser Baustein hat ja auch frei benutzbares RAM ab Adresse 0x0E. Also 
habe ich versucht, ein Programm zu schreiben, welches ein paar Werte in 
den Ram schreibt, und später wieder ausliest und auf einem LCD 
darstellt. Im Prinzip funktioniert es auch, aber es werden mir immer 234 
zuviel angezeigt. Ich schreibe z.B. eine '0' rein, es kommt '234' 
zurück. Bei einer '1' ist es dann '235'. Versuche ich, das Register 
"0x00" (Sekunden) auszulesen, kommt '255' zurück. Bei nachfolgenden 
Registern genauso. Pull-Ups ein / aus ist egal. Immer das gleiche.
Ich habe keinen Eagle-Plan dazu gezeichnet, versuche aber jetzt, die 
Verdrahtung euch so zu zeigen:

ATMega:       DS17287:
PB0...PB7     AD0...AD7
PC0           ALE
PC1           WR
PC2           RD
PC3           CS
              VBAUX auf GND
              die restlichen PINs unbelegt


Hier ist mein C-Code dazu:
#include <avr/io.h>
#include <stdlib.h>
#include "lcd-routines.c"
#include <util/delay.h>

#define ALE 0
#define WR 1
#define RD 2
#define CS 3
#define ADDR_PORT PORTB
#define DATA_PIN PINB
#define RTC_DDR DDRB
#define KOM_PORT PORTC
#define KOM_PORT_DDR DDRC


uint8_t rtc_lesen (uint8_t adresse)
{
uint8_t daten;
RTC_DDR = 0xFF; //Adress-/ Datenport auf Ausgang
KOM_PORT = (1<<CS); //Alle Kommandos löschen und CS auf "1"
_delay_us(1);
KOM_PORT |= (1<<RD | 1<<WR); //RD und WR auf "1"
_delay_us(1);
KOM_PORT |= (1<<ALE); //ALE auf "1"
_delay_us(1);
ADDR_PORT = adresse; //Adresse auf Ausgänge legen
KOM_PORT &= ~(1<<CS); //CS auf "0"
_delay_us(1);
KOM_PORT &= ~(1<<ALE); //ALE auf "0"
_delay_us(1);
ADDR_PORT = 0; //Adresse löschen
RTC_DDR = 0; //PortB auf Eingang umschalten
ADDR_PORT = 0xFF; // Pull-Ups
KOM_PORT &= ~(1<<RD); //RD auf "0"
_delay_us(1);
daten = DATA_PIN; //Eingangsdaten in Variable 'daten' speichern
_delay_us(1);
KOM_PORT |= (1<<RD); //RD wieder auf "1"
//_delay_us(1);
KOM_PORT |= (1<<CS); //CS auf "1"
_delay_us(1),
KOM_PORT |= (1<<ALE); //ALE auf "1"
return daten;//Funktion beenden und Daten vom Datenport zurückgeben
}

void rtc_schreiben (uint8_t adresse, uint8_t daten)
{
KOM_PORT = (1<<CS | 1<<RD | 1<<WR); //CS, RD und WR auf "1"
_delay_us(20);
KOM_PORT |= (1<<ALE); //ALE auf "1"
KOM_PORT &= ~(1<<CS);
RTC_DDR = 0xFF; //Adress-/ Datenport auf Ausgang
ADDR_PORT = adresse; //Adresse auf Ausgang legen
_delay_us(20);
KOM_PORT &= ~(1<<ALE); //ALE auf "0"
_delay_us(20);
ADDR_PORT = 0;
_delay_us(20);
KOM_PORT &= ~(1<<WR); //WR auf "0" (Active Low)
_delay_us(20); 
ADDR_PORT = daten;
KOM_PORT |= (1<<WR);
_delay_us(20);
KOM_PORT |= (1<<CS);
return; //Funktion beenden
}


int main() //Hauptprogramm
{
uint8_t rtc_daten;
char buffer[20];
KOM_PORT_DDR = 0xff;
DDRD = 0xFF;
lcd_init ();
rtc_schreiben (0x0A, (1<<5));
for (uint8_t i=0; i<20; i++)
  {
    rtc_schreiben ((0x0E + i), i+10);
  }
while (1)
  {
    for (uint8_t i=0; i<20; i++)
      {
      set_cursor (3,1);
      rtc_daten = rtc_lesen (0x0e + i);
      itoa (rtc_daten, buffer, 10);
      lcd_string (buffer);
      lcd_data (' ');
      itoa (i, buffer, 16);
      lcd_string (buffer);
      for (uint16_t j=0; j<1000; j++) _delay_ms(1);
      }
  }

return 0;
}


Ich habe schon nach dem Baustein gegooglet, aber leider nur das 
Datenblatt gefunden, keine Programmbeispiele. Hier auf 
mikrocontroller.net gibt´s leider auch nicht. RTC-Beispiele ansich gibt 
es wohl, aber es sind meistens I²C Bausteine. Evtl. hat ja von Euch 
einer eine Idee.

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, habe vergessen zu erwähnen, dass ich zwischen PB0..PB7 und 
AD0...AD7 jeweils 560 Ohm Widerstände habe. Nur zur Sicherheit, falls 
durch einen Softwarefehler beide Bausteine gleichzeitig senden.

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habe noch was ausprobiert. Und zwar habe ich den RTC-Baustein an 
einen ATMega8515 angeschlossen. Dieser ist ja in der Lage, externes RAM 
zu verarbeiten. Nun scheint es zu klappen. Was ich in den Bereich ab 
0x0E schreibe, kann ich auch genauso wieder auslesen.

Leider scheint die eigentliche Uhr noch nicht zu laufen. Z.B. die 
Sekunden im Register 0x00 laufen nicht. Ich kann da auch einen Wert 
reinladen, und den selben wieder lesen. Aber die Sekunden laufen nicht. 
Alle anderen Werte sind unsinnig. Die sollten eigentlich im BCD-Format 
sein, aber da sind dann auch Werte wie 0xBA und so.

Muss die Uhr über Befehle erst noch gestartet werden? Oder würde es 
reichen, einfach die entsprechenden Register auszulesen?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.