Es ist mir beinahe peinlich zu berichten, das eine kräftige Erhöhung der Stacks die Lösung war,
danke, Rene
Druckbare Version
Es ist mir beinahe peinlich zu berichten, das eine kräftige Erhöhung der Stacks die Lösung war,
danke, Rene
Hallo und @all,
sitze nun schon seit Stunden daran, DCF77 und einen ds 1820 zum laufen zu bekommen.
Ich benutze die ConfigDCF77 Funktion aus Bascom heraus und einen DS1820 mit einem Mega32.
nun habe ich schon die obrigen Beiträge mir durchgelesen, aber noch keine Lösung gefunden.
Hat jemand nen Codeschnipsel für mich? Oder mir näher erklären wie ich zum ergebnis kommen kann?
Danke MAT
Wie weit bist du, was für Fehler treten auf? Bekommt du DCF ohne den DS1820 und umgekehrt zum laufen?
Hallo peterfido,
wie schon in hier alles beschrieben wurde, ist es auch bei mir.
Meine DCF77 Zeit wird korrekt angezeigt, aber es wird nicht die Temperatur
ausgelesen.
Mein DS ist ganz, das Auslesen ohne Uhrzeit funzt. Dabei habe ich mir mal mit nem Oszi den 1Wirebus angeschaut und sehe den "Verkehr" an Daten.
Mit Uhrzeit sieht es so aus, dass Daten zum/vom? gesendet werden, aber wie schon angenommen wird, nicht genügend Zeit zum auslesen besteht.
Was nun?
MAT
Ich poste mal ein paar Ausschnitte.
Evtl fehlen ein paar Variablen und Sub Declarationen, oder sind zuviel...
Code:
$regfile = "m644def.dat"
$crystal = 16000000
Config Graphlcd = 240 * 64 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Mode = 6 ', Fs = 5 , Mode = 6
Config Dcf77 = Pind.7 , Timer = 1 , Inverted = 0 , Check = 1 , Update = 0 , Debug = 0 , Gosub = Sectic ', Timer1sec = 1
'Port A0-7: Display Dataport
'Port B0: +5V für DCF Empfänger
'Port B1:
'Port B2-3: I2C für DS1307
'Port B4-7: Externe Tasten
'Port C0-4: Display Kontrollport
'Port C5: High, wenn Uhrzeit gesendet wird. an 2313 D.2
'Port C6: Anforderung Beleuchtung
'Port C7: Ansteuerung Beleuchtung
'Port D0: Seriell Empfangen an 2313 B.1
'Port D1: Seriell Senden an 2313 B.0
'Port D2-4: Tasten für Funkuhrbedienung
'Port D5-6: Relais 1-2
'Port D7: Eingang DCF Empfänger
$baud = 38400 ' use baud rate
$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 ' default use 10 for the SW stack
$framesize = 128 ' default use 40 for the frame space
Declare Sub Sekuendlich()
Declare Sub Sbtimers()
Dim Zeit_d As String * 8
Dim Datum_d As String * 8
Dim Suhrzeit As String * 1
Dim Zahl As String * 5
Dim Szeile(8) As String * 40
Dim Szeile5 As String * 5
Dim Stoppds As Byte
Dim Stoppdcf As Byte
Dim Stream As Byte
Dim Timers As Byte
Dim Takt As Integer
Dim Rprozalt As Byte
Dim Zeile As Byte
Dim Buhrzeit As Byte
Dim Ii As String * 5
Dim Belzeit As Byte
Dim Infozeit As Byte
Dim Sekalt As Byte
Dim Sekaltd As Byte
Dim Sein As String * 50
Dim Iein As Integer
Dim Pcmodus As Bit
Dim Bolinfo As Bit
Dim Modus As Byte
Dim Hh As Byte
Dim H As String * 2
Dim Mm As Byte
Dim M As String * 2
Dim Ss As Byte
Dim S As String * 2
Dim Wachhund As Byte
Dim Wachsek As Byte
Dim Wdatum As String * 8
Dim Wzeit As String * 8
Dim Wdatum1 As String * 8
Dim Wzeit1 As String * 8
Dim Wdatum2 As String * 8
Dim Wzeit2 As String * 8
Dim Empfangszeit As Integer ' Minutenzähler für den DCF Power
Dim Pcproz As Integer
Dim I As Byte
Dim X As Byte , Y As Byte
Dim Secalt As Byte
Dim A As Byte
Config Date = Dmy , Separator = . ' Deutsches-Format
Dim Zaehler As Byte
Dim Strzif As String * 1
Dim Zgross1 As Byte
Dim Zgross2 As Byte
Dim Zgross3 As Byte
Dim Zgross4 As Byte
Dim Zgross5 As Byte
Dim Zgross6 As Byte
Dim Zgross7 As Byte
Dim _dsday As Byte
Dim _dsmonth As Byte
Dim _dsyear As Byte
Dim _dssec As Byte
Dim _dsmin As Byte
Dim _dshour As Byte
Dim Wochentag As String * 11
Dim Eingang As String * 1
Dim B As Byte
Dim Nm As String * 8
Dim Uhrzeit As String * 8
Dim Mybaud As Long
Dim Einmod As Byte
Dim _dayofweek As Byte
Dim Bdatum As Bit
Dim Punkt As String * 1
Dim Byzif As Byte
Dim Zuletztgestellt As String * 17
Dcfpower Alias Portb.0
Taste1 Alias Pind.2
Taste2 Alias Pind.3
Taste3 Alias Pind.4
Relais1 Alias Portd.5
Relais2 Alias Portd.6
Sendezeit Alias Portc.5
Belan Alias Pinc.6
Beleuchtung Alias Portc.7
Set Dcfpower
Portb.1 = 1
Portb.4 = 1
Portb.5 = 1
Portb.6 = 1
Portb.7 = 1
Portc.6 = 1
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Code:Dim _dsday As Byte
Dim _dsmonth As Byte
Dim _dsyear As Byte
Dim _dssec As Byte
Dim _dsmin As Byte
Dim _dshour As Byte
Code:'configure the scl and sda pins
Config Sda = Portb.3
Config Scl = Portb.2
'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
Dim Weekday As Byte
Stoppds = 0
Stoppdcf = 0
Takt = 0
Mybaud = 19200
Zeile = 0
Enable Interrupts
Start Watchdog
Do
Reset Watchdog
Call Anzeigen
If Secalt = 1 Then
Secalt = 2
Call Sekuendlich
Call Sbtimers
Call Schalten
Secalt = 0
End If
Loop
End
Code:Sectic:
Secalt = 1
Return
Sub Sekuendlich
If Stoppds = 0 Then
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _dssec , Ack
I2crbyte _dsmin , Ack ' MINUTES
I2crbyte _dshour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _dsday , Ack ' Day of Month
I2crbyte _dsmonth , Ack ' Month of Year
I2crbyte _dsyear , Nack ' Year
I2cstop
'_dayofweek = Makedec(weekday)
_sec = Makedec(_dssec) : _min = Makedec(_dsmin) : _hour = Makedec(_dshour)
_day = Makedec(_dsday) : _month = Makedec(_dsmonth) : _year = Makedec(_dsyear)
End If
If Dcfpower = 0 Then
If Wachhund = 5 Then
Time$ = Wzeit
Date$ = Wdatum
Gosub Settime
Set Dcfpower
Dcf_status.7 = 0
Empfangszeit = 0
Wachhund = 0
End If
If Wachsek = _sec Then
Wachhund = Wachhund + 1
Else
Wzeit = Wzeit1
Wdatum = Wdatum1
Wzeit1 = Wzeit2
Wdatum1 = Wdatum2
Wzeit2 = Time$
Wdatum2 = Date$
Wachsek = _sec
Wachhund = 0
End If
End If
End Sub
Sub Sbtimers()
If _min = 57 Then
If _sec > 30 Then
Set Dcfpower
Dcf_status.7 = 0
Empfangszeit = 0
End If
End If
If _min = 27 Then
Set Dcfpower
Dcf_status.7 = 0
Empfangszeit = 0
End If
If Empfangszeit < 634 Then
Empfangszeit = Empfangszeit + 1
End If
If Empfangszeit = 634 Then
Empfangszeit = 635
Wachhund = 0
Reset Dcfpower
End If
If Empfangszeit > 635 Then
Empfangszeit = 635
End If
End Sub
In der DCF77.libCode:Pause:
Waitms 1
Return
Getdatetime:
Return
Setdate:
Stoppds = 1
If _day < 32 Then
If _month < 13 Then
If _year < 100 Then
_dsday = Makebcd(_day) : _dsmonth = Makebcd(_month) : _dsyear = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _dsday ' Send Data to SECONDS
I2cwbyte _dsmonth ' MINUTES
I2cwbyte _dsyear ' Hours
I2cstop
End If
End If
End If
Stoppds = 0
Return
Settime:
Dim Gestellt As Bit
Gestellt = 0
Stoppds = 1
Waitms 125
If _sec < 60 Then
If _min < 60 Then
If _hour < 24 Then
If _day < 32 Then
If _month < 13 Then
If _year < 100 Then
Gestellt = 1
_dssec = Makebcd(_sec ) : _dsmin = Makebcd(_min) : _dshour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _dssec ' Send Data to SECONDS
I2cwbyte _dsmin ' MINUTES
I2cwbyte _dshour ' Hours
I2cstop
_dsday = Makebcd(_day) : _dsmonth = Makebcd(_month) : _dsyear = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _dsday ' Send Data to SECONDS
I2cwbyte _dsmonth ' MINUTES
I2cwbyte _dsyear ' Hours
I2cstop
Zuletztgestellt = Date$ + "," + Time$
Reset Dcfpower
Wachhund = 0
End If
End If
End If
End If
End If
End If
If Gestellt = 0 Then
Dcf_status.7 = 0
Empfangszeit = 0
End If
Stoppds = 0
Return
auskommentieren.Code:Getdatetime:
Setdate:
Settime:
Ret
ansonsten mal deinen Code hier posten.Code:;Getdatetime:
;Setdate:
;Settime:
;Ret
Hi!
Recht umfangreich sind Deine Codes.....
Also ich habe nur folgendes drin und es funst:
Config Dcf77 = Pinb.0 , Timer = 1 , Inverted = 1 , Timer1sec = 1 , Update = 1 , Updatetime = 1 , Check = 1 , Debug = 1 , 'Switchpower = 1 , Powerlevel = 1 , Powerpin = Pina.2
Enable Interrupts
Config Date = Dmy , Separator = . 'deutsches Datumsformat
'CONFIG CLOCK = SOFT .
Dim I As Integer
Dim Sec_old As Byte , Dcfsec_old As Byte
'Dim Dcf77_signal As Word 'String * 20
Sec_old = 99 : Dcfsec_old = 99 ': DCF_Debug_Timer
= 0
For I = 1 To 78
Waitms 10
If Sec_old <> _sec Then
Exit For
End If
If Dcfsec_old <> Dcf_sec Then
Exit For
End If
Next
Waitms 220
Sec_old = _sec
Dcfsec_old = Dcf_sec
Locate 1 , 1
Lcd Time$ ; " " ; Lookupstr(_weekday , Wochentag) ; " " ; Date$ ; " "
Für die DCF Zeit, und für den Sensor:
Config 1wire = Porta.0
Dim T As Byte
Dim Id1(8) As Byte
Dim Id2(8) As Byte
Dim Ar1(2) As Byte
Dim Ar2(2) As Byte
Dim Ar(2) As Byte
Dim Temperatur1 As Integer
'Dim Temperatur2 As Integer
Dim Halb As Byte
Id1(1) = 1wsearchfirst()
'Id2(1) = 1wsearchnext()
1wreset 'reset
1wwrite &H55 'Match Rom command
1wwrite Id1(1) , 8 'Id von Sensor 1
1wwrite &H44 'Convert T
Waitms 150 '300 'warten bis convert T fertig ist
1wreset 'reset
1wwrite &H55 'match rom command
1wwrite Id1(1) , 8 'id von sensor 1
1wwrite &HBE
For T = 1 To 2
Ar(i) = 1wread(1)
Next
Deflcdchar 0 , 4 , 10 , 10 , 4 , 32 , 32 , 32 , 32 ' replace ? with number (0)
Deflcdchar 1 , 15 , 9 , 9 , 15 , 9 , 15 , 8 , 8 ' replace ? with number (1)
Locate 3 , 1
Temperatur1 = Ar(1)
If Ar(2) > 0 Then Temperatur1 = 0 Else Shift Temperatur1 , Right
Lcd "Au" ; Chr(1) ; "entempra " ; Temperatur1 ; ".";
Halb = Ar(1) And 1
If Halb = 1 Then Lcd "5" Else Lcd "0"
Locate 3 , 18
Lcd ; Chr(0)
Locate 3 , 19
Lcd "C"
Hast Du eventuell nen Code für den DS1820 mit negativer Temp-Anzeige?
Also versuche gerade auch, mehrere DS1820 abzufragen und gleichzeitig die DCF Zeit zu decodieren.
Beides funktioniert einwandfrei, aber unabhängig voneinander.
Nun das Problem ist, dass der DS1820 mind. 750ms zur Decodierung benötigt. Vor allem, wenn man die DS1820 als 1-wire benutzt. Also muss der Bus 750ms auf High liegen, damit die Decodierung funktioniert.
Nun möchte ich nicht die 750ms abwarten, der Atmega langweilt sich in der Zeit und könnte andere Dinge tun, z.B. das DCF Signal weiter decodieren.
Wie ich das ganze löse, weiss ich noch nicht. Hat jemand eine Idee?
Eventuell mit einem Takt (letzter noch übrig gebliebener Timer)?
Grüße Eisbaeeer
Hallo zusammen,
ich habe für die ganzen Aufgaben nur einen Timer laufen. Der läuft mit 8KHz über, weil er auch noch RC5 empfangen soll.
Ich benutze allerdings nicht mehr die DCF-Routine von Bascom, sondern meine eigene, weil ich da flexibler bin.
Der Sekundentakt (Interrupt) setzt ein Flag, das im Hauptprogramm abgefragt wird. Dann werden alle 7 DS1820 ausgelesen und anschließend sofort wieder die Konvertierung gestartet. Daher keine extra Wartezeit. Wenn der Sekundentakt wieder das Flag setzt, sind die DS1820 längst fertig.
Das DCF- und das RC5-Signal liegen an externen Interrupt Eingängen. Die Interruptroutinen setzen auch wieder jeweils ein Flag, welches im Hauptprogramm abgefragt wird.
Das ganze sieht dann so aus:
Alles kann parallel laufen.Code:Do
If Interrupt_vektor.7 = 1 Then
'Verarbeitung der eingehenden RC5 Signale
Endif
If Interrupt_vektor.6 = 1 Then
'Verarbeitung der eingehenden DCF Signale
Endif
If Interrupt_vektor.5 = 1 Then
'Konvertierung der Temperaturen
Endif
loop
Get_rc5_isr: 'Verarbeiten der RC5 Impulse
'Print #1 , "Received Get_rc5 Interrupt"
Incr Bit_nummer
Interrupt_vektor.7 = 1
Return
Dcf_empfang_isr: 'Impuls auf Pind.1
'Print #1 , "Received Dcf_empfang Interrupt"
Interrupt_vektor.6 = 1
Return
Sectic:
'Print #1 , "Received Sectic Interrupt"
Debug_main = Ja
Interrupt_vektor.5 = 1
Return
Gruß
Rolf
Hallo und nen netten Abend for_ro,
liebbitte kann ich Deinen code bekommen?
Hi for_ro
Danke, das war der entscheidende Hinweis.
Manchmal denkt man einfach zu kompliziert.
Wie habe ich das jetzt realisiert:
In meiner Timer Subroutine, die schon da ist (alle 25ms), habe ich eine Variable (Dim Count as byte) erhöht. Jetzt frage ich diese ab und verzweige. Die 750ms warten im Sub Convert_temp kann ich jetzt rausnehmen.
Code:If Count = 100 Then Gosub Convert_temp
If Count = 200 Then Gosub Read_temp1
Grüße EisbaeeerCode:'-------------------------------------------------------------------------------
'Sub Convert_Temp
Sub Convert_temp
1wreset
1wwrite &HCC 'Skip Rom
1wwrite &H44 'Convert Temp
' 1wreset
End Sub
'-------------------------------------------------------------------------------
'Sub Read_temp1
Sub Read_temp1
1wreset
1wwrite &H55 'Match Rom
1wwrite Id1(1) , 8 'DS1820 ID senden
1wwrite &HBE 'Read Scratchpad
Ar1(1) = 1wread(9) 'Temp Wert auslesen
1wreset
Tmp = Ar1(1) And 1
If Tmp = 1 Then Decr Ar1(1)
T = Makeint(ar1(1) , Ar1(2))
T = T * 50
T = T - 25
T1 = Ar1(8) - Ar1(7)
T1 = T1 * 100
T1 = T1 / Ar1(8)
T = T + T1
T = T / 10
T6 = T / 10
T4 = Fusing(t6 , "#.#")
End Sub