Neues Interface FHT 8I

:slight_smile:
Der war gut, genau wie Erich sehe ich das auch, zum Stricken habe ich einfach keine Lust, also mache ich was anderes.:wink:

Jeder nach seine Frisur, oder wie hieß der Haarschnitt.
Locker bleiben.

Was ich demnächst, ist noch nicht Hardwaremäßig ausprobiert, hier reinstelle, ist eine 1Wirer-Variante.
Sie ist so programmiert, dass der AVR von einem 1Wire 8-Bit Baustein 2408 parallel Daten erhählt. und so das FHB8i-Interface bedient.
Alles im Interupt und mit Busy-Fluss-Kontrolle.

Man kann den internen Oszi vom AVR nehmen, da hie keine Baudrate wichtig ist. Braucht also fast keine anderen Bauteile zusätzlich.:slight_smile:
Ev. kann man daraus ein Ipsymcon-Modul machen, falls Interesse daran besteht.
Habe von Delphi nicht so die Ahnung, aber hier gibt es gute Delphi-Progammierer, die das Modul programmieren könnten.
Gruß Helmut

Der AVR kann doch seriell, dafür gibt es doch ein Modul(Com-Port). Da braucht man nicht extra einen 1-Wire Chip davor zu hängen, oder wozu wird der gebraucht?:confused:

Auch bei 1-Wire braucht man nicht unbedingt neues Delphi-Modul, sondern könnte die Implementierung unter Nutzung der vorhandenen Module ganz bequem in PHP machen.

Tommi

Ist für den User, der schon den ComPort für das 1Wirer-Modul, also die Anbindung an den 1Wirer-Bus verbraucht hat.

Hallo,

Ich meld mich auch noch mal dazu.

Das ganze war und ist von meiner Seite gedacht, für eine Übertragung mit XBee.
Daran ändert auch die ganze mittlerweile vorgeschlagenen und auch umgesetzten Variationen nichts.

Mein Standpunkt bleibt.

Jeder hat seinen Standpunkt und dafür auch umsetzbare Visionen.

Deswegen denke ich, es soll jeder so Handhaben wie er es braucht und es einsetzten will.
Ich werde meinen Beitrag, ohne Frage dementsprechen beifügen, wenn er ausgereift und spruchfähig ist. Dann im Forum XBee.

@RWN
:onfused: Verstehe ich jetzt nicht wie du das jetzt meinst, ich will niemanden einen Standpunkt aufzwingen.
Sollte ich dich verärgert haben, war nicht beabsichtigt und ich weiss auch nicht wie.
Sollte nur ein Bauvorschlag für das ELV-Interface sein.
Gruß Helmut

Hallo Helmut,

Verstehe ich jetzt nicht wie du das jetzt meinst, ich will niemanden einen Standpunkt aufzwingen.
Sollte ich dich verärgert haben, war nicht beabsichtigt und ich weiss auch nicht wie.

Nein, um Gottes Gnaden nicht :slight_smile:

Jeder hat seinen Standpunkt und soll ihn vertreten und auch hier veröffentlichen.

Mein Standpunkt bezieht sich auf XBee, deswegen war es auch dort im Forum gepostet. Der steht immer noch. :smiley:

Nix falsch verstehen. ich bin froh über jede Information.

Hallo Helmut,

wenn Du schon dabei bist, einen Prozessor für diesen Zweck zu verbauen, dann mach doch gleich Nägel mit Köpfen:

FHT-8I - Interface-Modul mit folgenden Schnittstellen, wählbar über Jumper:

  1. RS232
  2. I2C
  3. SPI
  4. parallel
  5. 1-Wire (DS2408)

Es gibt AVRs, die (außer 1-Wire) alle Schnittstellen schon OnChip haben. Das Ganze sollte sich mit relativ wenigen zusätzlichen Bauteilen realisieren lassen.

Gruß
HJH

Hallo Hans-Jörg,

warum nicht,

FHT-8I - Interface-Modul mit folgenden Schnittstellen, wählbar über Jumper:

  1. RS232
  2. I2C
  3. SPI
  4. parallel
  5. 1-Wire (DS2408)

Es gibt AVRs, die (außer 1-Wire) alle Schnittstellen schon OnChip haben. Das Ganze sollte sich mit relativ wenigen zusätzlichen Bauteilen realisieren lassen.

Atmega 168 z.B

den Profi haben wir ja schon mal :smiley:

mach dir mal Gedanken HJH.

@HJH
ehrlich gesagt, könnte ich machen, aber braucht jeder nicht seine eigene Variante?

Ich benutze RS232, der nächste hat einen 1Wire 2408, aber er benutzt nicht beides.
Als Experimentierboard wäre es gut. Aber so, ich weiß nicht…
Wenn jemand eine andere Variante braucht, bitte melden.

Hier mal zum Diskutieren eine andere Variante:
Geht übrigens auch auf dem PC-parallel-Port.

'
' Ein parallel Adapter auf das Interface FHT8i von ELV
' zur Ansteuerung von Funk-Ventilen für Heizkörper
' nur zur privaten Verwendung

Ist vom Bastler gemacht, bitte um Nachsicht bei dem Program und der Schaltung.
Gruß Helmut

'(###### Ein Programm, das 4 Bytes vom Para-Port eines
         Ds2408 Oder Aus Der Par -schnittstelle Eine
         Computers Empfängt.

         Das Erste Byte Muss An Der 7.bitstelle Eine 1 Haben,
         Und Darf Außerdem Nicht Grösser Als 131 Dez Sein
         Das Deshalb , Weil 131 -128 , Das - > ,(die 128) , Ist Das Gesetzte Bit7,
         Max 3 Ergibt , Und Das Ist Der Max. Wert , Die Die 2. Stelle Im
         Befehlswort Hat. Das Ist Gleichzeitig Ein Start Für Den Empfang.
         Der Prozessor Benutzt Den Internen Quarz , Der Pind2(int0) Ist Mit
         Pinb7 Parallel Geschaltet , Weil Es Im Interupt Passieren Soll.

         Die Übertragung Erfolgt So : Befehl - Und Daten - Wort
         Bestehen Aus Je 2 Zeichen , Die Den Asci -code Enthalten.
         Beispiel : Antrieb 2 Auf Pos < Daten > , Soll Mal "A1" Sein .
         Befehl = 02 , Daten = A1
         ........ ^ ............
         Es Wird Das Asci -zeichen Von 0 Gesandt , Das Wäre Dezimal 48
         Da Das Erste Zeichen Aber Das Bit7 Gesetzt Haben Muß , Wird Dez 128 + 48
          = 176 Gesendet.
         Dann Folgt Das Zweite Byte , Dass Ist Der Asci -wert 2 = 50dez,
         Diesmal Darf Bit7 Nicht Gesetzt Werden,
         Das 3.byte Ist Die Zweite Stelle Von Dem Datenwert A1.
         Jetzt Wird Der Ascicode Von A = 65dez + 128 = 193dez Für Die Bitstelle7
         Gesendet.
         Das 4.byte Hat Den Asci -wert Von 1 = 49dez , Das Bit7 Wird Jetzt Nicht Gesendet,
         Also Wird Nur 49dez Gesendet
')

'$sim
$regfile = "m8def.dat"
$framesize = 24                                             'keine Ahnung ob das passt
$swstack = 8
$hwstack = 32
'$crystal = 7372800                                          'Fuse interne Quarzfrequenz setzen !
Config Watchdog = 2048                                      'reset after 2048 mSec
Start Watchdog                                              'start the watchdog timer

'### I/O Declaration  ###

Config Portc.0 = Input
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output

Config Pind.2 = Input

Config Portb = Input


'### Aliase Declaration  ###
Clockpin Alias Portc.2                                      ' Clock,Data,Load(3xOUT),Busy(IN) laut Beschreibung
Datenpin Alias Portc.1                                      ' Busy ist In,
Loadpin Alias Portc.3
Busypin Alias Pinc.0

'###  Dimensionieren und Declarieren ##
Dim Datenausgang As Long At $70 Overlay                     ' 112.Stelle im Ram, könnte gehen
Dim Quersumme As Byte At $71 Overlay
Dim Daten As Byte At $72 Overlay
Dim Befehl As Byte At $73 Overlay

Dim Befehlsbyte1 As Byte
Dim Befehlsbyte2 As Byte
Dim Datenbyte1 As Byte
Dim Datenbyte2 As Byte

Dim Befehl1 As String * 1
Dim Befehl2 As String * 1
Dim Daten1 As String * 1
Dim Daten2 As String * 1


Dim I As Byte
Dim Temp As String * 1
Dim Dat As String * 3
Dim Befehlsbyte As Byte
Dim Datenbyte As String * 1
Dim Flag As Byte


Config Int0 = Change
Enable Interrupts
Enable Int0                                                 'enable den Int0
On Int0 Para                                                ' wenn dann zu Unterprogramm Para

Print "Version von Helmut Holm vom " ; Version(1)

'################################ Hauptprogram ###############################
Do

Reset Watchdog

'(
 - - - - - - - - - - - - - - - - - - - - - - - Zum Testen - - - -
  Befehlsbyte1 = 0                                          'asciwert von 0
  Befehlsbyte2 = 50                                         'asciwert von 2
   Datenbyte1 = 55                                          'asciwert von 7
   Datenbyte2 = 65                                          'asciwert von A
')

If Flag = 4 Then                                            ' eine Datenuebertragung soll bei "4 empfangenen Daten"
  '                                                            sein
'sicherheitshalber zu Null machen

Befehl = 0
Daten = 0
Quersumme = 0

   Select Case Asc(befehlsbyte1)
      Case "0" : Befehl = 0 * 16
      Case "1" : Befehl = 1 * 16
      Case "2" : Befehl = 2 * 16
      Case "3" : Befehl = 3 * 16
      End Select

    Select Case Asc(befehlsbyte2)
       Case "0" : Befehl = Befehl + 0
       Case "1" : Befehl = Befehl + 1
       Case "2" : Befehl = Befehl + 2
       Case "3" : Befehl = Befehl + 3
       Case "4" : Befehl = Befehl + 4
       Case "5" : Befehl = Befehl + 5
       Case "6" : Befehl = Befehl + 6
       Case "7" : Befehl = Befehl + 7
       Case "8" : Befehl = Befehl + 8
       Case "9" : Befehl = Befehl + 9
       Case "A" : Befehl = Befehl + 10
       Case "B" : Befehl = Befehl + 11
       Case "C" : Befehl = Befehl + 12
       Case "D" : Befehl = Befehl + 13
       Case "E" : Befehl = Befehl + 14
       Case "F" : Befehl = Befehl + 15
            Print "Befehl" ; Befehl
      End Select

Select Case Asc(datenbyte1)
      Case "0" : Daten = 0 * 16
      Case "1" : Daten = 1 * 16
      Case "2" : Daten = 2 * 16
      Case "3" : Daten = 3 * 16
      Case "4" : Daten = 4 * 16
      Case "5" : Daten = 5 * 16
      Case "6" : Daten = 6 * 16
      Case "7" : Daten = 7 * 16
      Case "8" : Daten = 8 * 16
      Case "9" : Daten = 9 * 16
      Case "A" : Daten = 10 * 16
      Case "B" : Daten = 11 * 16
      Case "C" : Daten = 12 * 16
      Case "D" : Daten = 13 * 16
      Case "E" : Daten = 14 * 16
      Case "F" : Daten = 15 * 16
End Select

Select Case Asc(datenbyte2)
       Case "0" : Daten = Daten + 0
       Case "1" : Daten = Daten + 1
       Case "2" : Daten = Daten + 2
       Case "3" : Daten = Daten + 3
       Case "4" : Daten = Daten + 4
       Case "5" : Daten = Daten + 5
       Case "6" : Daten = Daten + 6
       Case "7" : Daten = Daten + 7
       Case "8" : Daten = Daten + 8
       Case "9" : Daten = Daten + 9
       Case "A" : Daten = Daten + 10
       Case "B" : Daten = Daten + 11
       Case "C" : Daten = Daten + 12
       Case "D" : Daten = Daten + 13
       Case "E" : Daten = Daten + 14
       Case "F" : Daten = Daten + 15
End Select

Flag = 0                                                    ' wenn das gemacht ist, auf ein Neues
Quersumme = Befehl + Daten                                  ' noch die Quersumme berechnen
Quersumme = Quersumme + 6
Gosub Ausgabe                                               ' jetzt aber raus damit
End If
                                                            ' wenn kein Flag, dann is' auch nix vom Para gekommen
Loop

Ausgabe:
Disable Interrupts                                          ' wir wollen nicht gestoert werden
Disable Int0
Reset Loadpin                                               ' Sicherheitshalber mal Loadpin auf Low
For I = 1 To 24                                             ' 24 Bit sind zu uebertragen
Set Clockpin                                                ' Clockpin setzen--
   If Datenausgang.31 = 1 Then                              ' wenn Bit31 vom Wert des Datenausgang eine 1, dann
       Set Datenpin                                         ' setze Datenpin
       Else                                                 ' oder
       Reset Datenpin                                       ' nicht
   End If
 Do
   Loop Until Busypin = 1                                   ' wenn Busy noch Low warte auf High
 Do
   Loop Until Busypin = 0                                   ' wenn Busy High war, warte bis Daten übernommen
                                                              'und deshalb Busy auf Low geht
   Reset Clockpin                                           ' neuer Clock, neues Glück
   Reset Datenpin                                           ' Sicherheitshalber Daten lieber mal auf Low
   Shift Datenausgang , Left                                ' Wert Datenausgang einmal Links schieben

Next I                                                      ' Das machmal für alle 24 Bit
Set Loadpin
Enable Interrupts                                           ' Interupt wieder frei geben
Enable Int0
Return
End                                                         'sicherheitshalber end program

Para:
If Portb.7 = 1 And Flag = 0 And Portb > 128 And Portb < 132 Then

Befehlsbyte1 = Portb And &B01111111
Flag = 1
End If

If Portb.7 = 0 And Flag = 1then
Befehlsbyte2 = Portb And &B01111111
Flag = 2
End If

If Portb.7 = 1 And Flag = 2 Then
Datenbyte1 = Portb And &B01111111
Flag = 3
End If

If Portb.7 = 0 And Flag = 3 Then
Datenbyte2 = Portb And &B01111111
Flag = 4
End If

Reset Watchdog

Return
End   

Die Übergabeparameter sind Befehl und Daten, wie gehabt, nur aufgesplittet.

Wie, steht im Text im Code, ist immernoch nicht an Hardware getestet, im Simulator geht es, sollte aber Live auch gehen.

Der AVR erkennt im Interupt ob Daten ankommen, deshalb die Verbindung nach PD2.
Hex-File und Fuse-Einstellung kommt nach, wenn ich es am 2408 probiert habe.

Gruß Helmut

Hallo, ihr Streithammel :smiley:

Besser wäre es wenn man sich zusammen tuen würde. :slight_smile:

Helmut, HJH meinte es nicht so. HJH denkt anders wie mir. Schnell, perfekt und unkompliziert. So kenn ich ihn.

Wenn man ihn einmal kennt. Er kann fast alles :stuck_out_tongue:

Ich will ihn nicht in Himmel loben, aber er ist schon ein Ass :slight_smile:

Hallo Helmut,

zu deinem Schaltplan möchte ich ein paar Bemerkungen machen:

Vier Dioden sind zu viel um die Spannung zu reduzieren. Sie sollte nicht unter 3V absinken (wegen der Sendeleistung). Drei Dioden genügen.

Der Kondensator C1 ist überflüssig. Den Zweck, für den er gedacht ist, kann er hier nicht erfüllen (wegen des nachfolgenden Anschlusskabels). Dort, wo unbedingt einer hingehört, ist schon einer vorhanden, nämlich auf der FHT-8I Platine. Du kannst ihn getrost weglassen, ohne Nachteile befürchten zu müssen.

Die Spannungsteiler zur Pegelanpassung dürfen ruhig etwas hochohmiger sein. Sie „verbraten“ im Hi-Zustand jeder etwa 5mW an Verlustleistung. Vorschlag: 10k + 10k

Der Versorgungspin des Prozessors sollte unbedingt einen keramischen 100nF Kondensator erhalten.

Wie soll Deiner Planung zufolge der Interrupt bei der Datenübergabe funktionieren?
Der Pegel vom Datenbit PB7 ist abhängig vom übertragenen Datenbyte. Er ist nicht vorhersehbar, und es ist also folglich Zufall, ob ein Interrupt erzeugt wird.
Du solltest das noch einmal überdenken.

Die Schaltung für mehrere Schnittstellen auszulegen kann durchaus sinnvoll sein. Man kann z.B. eine vollbestückte Platine zum Experimentieren verwenden. Jemand, der nur die serielle Schnittstelle benötigt, wird eben nur diesen Teil bestücken und den Rest freilassen. Das Layout wird daurch praktisch nicht teurer und man braucht nicht fünf verschiedene Platinen.

Gruß
HJH

zusätzlich zu HJH hätte ich auch noch eine Kleinigkeit:
Lt. Atmel sollte der Reset-Pin über mindestens 10kOhm an VCC angeschlossen werden, damit beim ISP der Pegel noch sauber runter kommt.
Ich setze meistens nur einen 100nF Keramic Kondensator dazu in die Reset-Leitung, das hat bisher immer funktioniert.

Tommi

Moin Moin,
wer streitet denn, HJH gibt fachliche Ratschläge. Hat nu ja auch Ahnung!

Zu den Dioden, habe ich im ersten Schaltplan auf 4 erhöht, (kann man an der unterschiedlichen Zeichnungsgröße erkennen), nachgerüstet, weil doch littelbit zuviel Volt’s waren.
Den Elko weglassen, jo, könnte sein, obwohl das Display an Kontrast verliert wenn er sendet.
Der Interupt erfolgt auf PD2/Int0, deshalb ist der Pin auch mit an PB7 angeschlossen. Da der Wert dann nicht über 128 sein kann (das Bit an PB7 wird mit dem Und-Befehl entfernt), ev. müssen die Daten dann aus zwei oder mehren übertragenen Werten zusammen gesetzt werden, da bin einem Denkfehler erlegen, ist ja Hex…
Ich lasse den Code trotzdem mal in dem Posting drin.
Ich kenne hier einige gute Bascom-Kenner !!:wink:
Aber das wird schon !?
.
Wenn ich das Programm fertig getestet habe, kommt auch der Code und das Hex-File.
Spannungsteiler, jo, wirst’e Recht haben, kann man auch erhöhen.
Zu dem Kondensator, ich könnte behaupten, mein Sockel hat ihn, gibt es ja, tue ich aber nicht.:slight_smile:
Und zum Reset-Anschluß, der ist an PC6 und hat einen Widerstand und Kondensator.
Aber wie gesagt, ist nur 'ne Bastellei von mir, die ich gerne weiter gebe, mehr nicht. Und zu einem Streit muss das hier nicht führen.
Aber, ich glaub 'ne Uniplatine …mache ich, oder doch…glaube ich… nicht.
Nöööö, das eher nicht.
Also, ich weiß von HJH gut gemachten Schaltungen und Platinen, nur her mit den Bemerkungen, bringt mich eher weiter als zurück, finde ich.
Schöne Grüße Helmut

[Und zum Reset-Anschluß, der ist an PC6 und hat einen Widerstand und Kondensator.

Habe ich auch gesehen. Ich wollte nur sagen, das ich die Dimensionierung mit 5.6k/1µF Elko nicht so machen würde.

Tommi

Ist noch aus alten Zeiten im Kopf bei mir, Manche machen überhaupt keinen C da ran.
Hast du einen Vorschlag um im Interrupt zu übertragen und trotzdem über den nur 8-Bit breiten Port zu gehen? Grübel, grübel :rolleyes: :rolleyes:

Schöne Grüße Helmut

Also, wenn Du nicht mit ISP arbeiten möchtest (und ich sehe am Schaltplan keinen ISP-Anschluß), dann kann der /Reset direkt mit VCC verbunden werden. Spart wieder 2 Bauteile :o

Hast du einen Vorschlag um im Interrupt zu übertragen und trotzdem über den nur 8-Bit breiten Port zu gehen?

Naja, ehrlich gesagt, würde ich das ganze ohne irgendwelche Interrupts lösen. Der MEGA langweilt sich ja sowieso zu Tode. Ich finde, der kann ruhig die ganze Zeit das Port pollen. Aber um mit 8 Leitungen 9 Bit (8xData, 1x Select Data/CMD) zu übertragen wird Dir nichts anderes überbleiben als jedes Byte aufzuteilen
zB:
D0 = Strobe
D1…D2 = ID ->
00=Daten low Nibble
01=Daten high Nibble
10=CMD low Nibble
11=CMD high Nibble
D3 not used
D4…D7 = Daten

Den Elko weglassen, jo, könnte sein, obwohl das Display an Kontrast verliert wenn er sendet.

Die Dioden verändern ihre forward-voltage abhängig vom forward-current! Umso mehr Strom fließt, umso mehr Spannung fällt ab. Ich würde mal überlegen, ob man nicht einfach einen Festspanungsregler einbaut. Ich habe nämlich keine Ahnung, inwieweit sich der Spannungseinbruch auf die Sendeleistung bzw. das Einschwingen des Senders auswirkt.

Gruß
Erich

theoretisch könnte man den AVR so programmieren, das er das eigentlich für den DS2408 gedachte Signal über INT direkt verarbeitet, sozusagen ein AVR2408. Dann merkst Du in der Software selber, wenn das Byte fertig ist.

Tommi

Theoretisch denkbar. Wäre sicher eine ganz nette Anwendung. Leider habe ich bis jetzt keinen 1Wire-Slave für Bascom gesehen. Vielleicht hat jemand Lust und Laune dazu. Damit könnte man dann intelligente I/Os bauen (abgesehen von der aktuellen Anwendung für das FHT8I) und im IPS als ganz normale 2408 ansprechen.

Gruß
Erich

Für I2C gibt es solche Slave-Bibliotheken.

für 1Wire :
hier steht eine ganze Menge dazu (incl. Beispiel)

Wenn ich mir das so durchlese, ist es eine recht aufwendige Methode, sich „in den Kopf zu schiessen“:mad:. Aber es geht.

Da erscheint es mir einfacher, eine Übergabe seriell (1Pin Daten, 1Pin Clock)zu machen, wenn unbedingt Ports gespart werden müssen. Oder halt das „Nibble“-Verfahren, wie es Erich vorgeschlagen hat. Immerhin werden so ja auch LCDs angesteuert.

Evtl. gibt es auch noch andere 1Wire Komponenten, die besser geeignet sind(Dualport-Ram, I2C-Bridge, 1Wire Seriell Adapter o.ä., keine Ahnung)

Am aller einfachsten aus IPS-Sicht ist es meiner Meinung nach den Comport zu nutzen.

Tommi