RTC Clock an Atmega 32

herbert

Neues Mitglied
27. Juli 2010
4
0
0
Sprachen
Hallo zusammen, ich möchte eine RTC Clock an einem Atmega 32 betreiben.
Leider habe ich keinen Code (jedenfalls nicht einen der wirklich funktioniert) und keine Schaltung für das Stellen der Clock.
In Bascom bin ich auch Anfänger, sodass ich da meine Probleme habe.
Kann mir da jemand weiterhelfen ???
 
Hallo und willkommen im AVR-Praxis Forum, Herbert! :ciao:

Ich überlege nun gerade, ob du als Änfänger in Sachen BASCOM und AVR wirklich gleich mit einer RTC (z.B. eine DS1307 oder DS1337) beginnen möchtest. :hmmmm:

Oder meinst du doch erst mal "nur" die Softclock mit einem externen Uhrenquarz? :hmmmm:

Da du ja noch Anfänger bist, solltest du vielleicht erst mal mit der Softclock beginnen.
Dies ist unter BASCOM auch ein Kinderspiel. Denk aber bitte daran, dass du einen externen 32,768kHz Quarz an die Pins TOSC1 und TOSC2 anschließen musst! Sonst läuft die Uhr nicht! ;)

Nun kommen wir zum interessanten Punkt......
Wie möchtest du denn die Ausgabe der Uhrzeit und des Datums realisieren?
Hast du ein Display? Wenn ja, läuft das schon?
Via RS232? Funktioniert die Verbindung schon?

Du merkst wahrscheinlich schon selbst, dass hier noch einige Angaben fehlen, um dir richtig helfen zu können.
Vielleicht stellst du ja mal einen Schaltplan ein, wie du bis jetzt alles am AVR angeschlossen hast.
Außerdem wäre es hilfreich, wenn du deine ersten Versuche in BASCOM hier auch posten würdest...... auch wenn diese nicht funktionieren.

Ach so.... eine Bitte noch!
Es ist keine Schande, wenn man sich als Anfänger in fertigen Programmen neue Ideen zur Realisierung holt. Allerdings solltest du von vornherein versuchen deine Programme selbst zu schreiben, damit du auch verstehst was du da gemacht hast. ;)

Gruß,
Cassio
 
Hallo Cassio, vielen Dank für Deine schnelle Antwort.
Bevor ich näher auf mein Problem bzw. meinen Wissensstand mit Bascom näher eingehe, habe ich noch ein anderes Problem, welches gestern aufgetaucht ist.
Wie ich schon erwähnt habe, habe ich schon ein Programm zum stellen der RTC Clock, aber dieses funktioniert nicht richtig. Als ich dies heute nochmal starten wollte um Dir den Fehler genauer zu erläutern, bekomme ich folgende Fehlermeldung wenn ich das Programm auf den Chip "Atmega 32" übertragen will:
Could not identify chip with ID.000000. Wenn ich den Chip im Programmer Menü auswählen will, finde ich diesen nicht im Drop Down Menü.
Was kann hier passiert sein ???
Gruß Herbert
 
Hallo Herbert!

So gern ich auch helfen möchte.......
Ohne Angaben, was du da alles vor dir hast, kann ich dir nicht helfen!

Welche BASCOM Version benutzt du?
Demo- oder Vollversion?
Was für ein Programmer hast du?
Snapshots von den Einstellungen in BASCOM können auch hilfreich sein!


Eigentlich musst du den zu programmierenden Chip nicht von Hand auswählen!
Vor dem Proggen wird immer die ID des AVR abgefragt. Stimmt diese nicht mit dem Programm überein, bekommst du eine Fehlermeldung.

Die Fehlermeldung "ID 000000" bedeutet, dass BASCOM den AVR überhaupt nicht ansprechen oder identifizieren kann.
Hast du vielleicht MOSI und MISO vertauscht?
Ist der RST nicht richtg angeschlossen?
Überprüfe einfach noch mal alles, was den ISP-Anschluss betrifft!


Wie aber schon berichtet.....
Mir fehlen hier einfach die wichtigsten Grunddaten von dir, deiner Hardware und der Software, um irgendwie helfen zu können.
Nimm dir also mal ein bisschen Zeit und stell dich persönlich, deine derzeitigen Erfahrungen und deine Hardware hier vor.
Es hilft allen ungemein, wenn du später mal eine Frage haben solltest. ;)

Gruß,
Cassio
 
Hallo Cassio, hier bin ich wieder.
Also zunächst meine soft- und Hardware: Ich verwende das Testboard RN- Control von Robotik Hardware zusammen mit einer erweiterungsplatine zum Anschluss externer Beschaltung.Von Bascom verwende ich die Vollversion. Mit diesem Testboard habe ich auch schon meine Heizungssteuerung mit Hilfe eines Bekannten entwickelt und getestet.Als Display verwende ich ein 4x20 Display.
Das funktioniert auch alles.Als Programmer verwende ich den ISP Programmer ebenfalls von Robotik. Warum der Programmer den Atmega 32 nicht erkannt hat,konnte ich nicht feststellen. Ich habe einmal den Stecker vom erweiterungsboard abgezogen und wieder angesteckt, seitdem funktioniert es wieder.
Meine Kenntnisse in Bascom sind bescheiden, ich kann zwar ein Programm interpretieren, was darin geschieht, aber zum Schreiben habe ich noch nicht genügend Erfahrung.
Die RTC Clock will ich in meine Heizungssteuerung einbauen zum Synchr. der Softcock.
Nun das Problem ist folgendes:Im Programm wird Port B.1 als SDA und Port B.0 als SCL konfiguriert.
Zum Stellen der RTC werden die Eingänge PinB.3 = Input für Taste UP,
PinB.6 = Input für DOWN Taste und PinB.6 = Input für Set Taste konfiguriert.
Wie nun aus Zeile 162 im Programm hervorgeht, sollte z.B. bei PINB.3 = 1 (High) der Wochentag von 0 bis 6 hochtasten, wobei 0 = Montag sein soll.
erstes Problem: ich kann nur mit low tasten, nicht mit high .
zweites Problem: Ich bekomme den Zähler nicht auf 0, sobald er 0 erreicht, springt er sofort auf 255 und ich kann dann auch nicht mehr hinauf oder herunterzählen.
Woran kann das liegen ??
Ich hänge mal die Beschaltung meiner RTC Clock sowie das Stellprogramm dazu an.
 

Anhänge

  • RTC.zip
    71,9 KB · Aufrufe: 44
  • RTC Clock.pdf
    12,2 KB · Aufrufe: 87
Hier mal das Testprogramm als Klartext für die Fehlersuche ...



CodeBox BASCOM

'*********************************************************************************************************************
'*********************************************************************************************************************
'****** Programm zum Anzeigen und Stellen einer RTC Uhr mit dem Uhren IC DS1307 **************************************
'****************************** Von Rudolf Kischkel Version 1.0 ******************************************************
'*********************************************************************************************************************
'-----------------------------Dieses Programm ist für den Betrieb auf dem Testboard-----------------------------------


$regfile = "m8def.dat" 'AVR ATMega 8...
$crystal = 8000000 '...mit 8 MHz

$hwstack = 150 'hardware stack
$swstack = 150 'SW stack
$framesize = 40 'frame space


'---------- I²C Einsatellungen ----------
'Config Clock = User


Config Twi = 100000 'i2c Frequenz einstellen
Config Sda = Portb.1 'i2c Port SDA am AVR
Config Scl = Portb.0 'i2c Port SCL am AVR


I2cinit

Config Pind.0 = Input 'UP Taste
Config Pind.1 = Input 'Down Taste
Config Pind.2 = Input 'ENTER Taste

'---------- LCD Einstellungen ----------

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2

Cursor Off 'Keinen Cursor auf LCD anzeigen

Config Dcf77 = Pinb.5 , Timer = 1 , Debug = 1 , Inverted = 1 , Timer1sec = 1 , Check = 1 'DCF Antenne am PortB.5 angeschlossen

Config Date = Dmy , Separator = . 'Datumsanzeige auf Tag,Monat,Jahr und Trennzeichen ist ein Punkt


Enable Interrupts

'Set Portb.5 'Pullup einschalten für DCF Antenne

Dim Wochentag As String * 2
Dim Monatname As String * 3

Dim Wotag As Byte

Dim Fehler As Byte

Dim Minute_alt As Byte

Const Ds1307w = &B11010000
Const Ds1307r = &B11010001

Cls

Gosub Vorspann

Goto Zeitholen

'----------------------------------Hauptprogramm--------------------------------

Anzeige:

Wotag = Dayofweek()

Wochentag = Lookupstr(wotag , Tagname) 'Tageskürzel aus Datentabelle laden

Locate 1 , 1
Lcd Wochentag ; " ";

If _day < 10 Then Lcd "0" ; _day Else Lcd _day ;

Monatname = Lookupstr(_month , Monatsnamen)

Lcd "-" ; Monatname ; "-" ; "20" ; _year

Locate 2 , 4

Lcd Time$

Locate 2 , 14
Lcd Fehler

Waitms 250

If _min <> Minute_alt Then Goto Zeitholen

Debounce Pind.2 , 1 , Uhr_stellen

Goto Anzeige



Zeitholen:

I2cstart
I2cwbyte Ds1307w
I2cwbyte 0

If Err = 1 Then Goto Fehlerzaehlen

I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte Wotag , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack

I2cstop

If Err = 1 Then Goto Fehlerzaehlen

_sec = Makedec(_sec)
_min = Makedec(_min)
_hour = Makedec(_hour)

_day = Makedec(_day)
_month = Makedec(_month)
_year = Makedec(_year)

Minute_alt = _min

Goto Anzeige



'------------------------------------Stellmenü--------------------------------------------

Fehlerzaehlen:

Fehler = Fehler + 1

Minute_alt = _min

Goto Anzeige

'---------------------------------Wochentag stellen---------------------------------------

Uhr_stellen:

Cls



Wochentag_stellen:

Locate 1 , 1

Lcd "Tag:" ; Wotag ; "=" ; Wochentag

If Pind.0 = 1 Then Wotag = Wotag + 1
If Wotag > 7 Then Wotag = 1
If Pind.1 = 1 Then Wotag = Wotag - 1
If Wotag = 0 Then Wotag = 7

Debounce Pind.2 , 1 , Tag_stellen

Wochentag = Lookupstr(wotag , Tagname) 'Tageskürzel aus Datentabelle laden

Waitms 250

Goto Wochentag_stellen

'------------------------------------Tag stellen------------------------------------------
Tag_stellen:

Cls

Tag_stellen_1:

Locate 1 , 1
Lcd Wochentag ; "." ; _day ; " "


If Pind.0 = 1 Then _day = _day + 1
If _day > 31 Then _day = 1
If Pind.1 = 1 Then _day = _day - 1
If _day < 1 Then _day = 31

Debounce Pind.2 , 1 , Monat_stellen

Waitms 250

Goto Tag_stellen_1

'-----------------------------------Monat Stellen-----------------------------------------
Monat_stellen:

Cls

Monat_stellen_1:

Locate 1 , 1
Lcd Wochentag ; "." ; _day ; "." ; _month ; " "


If Pind.0 = 1 Then _month = _month + 1
If _month > 12 Then _month = 1
If Pind.1 = 1 Then _month = _month - 1
If _month < 1 Then _month = 12

Debounce Pind.2 , 1 , Jahr_stellen

Waitms 250

Goto Monat_stellen_1

'-----------------------------------Jahr stellen------------------------------------------
Jahr_stellen:

Cls

Jahr_stellen_1:

Locate 1 , 1
Lcd Wochentag ; "." ; _day ; "." ; _month ; "." ; "20" ; _year ; " "

If Pind.0 = 1 Then _year = _year + 1

If Pind.1 = 1 Then _year = _year - 1

If _year < 10 Then _year = 10

Debounce Pind.2 , 1 , Stunde_stellen

Waitms 250

Goto Jahr_stellen_1

'-----------------------------------Stunde stellen----------------------------------------
Stunde_stellen:

Cls

Stunde_stellen_1:

Locate 1 , 1
Lcd Wochentag ; "." ; _day ; "." ; _month ; "." ; _year

Locate 2 , 1

If _hour < 10 Then Lcd "0" ; _hour Else Lcd _hour ; " "

If Pind.0 = 1 Then _hour = _hour + 1
If _hour > 23 Then _hour = 0
If Pind.1 = 1 Then _hour = _hour - 1

If _hour = 255 Then _hour = 23

Debounce Pind.2 , 1 , Minute_stellen

Waitms 250

Goto Stunde_stellen_1

'-----------------------------------Minute stellen----------------------------------------
Minute_stellen:

Cls

Minute_stellen_1:

Locate 1 , 1
Lcd Wochentag ; "." ; _day ; "." ; _month ; "." ; _year
Locate 2 , 1
Lcd _hour ; ":" ;

If _min < 10 Then Lcd "0" ; _min Else Lcd _min ; " "

If Pind.0 = 1 Then _min = _min + 1
If _min = 60 Then _min = 0
If Pind.1 = 1 Then _min = _min - 1
If _min = 255 Then _min = 59

Debounce Pind.2 , 1 , Zeit_speichern

Waitms 250

Goto Minute_stellen_1

'------------------------------Zeiten in DS1337 speichern---------------------------------
Zeit_speichern:


Wotag = Makebcd(wotag)
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)

Rem Datumsetzen

I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Wotag
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop


_sec = 00
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)

Rem Zeitsetzen

I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop

Cls

Goto Anzeige



'------------------------------------------------------------------------------------------
Vorspann:

Locate 1 , 1
Lcd "Probe RTC DS1307"

Locate 2 , 7
Lcd "V.1.1"

Wait 2

Cls

Return

'------------------------------------------------------------------------------------------


'Dcfsyncron:

'Enable Interrupts

'Warten:

'If Dcf_status.7 = 1 Then Goto Abgleichen

'Goto Warten

'Abgleichen:

'Waitms 200

'Disable Interrupts

'Sekunde = _sec
'Minute = _min
'Stunde = _hour

'Wotag = Dayofweek()
'Tag = _day
'Monat = _month
'Jahr = _year

'Dcf_status.7 = 0

'Goto Zeit_speichern


End

Tagname:

Data "Mo" , "Di" , "Mi" , "Do" , "Fr" , "Sa" , "So"

'-------------------------------------------------------------------------------
'-----------------------DATENTABELLE FÜR MONATSNAMEN----------------------------
'-------------------------------------------------------------------------------
Monatsnamen:

Data " " , "Jan" , "Feb" , "Mar" , "Apr" , "Mai" , "Jun" , "Jul" , "Aug" , "Sep" , "Okt" , "Nov" , "Dez"


Also das erste was mir aufgefallen ist ... die GOTOs machen alles ungeheuer
unübersichtlich und schlecht zu durchblicken für die Fehlersuche ...
Da sollte man mal den Rotstift ansetzen (nennt man auch Redesign).
Für nen genaueren Blick ist mir das allerdings schon etwas spät.
Wegen der ganzen GOTOs kann ich das Proggi auch nicht mal schnell
durchblicken wie wo was an welcher Stelle abläuft. Außerdem kannst du dir
mit den GOTOs auch schnell nen Stacküberlauf einfangen wenn du zusätzlich
noch GOSUBs/CALLs einsetzt. Also ich würde das an deiner Stelle erst mal
"etwas" überarbeiten ;)

Aber mehr irgendwann später ... (die Tage ...) oder von nem anderen ...

Der Schaltplan sieht (so aus dem Gedächtnis :D) erst mal ok aus ...

Gruß
Dino
 
Hallo Herbert!

Auf Grund der fortgeschrittenen Stunde habe ich den Code auch nur mal überflogen....

Wie Dino schon geschrieben hat, sind es mir auch zu viele "Goto" im Programm.
Im Allgemeinen springt dein Programm ja immer nur wieder zur "Hauptschleife" zurück (abgesehen von den Einstellbereichen).
Du könntest dies also etwas eleganter lösen, aber das ist ja zur Zeit nicht dein Problem.


Ich habe auch überlegt, warum du deine Uhr überhaupt stellen willst?
Du hast doch das DCF77 Signal, dass deine Softclock immer wieder aktualisiert.
Dann hast du noch die RTC via I2C eingebunden.....
Aber egal!

Nun zu deinem aktuellen Problem......
Was mir beim Stellen der Uhrzeit (Datum usw.) als Erstes aufgefallen ist:
Du tastest gegen Vcc ? :hmmmm:
Dann verwendest du einzelne IF-Then Schleifen.
Beispiel:


CodeBox bascom

Stunde_stellen_1:

Locate 1 , 1
Lcd Wochentag ; "." ; _day ; "." ; _month ; "." ; _year



Locate 2 , 1

If _hour < 10 Then Lcd "0" ; _hour Else Lcd _hour ; " "


If Pind.0 = 1 Then _hour = _hour + 1

If _hour > 23 Then _hour = 0

If Pind.1 = 1 Then _hour = _hour - 1


If _hour = 255 Then _hour = 23


Debounce Pind.2 , 1 , Minute_stellen


Waitms 250

Goto Stunde_stellen_1



Diese IF-Then Zeilen werden einzeln abgearbeitet und bilden keine Einheit!

Ändere deine "Befehlsschleife" doch mal folgendermaßen um:
(die Taster arbeiten nun gegen Masse! )


CodeBox bascom


If Pind.0 = 0 Then
If _hour < 23 Then
Incr _hour
Else
_hour = 0
End if
Elseif Pind.1 = 0 Then
If _hour > 0 Then
Decr _hour
Else
_hour = 23
End if
Else
End if

Locate 1 , 1
Lcd "Zeit: " ; Time$

Waitms 100




Der Unterschied liegt zum Einen im "Elseif", dass wie ein "oder" wirkt, aber die IF-Then Schleife zusammen fasst.
Beim Durchlaufen meiner Schleife ist also immer nur EINE Bedingung gegeben und wird dann ausgeführt.
In deiner Variante werden VIER Bedingungen nacheinander geprüft und ggf. bearbeitet.


So, dass sollte nun erst mal zu Beginn..... und zur fortgeschrittenen Stunde reichen. ;)

Prinzipiell würde ich das ganze Programm noch mal etwas überarbeiten und unterteilen. Allerdings steht dies auf einem ganz anderen Blatt. :)

Schöne Grüße,
Cassio
 
Hallo zusammen, erstmal vielen Dank für Eure Mühe mir auf die Sprünge zu helfen. Ich habe gerade festgestellt, dass ich Euch das falsche File gepostet habe, was aber im Prinzip nichts ändert, ich habe dabei nur die Ports auf meine Schaltung umbenannt und auch auf den Atmega 32 umgeschrieben. Ich hänge nochmal mein geändertes Programm an. Ich habe es nun auch geschafft, dass ich den Tag "0" also Montag programmieren kann.(siehe Wochentag stellen im Programm).
Aber ich wollte nun den Vorschlag von dino03 aufgreifen und die vielen "if then" Schleifen entflechten und habe das mal am Beispiel von "Wochentag stellen" versucht.Ich bekomme aber immer die Fehlermeldung "invalid Datatype! bzw "wrong Datatype". Siehe screenshot. Ich verstehe schon den Ablauf dieser Schleife, aber was ist daran noch falsch ??? ich hänge nochmal das Programm mit den geänderten "if then Schleifen"an (ds1307-Uhr-stellen-1)
Vielleicht kann nochmal einer von Euch beiden einen Blick darauf werfen.
Viele Grüße
Herbert
 

Anhänge

  • DS1307-Uhr-stellen.pdf
    122,5 KB · Aufrufe: 45
  • Heizungssteuerung_mit_RTC_1_0.zip
    6,3 KB · Aufrufe: 30
  • Uhr-stellen-mit-Ds1307-.zip
    2,3 KB · Aufrufe: 35
Hallo Herbert!

Wenn ich das auf die Schnelle richtig gesehen habe, dann hast du eine Variable "Wotag" (als Byte)......... versuchst aber eine Variable "_wotag" zu incrementieren.

Soweit ich gesehen habe, gibt es aber die Variable "_wotag" überhaupt nicht! :hmmmm:


Gruß,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)