1Wire

Hi Dino

Bevor ich das Display in Betrieb genommen habe waren erst mal Lötarbeiten angesagt, die aber schnell erledigt waren. :pleasantry:
Dann kam der teil mit dem Googeln, der ja wie schon bekannt ist , einiges an Lesezeit kostet; die sich aber gelohnt hat. :( :( :(
Siehe Bild. :D :D :D

Code:
$regfile = "m32def.dat"
$crystal = 3686400

' LCD konfigurieren Port auf Ausgabe setzten und Pin's entsprechend zuordnen
Ddrb = &HFF

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , E2 = Portb.2 , Rs = Portb.1
Config Lcd = 40 * 4

   'Grad zeichen"°" chr(0)
Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32


' Pin für 1wire Schnittstelle festlegen
Config 1wire = Portd.4

Dim ___lcdno As Bit
Dim T1 As Integer                                           'hilfs Variable für die berechnung Temp1
Dim T2 As Integer                                           'hilfs Variable für die berechnung Temp1
Dim T3 As Integer                                           'hilfs Variable für die berechnung Temp2
Dim T4 As Integer                                           'hilfs Variable für die berechnung Temp2
Dim T5 As String * 5                                        'Variable für Temp1 zur anzeige auf dem LCD
Dim T6 As String * 5                                        'Variable für Temp2 zur anzeige auf dem LCD
Dim T7 As Single                                            'hilfs Variable für die berechnung Temp1
Dim T8 As Single                                            'hilfs Variable für die berechnung Temp2
Dim Id1(8) As Byte                                          'für die adresse Sensor 1
Dim Id2(8) As Byte                                          'für die adresse Sensor 2
Dim Ar1(9) As Byte
Dim Ar2(9) As Byte
Dim I As Byte , Tmp1 As Byte , Tmp2 As Byte
'Dim Crc As Byte
Dim W As Byte

  'Unterprogramme
Declare Sub Con_temp
Declare Sub Temp1
Declare Sub Temp2

   '1wire Bus absuchen
W = 1wirecount()
Print W
Id1(1) = 1wsearchfirst()
Id2(1) = 1wsearchnext()


  'Ersten text aufs Display schreiben

___lcdno = 0                                                'Obere Displayhälfte initialisieren, für den ersten Controller
Initlcd
Cls
Home
Cursor Off
Locate 1 , 1
Lcd "Innen"
Locate 2 , 1
Lcd "Aussen"

___lcdno = 1                                                'Untere Displayhälfte initialisieren, für den zweiten Controller
Initlcd
Cursor Off
Cls
Home
Locate 1 , 1
Lcd "Standart aus dem Internet"
Locate 2 , 1
Lcd "(c) Ralf Neubert"


  'Hauptprogramm
Do

  Gosub Con_temp
  Gosub Temp1
  Gosub Temp2

  'Temperaturen und °C aufs Display schreiben
   ___lcdno = 0                                                'Obere Displayhälfte initialisieren, für den ersten Controller
   'Initlcd
   Home
   Cursor Off
   Locate 1 , 8
   Lcd T5 ; Chr(0) ; "C"
   Locate 2 , 8
   Lcd T6 ; Chr(0) ; "C"
Loop

      'Temperaturen Convertieren
Sub Con_temp
   1wreset
    1wwrite &HCC
    1wwrite &H44
      Waitms 1800
    1wreset
End Sub


  'Temperatur 1 Berechnen
Sub Temp1
 1wreset
  1wwrite &H55
  1wwrite Id1(1) , 8
  1wwrite &HBE
   Ar1(1) = 1wread(9)
   1wreset
     Tmp1 = Ar1(1) And 1
     If Tmp1 = 1 Then Decr Ar1(1)
     T1 = Makeint(ar1(1) , Ar1(2))
     T1 = T1 * 50
     T1 = T1 - 25
     T2 = Ar1(8) - Ar1(7)
     T2 = T2 * 100
     T2 = T2 / Ar1(8)
     T1 = T1 + T2
     T1 = T1 / 10
     T7 = T1 / 10
     T5 = Fusing(t7 , "###.#" )
End Sub

  'Temperatur 2 Berechnen
Sub Temp2
 1wreset
  1wwrite &H55
  1wwrite Id2(1) , 8
  1wwrite &HBE
   Ar2(1) = 1wread(9)
   1wreset
     Tmp2 = Ar2(1) And 1
     If Tmp2 = 1 Then Decr Ar2(1)
     T3 = Makeint(ar2(1) , Ar2(2))
     T3 = T3 * 50
     T3 = T3 - 25
     T4 = Ar2(8) - Ar2(7)
     T4 = T4 * 100
     T4 = T4 / Ar2(8)
     T3 = T3 + T4
     T3 = T3 / 10
     T8 = T3 / 10
     T6 = Fusing(t8 , "###.#" )
End Sub


End

Gruß Ralf :cheers: :party:
 

Anhänge

  • IMG_2197 klein b.jpg
    IMG_2197 klein b.jpg
    226,1 KB · Aufrufe: 43
Hallo Ralf!

Hey, das sieht ja super aus! :party:


Wenn ich mir deine Codezeilen so ansehe dann war es doch gar nicht so schwer, dass Display in Betrieb zu nehmen. ;)

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , E2 = Portb.2 , Rs = Portb.1
Config Lcd = 40 * 4


Mustest du noch andere Dinge ändern, oder hat es mit dem "E2=" gleich geklappt?


Als Grad Celsius - Zeichen habe ich mir mal dieses erstellt:
Code:
Deflcdchar 0 , 24 , 24 , 6 , 9 , 8 , 9 , 6 , 32             ' Grad Celsius
vielleicht gefällt es dir ja auch! ;)




Was deinen "DS1820-Code" betrifft stehe ich zwar mit der Berechnung der Temperatur noch etwas auf "Kriegsfuß", aber wenn es denn passt....
Kann das ja in einer freien Minute noch mal abgleichen. Muss mich erst mal in deine ganzen Temp-Variablen hinein denken. ;)


Dann gratuliere ich schon mal zum Etappensieg! :)

Gruß,
Cassio
 
Hi Thomas!

Stimmt! Das ist eine gute Idee!

Erspart allen Usern nach einiger Zeit doch eine Menge Sucherei bei Google und Co. ;)

Außerdem kann man vor einer Bestellung hier mal schnell reinschauen, ob es die richtige Entscheidung ist.... oder man evtl. nur vom günstigen Preis geblendet war.

Gruß,
Cassio
 
Hallo Cassio

Danke für die Blumen.
Das mit dem Pin E2 war nicht das einzige, man muss noch zwischen Controller 1 und Controller 2 hin und her schalten.Dazu habe ich die variable
HTML:
Dim ___lcdno As Bit
definiert.
HTML:
___lcdno = 0                                                'Obere Displayhälfte initialisieren, für den ersten Controller
Initlcd
Cls
Home
Cursor Off
Locate 1 , 1
Lcd "Innen"
Locate 2 , 1
Lcd "Aussen"

___lcdno = 1                                                'Untere Displayhälfte initialisieren, für den zweiten Controller
Initlcd
Cursor Off
Cls
Home
Locate 1 , 1
Lcd "Standart aus dem Internet"
Locate 2 , 1
Lcd "(c) Ralf Neubert"
Mit" ___lcdno = 0" wird die Obere hälfte des LCD Initialisiert
und mit "___lcdno = 1" wird die Untere hälfte Initialisiert.
Das muß dann, vor jeder ausgabe aufs Display, stehen. :eek:
Dein Grad Celsius gefällt mir gut, ist schön klein wenn ich darf werde ich es übernehmen.:pleasantry:

Das mit der Temperatur berechnung habe ich mir auch zusammen gesucht, scheint aber beim ersten überfliegen im Datenblatt zustimmen.
Wird aber noch weiter Kontrolliert.;)

Gruß Ralf :D
 
Hallo Ralf!

Nun ja, dass mit den beiden Inits für die LCD-Controller ist ja nicht so tragisch!

Schreib doch einfach zwei Subroutinen (z.B. Lcd_oben und Lcd_unten) und ruf dann zur Ausgabe auf dem Display einfach die entsprechende Sub auf mit :
Gosub Lcd_oben
bzw.
Gosub Lcd_unten

Würde doch den Code vereinfachen und gleichzeitig verkürzen. ;)


Dein Grad Celsius gefällt mir gut, ist schön klein wenn ich darf werde ich es übernehmen.

Natürlich kannst du es verwenden.... Dafür habe ich es ja hier eingestellt. ;)
Außerdem kannst du dir solche Zeichen auch problemlos selber erstellen.
Bei BASCOM hast du unter "Tools" dafür den "LCD Designer"...... Ist kinderleicht zu bedienen!

Dann mal viel Spaß weiterhin!

Cassio
 
Hallo zusammen

Habe da mal ein Problem.
Seit ich das neue LCD in Betrieb habe, springen beide Temperaturen um bis zu 1,6°C. Hat einer eine Idee was das sein kann.??? :confused: :confused: :confused:

Gruß Ralf :(
 
Hallo Ralf!

Was bedeutet denn:
springen beide Temperaturen um bis zu 1,6°C

:confused: :confused: :confused:


Da die Innen- und die Außentemperatur sich scheinbar gleichzeitig ändert, klingt es nach einem zeitlichen Problem im Programm.

Ist aber nur eine wage Vermutung.....

Beschreib das Problem doch mal bitte etwas genauer. ;)

Gruß,
Cassio
 
Hallo Cassio

Die Innen und Aussentemp. ändern sich nicht oder nicht immer gleichzeitig um bis zu 1,6°C.
Meistens sind die Temperatur schwankungen kleiner und es ändert sich halt nur eine Temp, die mit dem kabel. :confused: Hin und wieder springt dann auch mal die Innentemp. :confused:
Werde morgen noch mal das alte LCD anschliessen und schauen ob es damit zusammenhängt.
Werde mich dann wieder melden.
Danke für die Tips. :flowers:

Gruß Ralf
 
Hallo Ralf!

Wenn hauptsächlich der Sensor mit dem Kabel probleme macht, dann würde ich den erst einmal abklemmen.

Letztlich laufen ja beide Sensoren auf dem selben BUS..... Draht. ;)
Das würde auch erklären, warum der Innensensor auch hin und wieder Probleme hat.

Nimm den Außensensor doch mal wieder direkt an den Testaufbau.... ohne das Kabel dazwischen.

Ist der Außensensor wirklich in Außenbereich? Was ist mit der Luftfeuchtigkeit? Wie hast du ihn denn verpackt?

Diese Dinge sind vielleicht einfacher zu testen, als das Display wieder zu ändern.

Hast du ein Speicher-Oszilloskop? Vielleicht helfen dir ja ein paar Messungen auf der Signalader...... ist aber gar nicht so einfach. ;)


Wünsch dir Glück beim Suchen!
Cassio
 
Hallo Cassio

Mir ist heute morgen aufgefallen das die Temperaturen nicht springen und zwar war mein Rechner nicht an.
Habe eine Funk Maus und Tastatur, wenn der Rechner an ist und ich benutze die Maus, den fängt nach einer gewissen zeit, die Temperatur an zu springen.
Fahre ich den Rechner wieder runter ist nach kurzer Zeit wieder alles I.O. :rolleyes:
Ein Oszilloscope habe ich aber kein Speicher oszi, das habe ich auf der Arbeit, kann ich aber leih weise bekommen. Nächste woche gehe ich wieder Arbeiten dann nehme ich es mal mit und kontrolliere den 1wirebus.

Gruß Ralf :D
 
Hallo Ralf!

Na, da war die Störungsquelle ja schnell gefunden. :)


Ist ja ähnlich spannend wie meine Beobachtungen mit meinem DCF77-Modul.
Es gibt bestimmte Zeiten, da empfängt es einfach keine vernünftigen Signale....

Habe hier schon einiges ausprobiert und glaube langsam, es liegt am Nachbarn. ;)


Du kannst die ja mal den Spaß machen und ein Scope an die Datenleitung anschließen.
Ein Speicher-Scope sollte es deswegen sein, weil ja nur ein paar kurze Signale gesendet werden und es sonst nicht viel zu sehen gibt. ;)

Habe ihr ein kleines digitales Scope (nichts besonderes) und da kann ich eine "Once"-Trigger-Einstellung vornehmen. Damit wartet das Scope auf den Durchlauf einer Periode (oder das Ende von Signalen... bis zum max. der eingestellten Zeit) und speichert dann den Inhalt.
Damit lassen sich die Signale auf dem BUS ganz gut erkennen.... aber diese dann auch auszuwerten ist ein ganz anderes Thema. ;)
Zumindest würdest du sehen, ob sich starke Veränderungen oder Störungen auf der Signalader befinden. Obendrein kannst du an der Spitze der Signale feststellen, welche Spannungshöhe besteht und ob vielleicht deine Leitung etwas zu lang geworden ist. ;)

Effektiv hast du aber den Fehler ja schon gefunden und die Sache mit dem Scope wäre einfach nur mal eine interessante "Speilerei". :)

Schöne Grüße,
Cassio
 
Hi Cassio,

Habe ihr ein kleines digitales Scope (nichts besonderes) und da kann ich eine "Once"-Trigger-Einstellung vornehmen. Damit wartet das Scope auf den Durchlauf einer Periode (oder das Ende von Signalen... bis zum max. der eingestellten Zeit) und speichert dann den Inhalt.
Nennnt sich Single-Trigger. Es wird nicht immer wieder neu gestartet sondern
nach dem Trigger-Ereignis nur einmal aufgenommen. Damit habe ich mir mein
1-Wire auch mal angesehen.

Damit lassen sich die Signale auf dem BUS ganz gut erkennen.... aber diese dann auch auszuwerten ist ein ganz anderes Thema. ;)
Das habe ich gemerkt :D
Entweder Du bekommst nicht die ganze Kommunikation mit da der Speicher
nicht reicht oder du bekommst die kurzen Signale nicht mit, weil die zwischen
die Abtastungen fallen. So oder so ist das schwierig. 2k-Samples reichen
auf jeden Fall weder hinten noch vorne bei einer 1-Wire-Kommunikation.
Man muß auf jeden Fall auf eine fallende Flanke triggern (Der Start des
Reset-Pulses) und bekommt dann den ganzen Anfang mit Acknowledge-Puls
und der ersten Hälfte von der ReadROM-Ausgabe mit. Dann sind die 2k voll.
Darum habe ich auch mit dem Analyzer angefangen.

Da fällt mir ein ... Man könnte noch einen Trigger-Generator für ein DigiScope
einbauen. Damit man auch auf Probleme in der Mitte einer Kommunikation
triggern kann :D Gut das wir darüber gesprochen haben :rolleyes:

Gruß
Dino
 
Hallo zusammen

Bin froh das Ich den fehler gefunden habe ,der eigentlich keiner war. :p

Habe gerade mal die alte DCF77 von der C-Unit raus gekramt und angeschlossen, dann noch das beispiel Programm aus der Bascom hilfe eingespielt und sihe da es, Kalappert auf anhieb. :D
Aber dann kam die große überraschung, wollte die DCF77 dann in mein Programm einbinden und muste feststellen, das der Programmcode größer als 4kb ist. Da ich ja noch die Demo version benutze. :eek:
Muß mich einwenig gedulden bis ich mir die Vollversion zulegen kann. ;)
 

Anhänge

  • IMG_2202a.jpg
    IMG_2202a.jpg
    201,5 KB · Aufrufe: 31
Hallo Thomas

Der Programmcode ist 3,57kb groß, ohne die Implementierung der DCF77.
Sobald ich "Config Dcf77 " einfüge und Compilieren möchte sagt mir Bascom das der Code zu groß ist.
Bitte Korrigiere mich wenn ich falsch liege, ich glaube aber das liegt dann an der
dcf77.lbx datei.
Die ja automatisch mit dem befehl Config Dcf77 eingebunden wird und ca.7,8kb groß ist. Aus der Bascom hilfe:
ASM

_DCF77 from DCF77.LBX is included by the compiler when you use the CONFIG statement.

Habe ich hoffentlich richtig übersetzt.:rolleyes:

Gruß Ralf :cheers:
 
Hallo Ralf!

Jepp, das hat du richtig übersetzt! ;)

Mit "Config DCF77..." wird alles weitere veranlasst und du musst dich nicht selbst um das Einbinden einer LBX (LIB) kümmern!

Ist natürlich schade, dass du nun nicht weiter kommst....

Und? Schon die Vollversion bestellt? :)


Wenn der Test nun wichtig ist.... und es eine Ausnahme ist.... dann müsst es aber auch funktionieren, dass du deinen Code hier fertig einstellst.... ein anderer ihn kompiliert und die HEX-Datei hier dann wieder postet.

Gruß,
Cassio
 
Hallo Cassio

Der Test ist nicht wichtig, ist halt meine Bastelei die mir viel spass macht.
Und das daß mit dem Programmieren so gut klappt, freut mich natürlich. ;)
Werde mich ein wenig in gedult üben, bis die Vollversion da ist. :)
Bis dahin werde ich die einzelnen Programm-abschnitte testen und wenn ich fragen habe oder erfolge, sie hier Posten. ;)

Es ist schon ein Klasse Forum hier, hier kommen keine dummen sprüche rüber, es wird einem immer geholfen.
In anderen Foren habe ich schon üble sachen erlbt. Beleidigungen, anfänger gehören hier nicht hin, u.s.w.

Danke!!!

Gruß Ralf :D
 
Hallo Ralf!

Ich hatte mir bei meiner letzten Pollin-Bestellung auch "dein" 27x4 Text-Display besorgt und wolltes es heute endlich mal in Betrieb nehmen.

Es hat auch fast auf anhieb geklappt...... aber eben nur fast. :(
Leider "blinkten" die unteren beiden Zeilen so alle 2 Sekunden und wollten kurzzeitig dabei den Inhalt der ersten beiden Zeilen darstellen. :confused:

Ich habe hier nun gut 4 Stunden geknobelt, warum die Ansteuerung der beiden Display-Controller nicht sauber funktioniert. :hmmmm:


Letztlich hast du mich mit deiner Codezeile.......
Code:
Dim ___lcdno As Bit
......ziemlich in die Irre geleitet. ;)


Die Variable "___lcdno" muss nämlich als Byte dimensioniert werden.... und nicht als Bit. :)


Das war wirklich alles...... und nun funktioniert es auch einwandfrei! :D


Sollte also noch jemand "blinkende" Probleme mit dieser Art Display haben, so muss er sich nun nicht mehr den ganzen Abend mit der lustigen Fehlersuche beschäftigen. ;)

Grüße,
Cassio
 
Hallo Cassio

Habe meine Anzeige mit einem Bit versehen weil ich es so beim googeln gefunden habe.
In meinem Progamm steht Bit und es funtioniert einwandfrei, siehe Bild.

Code:
Const Dcf77_testmodus = 1                                   ' Testmodus für DCF77
Dim ___lcdno As Bit
Dim Dcf77_hour As Byte                                      ' Globale Stundenvariable
Dim Dcf77_min As Byte                                       ' Globale Minutenvariable


Gruß Ralf
 

Anhänge

  • IMG_2415[1].jpg
    IMG_2415[1].jpg
    186,8 KB · Aufrufe: 27

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