Erledigt ATMega8 Uhr Temparatur Anzeige

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo Forum und bastler
Ich hab einen code von lange her gefunden und hab beim den code ein proplem, wenn ich den code zum ATMega schicke Passiert auf den LCD 20x4 Nichts es wird nicht angesprochen ist da irgend wo ein fehler drin?
Ich Bitte um rat und Tipps
Hier der Code:


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 10000000                                         '10Mhz
$hwstack = 32
$swstack = 8
$framesize = 24


Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , _
E = Portd.5 , Rs = Portd.6
Config Lcd = 20 * 4 , Chipset = St7032                      'Type 20 x 4 Blau LCD ST7032
Config Lcdbus = 4
Cls                                                         'LCD Leeren
Cursor Off

Initlcd

Config 1wire = Portb.0

Config Dcf77 = Pinb.2 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 , Gosub = Sectic

Config Pind.7 = Input
Portd.7 = 1

Config Pinb.1 = Output
Enable Interrupts
Config Date = Dmy , Separator = .


Dim Onebyte As Byte
Dim Ar(2) As Byte

Cursor Off Noblink
Cls
Waitms 100

While Dcf_status.7 = 0
' Dcf_status.7 wird auf 1 gesetzt sobald die Zeit erfolgreich synchronisiert wurde
' ---Testweise rausgelassen--
'Locate 1 , 1
'Lcd "DCF: " ; Time$ ; " " ; Date$ ; " " ; Time(dcf_sec) ; " " ; Date(dcf_day) ; " " ; Bin(dcf_status) ; " " ; Bin(dcf_parity) ; " " ; Bin(dcf_bits) ; " " ; Bdcf_impuls ; " " ; Bdcf_pause
Locate 1 , 1
Lcd "Sync..."
Waitms 250
Wend
Locate 1 , 1
Lcd "Uhrzeit synchronisiert!" ; Time$ ; " " ; Date$

Do
nop
Locate 1 , 1
Lcd " Zeile1"
Locate 2 , 1
Lcd " Zeile2"
1wreset
1wwrite &HCC
1wwrite &H44
1wreset
1wwrite &HCC
1wwrite &HBE
Ar(1) = 1wread(2)
Waitms 500

Locate 4 , 1
Shift Ar(1) , Right , 1
Lcd Ar(1) ; Chr(223) ; "C"

If Pind.7 = 0 Then
Portb.1 = 1
Waitms 50
Portb.1 = 0

Locate 1 , 1
Lcd " "
Locate 2 , 1
Lcd " "
Locate 3 , 1
Lcd " "
Locate 2 , 1
Lcd " Test1"
Waitms 1000
Locate 2 , 1
Lcd " "
Locate 2 , 1
Lcd " Test2"
Waitms 1000
Locate 2 , 1
Lcd " "
End If

Loop


End

Sectic:
Locate 3 , 1
Lcd Time$ ; " " ; Date$
Return

Gruß Thorsten Sch.
 
Hi,

Ich hab einen code von lange her gefunden und hab beim den code ein proplem, wenn ich den code zum ATMega schicke Passiert auf den LCD 20x4 Nichts es wird nicht angesprochen ist da irgend wo ein fehler drin?

das ist ne ziemlich schwammige Information. Was heißt nichts?

- Läßt sich der Kontrast einstellen? -> wenn nicht : Hardwareproblem
- Bei entsprechendem Kontrast sollte sich nach der Initialisierung was auf dem Display ändern. Die meißten mehrzeiligen Displays haben abwechselnd dunkle und helle Zeilen bei entsprechendem Kontrast und ohne die Initialisierung.
- oder erscheint nur kein Text auf dem Display?

Ein wenig mehr Infos was du bereits ausprobiert hast und was dabei raus kam wäre ja recht hilfreich.
Seitenlange Threads bei denen man den Leuten die Infos stückweise aus der Nase zieht gibt es schon genug. ;)

Gruß
Dino
 
Hallo Dino03
Also es sind weiße streifen auf den LCD teste ich das LCD mit diesen code geht das


CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 24

Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , _
E = Portd.5 , Rs = Portd.6
Config Lcd = 20 * 4 , Chipset = St7032                      'Type 20 x 4 Blau LCD ST7032
Config Lcdbus = 4
Cls                                                         'LCD Leeren
Cursor Off

Initlcd

Locate 1 , 1
Lcd "ATMega8-LCD-TEST"
Locate 2 , 1
Lcd "VERSION.1.0"
Wait 2

Do

Cls                                                         'löschen des LCD                                            '
Locate 1 , 1
Lcd "Reihe1 - Zeile1"
Wait 3
Cls                                                         'Löschen des LCD
Locate 2 , 1
Lcd "Reihe2 - zeile1"
Wait 3
Cls                                                         'löschen des LCD                                            '
Locate 3 , 1
Lcd "Reihe3 - Zeile1"
Wait 3
Cls                                                         'Löschen des LCD
Locate 4 , 1
Lcd "Reihe4 - zeile1"
Wait 3
Cls
Locate 1 , 1
Lcd "ES Geht"
Locate 2 , 1
Lcd "Wunderbar"
Wait 2
Loop

und wenn ich den anderen code darauf schmeise ist das LCD eben mit 2 weisen balken.

Hoffe das hilft weiter
Gruß Thorsten Sch.
 
Und weiß jemand einen rat wieso da beim den code nichts erscheint mit Uhr und Temparatur?
 
Hallo Thorsten,

beschreib mal gleich nach Initlcd dein LCD. Vermute es liegt an Config DCF77 oder für Test diese Config deaktivieren. Springst ja mit deiner Einstellung jede Sekunde in Sub Sectic.

Gruß
 
Hallo Mein LCD zeigt folgenes an:
Zeile 1 = Weißer Strich
Zeile 2 = LEER
Zeile3 = Weißer Strich
Zeile4 = LEER

ich kann den code nicht compilieren geht nicht sehe LINK

ein anderen code geht wunderbar......

Wo ist da ein fehler

Gruß Thorsten Sch.
 
Hallo

Das lustige ist sobalt ich diese zeile rausnehme:


CodeBox BascomAVR
'Config Dcf77 = Pinb.2 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 , Gosub = Sectic

macht er nur noch Bascom 1% und sagt fertig
Mach ich ihnwieder rein so:


CodeBox BascomAVR
Config Dcf77 = Pinb.2 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 , Gosub = Sectic

compiliert er wieder bis zu 26%.

irgendwo ist doch da der wurm drin
 
Hier die LCD Bilder
Code Uhr = LCD
IMG_20160917_144050.jpg
Hier beim meinen TEST Code=
IMG_20160917_143645.jpg
IMG_20160917_143557.jpg
IMG_20160917_143545.jpg
IMG_20160917_143548.jpg
IMG_20160917_143551.jpg
IMG_20160917_143555.jpg
Das LCD Ist genau so Angeschlossen wie beim anderen code, aber nur den code zum ATMega8 geschickt
 
Hallo Mein LCD zeigt folgenes an:
Zeile 1 = Weißer Strich
Zeile 2 = LEER
Zeile3 = Weißer Strich
Zeile4 = LEER

ich kann den code nicht compilieren geht nicht sehe LINK

ein anderen code geht wunderbar......

Wo ist da ein fehler

Was denn nun. Wenn ich dies richtig deute, was ja nicht so einfach ist.
Syntax(Ctrl+F7) hat keinen Fehler angezeigt. Du kannst nur diesen Code nicht compilen den anderen schon? Bei gleichem Controller voraus gesetzt.
Wenn es so ist kann ich nicht weiter helfen.
Neuster Stand:

Da 26 % okay ist compiliert er ja doch und brennen muss ja dann auch funktionieren.
Da LCD mit anderem Code funktioniert kann ein Hardwarefehler auch ausgeschossen werden.
Also erst mal die unsinnige Gosub deaktivieren.

Config Dcf77 = Pinb.2 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1 , ‘ Gosub = Sectic
Hinweis: Zeile 1 u. 3 sowie 2 u. 4 gehören zusammen. 1 wird beim start aktiviert auch wenn die INITLCD fehlerhaft ist.

Gruß
 
Hi,

nach den Fotos kann man die Hardware schon mal ausschließen.
Sonst würden ja nicht ...
1. die beiden unterschietlichen Linientypen erscheinen (= LCD hat Kontrast und Versorgung) und ...
2. bei nem anderen Programm auch nichts erscheinen (= Daten und Control richtig angeschlossen).

Also ist der Bock im Programm. Das schränkt die Fehlermöglichkeiten schonmal ein.

Gruß
Dino
 
Hallo Thorsten,

Wie das Wort schon sagt simulieren. Also Software grob testen ohne Hardware. Dort wird auch nicht geprüft ob der Stack groß genug ist oder Zeitüberschreitungen usw.

Mit einbinden der DCF77 lib (21k hast du ja schon festgestellt) benötig man mehr Stack, somit verstehe ich auch diese Einstellung in deinem Code nicht $swstack = 8. Na klar möchte man kein Speicherplatz verschenken aber 8 ist wohl die unterste Grenze und könnte auch der Fehler sein. Versuch es mal so:

$hwstack = 32
$swstack = 32
$framesize = 32

Dann bist du erst mal auf der sicheren Seite. Kannst den Bedarf in deinem Code auch genau ausrechnen. Ich Mach es nie, da man schnell eine Variable oder Sprung nicht beachtet und erstrecht nicht wenn noch genügen Reserven vorhanden sind dann nehme ich auch schon mal bei einem größerem Projekt 500 Byte als Starteinstellung.
Wird wohl bekannt sein das ein zu kleiner Stack ein übler Fehler ist da kaum nachzuwesen wenn im Grenzbereich.

Gruß
Fred
 
Zuletzt bearbeitet:
So melde mich mal wieder zurück
ich habe jetzt ne Uhr mit folgen Bauteile
1x I2C - LCD
1x I2C DS1307 Uhrenbaustein
1x Wire DS18S20 Temparatur sensor

der code Funktioniert ja sowiet nur er zickt noch rum bei Uhrzeit anzeige und Temparatur.
könnte mir jemand helfen was man da besser machen kann.....

hier ist der code Anzeige:


CodeBox BascomAVR
If Print_lcd > 0 And Setmode = 0 Then
  Locate 1 , 1
  Lcd Time$ ; " Uhr"
  Locate 2 , 1
  Lcd Date$ ; " Datum"
  Print_lcd = 0
  Wait 5
  Cls
  Locate 1 , 4
  Lcd "TEMPARATUR"
  Locate 2 , 5
  Lcd Temperatur ; "  C" ; Chr(0)
  Wait 5
  Cls
 End If

und das ist der ganze code


CodeBox BascomAVR
$lib "Lcd_i2c.lib"                                          'ersetzt die Standard LCD Library
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

'tasten
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
S1 Alias Pinc.0
S2 Alias Pinc.1
S3 Alias Pinc.2
S4 Alias Pinc.3

'Adresse DS1307
'Adresse DS1307
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Const Pcf8574_lcd = &H70
I2cinit

Config I2cdelay = 15                                        'delay von 15=20µs=50kHz,10=10µs=100kHz;5=5µs=200KHz
Config Scl = Portc.5                                        'I2C SCL Pin
Config Sda = Portc.4                                        'I2C SDA Pin
Dim _lcd_e As Byte                                          'Daten LCD
_lcd_e = 64

Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           ' Punkt Oben Rechts

Config 1wire = Portd.5                                      'Pin fuer 1Wire festlegen

Config Timer1 = Timer , Prescale = 256                      'Timer für Sekundentakt zum
On Timer1 Sectic                                            'abfragen der RTC
Const Ladetimer1 = 22336
Enable Timer1

Config Date = Dmy , Separator = .                           'Trennzeichen Datumsformat einstellen
Config Clock = User
Dim Weekday As Byte

Dim L_sec As Byte , Print_lcd As Byte , Setmode As Byte
Dim Wert_aus_ds1820 As Integer                              'Register 2 Byte lang auslesen
Dim Ganze_grad As Word , Halbegrad As Byte
Dim Temperatur As Single
Dim I As Byte

Cls
Locate 1 , 1
Lcd "UHR I2C-DS1307"
Wait 2
Cls

Enable Interrupts

Do
 Debounce S1 , 0 , Goto_setmode , Sub

 If Setmode = 1 Then
  Debounce S2 , 0 , Sethour , Sub
  Debounce S3 , 0 , Setmin , Sub
  Debounce S4 , 0 , Setsecond , Sub
 End If

 If Setmode = 2 Then
  Debounce S2 , 0 , Setday , Sub
  Debounce S3 , 0 , Setmonth , Sub
  Debounce S4 , 0 , Setyear , Sub
 End If


 If Print_lcd > 0 And Setmode = 0 Then
  Locate 1 , 1
  Lcd Time$ ; " Uhr"
  Locate 2 , 1
  Lcd Date$ ; " Datum"
  Print_lcd = 0
  Wait 5
  Cls
  Locate 1 , 4
  Lcd "TEMPARATUR"
  Locate 2 , 5
  Lcd Temperatur ; "  C" ; Chr(0)
  Wait 5
  Cls
 End If

 If Setmode = 2 Then
  Upperline
  Lcd Time$ ; "   SET"
  Lowerline
  Lcd Date$ ; "   DATE"
 End If

 If Setmode = 1 Then
  Upperline
  Lcd Time$ ; "   SET"
  Lowerline
  Lcd Date$ ; "   TIME"
 End If

1wreset
1wwrite &HCC                                                'Bausteinauswahl ignorieren
1wwrite &H44                                                'Messvorgang anstossen
Waitus 200
1wreset
1wwrite &HCC                                                'Bausteinauswahl ignorieren
1wwrite &HBE                                                'Read Scratchpad
Wert_aus_ds1820 = 1wread(2)                                 '2 Bytes lesen: MSB, LSB
1wreset

Halbegrad = Wert_aus_ds1820.0                               'wenn 1: spaeter 0,5 addieren

Shift Wert_aus_ds1820 , Right                               'Bit 0 rausschieben

If Wert_aus_ds1820.7 = 0 Then
'  --  >= Null Grad
  Temperatur = Wert_aus_ds1820
Else
'  -- Minus-Temperatur
'  -- Zweierkomplement bilden:
  Wert_aus_ds1820 = Wert_aus_ds1820 And &B0000000011111111
  Decr Wert_aus_ds1820                                      '1 subtrahieren

  For I = 0 To 7                                            'jedes Bit invertieren
    Toggle Wert_aus_ds1820.i
  Next

  Temperatur = -wert_aus_ds1820                             'Vorzeichen setzen
End If
'--Halbe-Grad-Korrektur:
If Halbegrad = 1 Then Temperatur = Temperatur + 0.5

Loop

Goto_setmode:
  Incr Setmode
  If Setmode > 2 Then
    Setmode = 0
  End If
  Cls
Return

Set_date_mode:
 If Setmode = 0 Then
   Setmode = 2
  Else
   Setmode = 0
   Cls
  End If
Return

Setday:
 Incr _day
 If _day > 31 Then _day = 1
 Gosub Setdate
Return

Setmonth:
 Incr _month
 If _month > 12 Then _month = 1
 Gosub Setdate
Return

Setyear:
 Incr _year
 If _year > 99 Then _year = 0
 Gosub Setdate
 Gosub Getdatetime
Return

Sethour:
 Incr _hour
 If _hour > 23 Then _hour = 0
 Gosub Settime
Return

Setmin:
 Incr _min
 If _min > 59 Then _min = 0
 Gosub Settime
Return

Setsecond:
 _sec = 0
 Gosub Settime
Return

Sectic:
 If Setmode = 0 Then
   Timer1 = Ladetimer1
   Gosub Getdatetime
 End If
 If _sec <> L_sec Then
  L_sec = _sec
  Incr Print_lcd
 End If
Return

'called from ds1307clock.lib
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return


Mit Freundtlichen Grüßen
Thorsten sch.
 
Wenn du deine Rtc im Sekundentack ausliest, können 'Interferenzen' zwischen dem timer-Sekundentackt und den Rtc-Sekundentackt entstehen und du has 'hakelige' Sekundenanzeigen. Ruf deine sectic öfters auf, 5x pro Sekunde zB. Oder warte in der main, bis eine neue Sekunde von der Rtc geliefert wird.
200 microSekunden sind für den Ds1820 zu kurz, um die Temperatur zu messen.
 
Zuletzt bearbeitet:
Hmm...

Irgendwie scheint das ganze recht durcheinander - also schon im Konzept.

Du hast:
  • ein, per I²C angebundenes LCD, welches über eine lib angesteuert wird (Hardware/Software TWI? welche Pins?)
  • eine, per I²C angebundene RTC, verwendet die Hardware Pins, i2cdelay wirkt aber nur auf softTWI. Hard- oder Software?
  • einen, per 1wire angebundener Temperatursensor
Inwiefern sich die TWI-lib mit der Verwendung der Standard-TWI verträgt, kann ich nicht sagen.

Timer1 löst bei jedem Überlauf das komplette Auslesen der RTC aus. Timer1 hängt mit Prescaler 256 am Systemtakt (8MHz), incrementiert also mit 31,25kHz.
(von den 2^16 Schritten schneidest Du 22336 Schritte ab, indem Du den Timer vorstellst, effektiv macht der Timer also 43200 Schritte. Damit hättest Du IRQs mit ca 0,7Hz, also langsamer als 1Hz.
Der Timer kann sich selbst bei einem Compare Match zurücksetzen (-> CTC).
Aber die Genauigkeit ist die des Timers, und somit die der Taktquelle des Controllers. Du hast aber eine präzise RTC, die auch ihren Takt ausgeben kann, mit unterschiedlichen Vorteilern.
Man könnte also den Sekundentakt genauer durch einen externen IRQ generieren lassen, als durch Timer1.
Wenn der Takt genau ist, braucht man aber auch nicht jedesmal die komplette RTC auslesen, man weiß ja, daß sich das Uhrwerk eine Sekunde weitergedreht hat.
Man könnte also das ganze Uhrwerk selbst anlegen, sinnig wäre hier wegen der LCD-Darstellung sogar, die BCDs der RTC beizubehalten (derzeit läßt Du die RTC etwa jede Sekunde auslesen, und machst aus den BCDs dezimale Bytes. Die übergibst Du an die lib (LCD time$), welche also aus den dezimalen Werten wieder BCDs macht.).
 
Hallo Thorsten,

für dein sich ständig widerholendes Projekt, schon wieder ein neuer Code und auch Hardware.
Naja wollte eigentlich nicht mehr helfen du beantwortest wenn überhaut eine Hilfe mit einer neuen Frage die nichts mit der Hilfsantwort zu tun hat.
Weis zwar nicht was „zickt“ aber mit
Config Timer1 = Timer , Prescale = 256 'Timer für Sekundentakt zum
On Timer1 Sectic 'abfragen der RTC
Const Ladetimer1 = 22336
Enable Timer1

Bekommst du kein Sekundentakt.
Const Ladetimer1 = 22336 müsse es nicht Const Ladetimer1 = 34286 sein.

Nur mal so auf den ersten Blick.

Bitte beachte mal die Hinweis z.B. wenn in einem Projekt mehrere zeitkritische Elemente vorhanden sind, muss die Software auch darauf abgestimmt werden. Dies scheint wohl dein Hauptproblem zu sein.

Gruß
Fred
 
200 microSekunden sind für den Ds1820 zu kurz, um die Temperatur zu messen.
Sinnig wäre zb, pro Sekunde einmal den Sensor zu lesen, sofort 'ne neue Messung anzuschubsen, die gesamte Anzeige neu zu schreiben, und den Controller dann schlafen zu schicken, bis der nächste " 'ne Sekunde ist rum"-Interrupt den Controller weckt...
Bekommst du kein Sekundentakt.
Hatte ich ja auch schon angedeutet, Deine Rechnung paßt natürlich. Aber wie gesagt ist das mit dem Timer-Reload unnötig, da der Überlaufpunkt des Timers sich durch Verwendung eines Compare-Matches einstellen läßt.
Oder eben die quarzgenaue Ausgabe der RTC nutzen...
 
Hallo,

ich würde I²C- LCD so ansprechen

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 32

$lib "Lcd_i2c_TWI.lib" ‘Hardware I²C
Config Twi = 100000 ‘ Takt 100kHz
Config Scl = Portc.5 'I2C SCL Pin
Config Sda = Portc.4 'I2C SDA Pin
Dim _lcd_e As Byte ‘LCD im 4 Bit Modus
_lcd_e = 128
Config Lcd = 20 * 4
Const Pcf8574_lcd = &H70 ‘wenn A0bis A2 auf GND
Initlcd
Waitms 250 ‚Pause min ist wichtig für LCDINIT wenn am Bus noch mehr Teilnehmer.

.....
.....

Den Unterschied wirst du wohl selber sehen.

Gruß
Fred
 
Hallo Bastler und die mir schon geschrieben haben.
1.) das LCD ist nicht mehr I2C-LCD sondern zum 4Bit an portd Geklemmt, der weschel zwischen
Uhr und der temparatur ist nicht obtimal was oder wie ändern.....

Vielen dank
 
Ups Code vergessen....



CodeBox BascomAVR
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

'tasten
Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1
S1 Alias Pinc.0
S2 Alias Pinc.1
S3 Alias Pinc.2
S4 Alias Pinc.3

'LCD
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , _
E = Portd.6 , Rs = Portd.7
Config Lcd = 16 * 2                                         ', Chipset = St7032                      'Ks077                       'Einstellen des LCD 16x2 oder 20x4
Config Lcdbus = 4
Cls                                                         'LCD Leeren
Cursor Off

'Adresse DS1307
'Adresse DS1307
Const Ds1307w = &HD0
Const Ds1307r = &HD1
I2cinit

'Config I2cdelay = 15                                        'delay von 15=20µs=50kHz,10=10µs=100kHz;5=5µs=200KHz
Config Scl = Portc.5                                        'I2C SCL Pin
Config Sda = Portc.4                                        'I2C SDA Pin

Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           ' Punkt Oben Rechts

Config 1wire = Portb.0                                      'Pin fuer 1Wire festlegen

Config Timer1 = Timer , Prescale = 256                      'Timer für Sekundentakt zum
On Timer1 Sectic                                            'abfragen der RTC
Const Ladetimer1 = 22336
Enable Timer1

Config Date = Dmy , Separator = .                           'Trennzeichen Datumsformat einstellen
Config Clock = User
Dim Weekday As Byte

Dim L_sec As Byte , Print_lcd As Byte , Setmode As Byte
Dim Wert_aus_ds1820 As Integer                              'Register 2 Byte lang auslesen
Dim Ganze_grad As Word , Halbegrad As Byte
Dim Temperatur As Single
Dim I As Byte

Cls
Locate 1 , 1
Lcd "UHR - TEMPARATUR"
Locate 2 , 1
Lcd "DS1307 & DS18S20"
Wait 2
Cls

Enable Interrupts

Do
 Debounce S1 , 0 , Goto_setmode , Sub

 If Setmode = 1 Then
  Debounce S2 , 0 , Sethour , Sub
  Debounce S3 , 0 , Setmin , Sub
  Debounce S4 , 0 , Setsecond , Sub
 End If

 If Setmode = 2 Then
  Debounce S2 , 0 , Setday , Sub
  Debounce S3 , 0 , Setmonth , Sub
  Debounce S4 , 0 , Setyear , Sub
 End If


 If Print_lcd > 0 And Setmode = 0 Then
  Locate 1 , 1
  Lcd Time$ ; " Uhr"
  Locate 2 , 1
  Lcd Date$ ; " Datum"
  Print_lcd = 0
  Wait 3
  Cls
  Locate 1 , 3
  Lcd ">TEMPARATUR<"
  Locate 2 , 5
   If Halbegrad = 1 Then Temperatur = Temperatur + 0.5
   Lcd Temperatur ; "  C" ; Chr(0)
 Wait 3
 Cls
 End If

 If Setmode = 2 Then
  Upperline
  Lcd Time$ ; "   SET"
  Lowerline
  Lcd Date$ ; "  >DATE<"
 End If

 If Setmode = 1 Then
  Upperline
  Lcd Time$ ; "   SET"
  Lowerline
  Lcd Date$ ; "  >TIME<"
 End If

1wreset
1wwrite &HCC                                                'Bausteinauswahl ignorieren
1wwrite &H44                                                'Messvorgang anstossen
Waitus 80
1wreset
1wwrite &HCC                                                'Bausteinauswahl ignorieren
1wwrite &HBE                                                'Read Scratchpad
Wert_aus_ds1820 = 1wread(2)                                 '2 Bytes lesen: MSB, LSB
1wreset

Halbegrad = Wert_aus_ds1820.0                               'wenn 1: spaeter 0,5 addieren

Shift Wert_aus_ds1820 , Right                               'Bit 0 rausschieben

If Wert_aus_ds1820.7 = 0 Then
'  --  >= Null Grad
  Temperatur = Wert_aus_ds1820
Else
'  -- Minus-Temperatur
'  -- Zweierkomplement bilden:
  Wert_aus_ds1820 = Wert_aus_ds1820 And &B0000000011111111
  Decr Wert_aus_ds1820                                      '1 subtrahieren

  For I = 0 To 7                                            'jedes Bit invertieren
    Toggle Wert_aus_ds1820.i
  Next

  Temperatur = -wert_aus_ds1820                             'Vorzeichen setzen
End If
'--Halbe-Grad-Korrektur:
'If Halbegrad = 1 Then Temperatur = Temperatur + 0.5

Loop

Goto_setmode:
  Incr Setmode
  If Setmode > 2 Then
    Setmode = 0
  End If
  Cls
Return

Set_date_mode:
 If Setmode = 0 Then
   Setmode = 2
  Else
   Setmode = 0
   Cls
  End If
Return

Setday:
 Incr _day
 If _day > 31 Then _day = 1
 Gosub Setdate
Return

Setmonth:
 Incr _month
 If _month > 12 Then _month = 1
 Gosub Setdate
Return

Setyear:
 Incr _year
 If _year > 99 Then _year = 0
 Gosub Setdate
 Gosub Getdatetime
Return

Sethour:
 Incr _hour
 If _hour > 23 Then _hour = 0
 Gosub Settime
Return

Setmin:
 Incr _min
 If _min > 59 Then _min = 0
 Gosub Settime
Return

Setsecond:
 _sec = 0
 Gosub Settime
Return

Sectic:
 If Setmode = 0 Then
   Timer1 = Ladetimer1
   Gosub Getdatetime
 End If
 If _sec <> L_sec Then
  L_sec = _sec
  Incr Print_lcd
 End If
Return

'called from ds1307clock.lib
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return

 

Ü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)