K-BUS TRanciever Melexis TH3122

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
wie vl schon jemand mitbekommen hat will ich den Kbus vom BMW anzapfen,.
dafür nutze ich den melexis 3122,.
wollt nur mal nachfragen wqs ich denk wie ich die versch Pins des Chips am besten verschalten/event im Prog benutzen sollte..
hab da nich so die erfahrungen,.

http://www.yeint.ru/suppliers/melexis/pdf/TH3122_004.pdf

es geht gerade um das Sense/Reset signal,. im moment möchte ich nur empfangen,. aber eigentlich später auch senden,.
 
SEN/STA an einen normalen als Input konfigurierten GPIO-Pin vom Atmega hängen. Die Pins TX und RX dürften klar sein. Genau so wie IBus-Pin.

Verwendest Du den Spannungsregler des TH3122 oder liegt er brach?
 
Klar, das wollt ich eigentlich so machen, wie in dem beispiel, dachte eher, wie ich den sta abfragen muss,
benutze den SPannungsregler, zur versorgung des tiny
Der wird 0, wenn ich was uebermitteln kann, oder muss ich den uart eingangspuffer dann auch mit ischarwaiting() pruefen? Oder macht das der chip ?
wobei , wenn ich mir figure1 anschaue, dann koennt man meinen sense, ist wie ein Interrupt bei Bus aktivität ?!
 
Hi,

Klar, das wollt ich eigentlich so machen, wie in dem beispiel, dachte eher, wie ich den sta abfragen muss,
...
Der wird 0, wenn ich was uebermitteln kann, oder muss ich den uart eingangspuffer dann auch mit ischarwaiting() pruefen? Oder macht das der chip ?
wobei , wenn ich mir figure1 anschaue, dann koennt man meinen sense, ist wie ein Interrupt bei Bus aktivität ?!
Auf Seite 4 steht was zum Pin.
SEN/STA ist auf jeden Fall bidirektional. Du kannst über den Pin also die Übertragung anschalten und du kannst darüber sehen ob der Bus frei ist und wirklich das übertragen hat was du angelegt hast.
Also sozusagen ein "Sender Freigabe" und "Bus Frei" und "Kollisionserkennung".

Der Sense-Pin scheint eine Unterspannungserkennung zu sein. Wenn der Baustein also zu wenig Versprgungsspannung erhält.

Auf Seite 11 stehen nochmal die Erklärungen der Pin-Kurzbezeichnungen.

Gruß
Dino
 
Du kannst über den Pin also die Übertragung anschalten und du kannst darüber sehen ob der Bus frei ist und wirklich das übertragen hat was du angelegt hast.
Also sozusagen ein "Sender Freigabe" und "Bus Frei" und "Kollisionserkennung".

meint du sowas wie ein schieberegister mit latch?
erst alles per uart ausgebene, und dann die übertragung starten?
 
meint du sowas wie ein schieberegister mit latch?
erst alles per uart ausgebene, und dann die übertragung starten?
Nein.

Das Ding ist eigentlich nichts weiter wie ein MAX232. Nur nicht für RS232 sondern für den K-Bus.
Also eigentlich lediglich eine Anpassungsschaltung an die Physik vom verwendeten Bussystem.

Der Pin hat folgende Funktion ...
- Als Eingang schaltest du damit den Sender des Wandlers ein. (sonst stellt sich der Sender tot)
- Als Ausgang sagt dir der Pin ob der Bus frei ist (wenn du nix sendest)
- Als Ausgang sagt dir der Pin ob der gesendete Pegel wirklich auf dem Bus anliegt (wenn du was sendest).

Der Chip hat keine internen Register die irgendwelche Daten zwischenspeichern. Es ist lediglich eine Anpassungsschaltung.

Dein "Schieberegister" ist der UART im Atmel. Sieh den Chip also einfach quasi als MAX232 an. Der speichert auch nix zwischen.

Gruß
Dino
 
Oder direkt die entsprechenden Bits in den entsprechenden Registern umsetzen...
für die Datenrichtung (Eingang/Ausgang) das DataDirectionRegister des entsprechenden Ports (DDRn.x), für den tatsächlichen Pegel (beim Ausgang) dann das Port Latch Register (PORTx.n). Wenn der Pin also tristate sein soll, müssen die beiden bits auf 0 gesetzt werden.
Dino hatte hier irgendwo mal den (vereinfachten) generellen Schaltplan der I/Os verlinkt - findet sich aber auch in jedem Controllerdatenblatt wieder - da wird dann auch die Funktion der Bits klar (also wie die 2 Bits die 4 Zustände einstellen - das PullUpDisable (PUD) jetzt mal außen vor).
 
sry wenn ich nochma dumm nachfrage, so dann ?

Code:
   'Sender einschalten, PIn als Output konfigueiren
   Portd.6 = 0
   Ddrd.6 = 0
   Sen_sa = 1

   'Prüfen ob bus frei ist
   Portd.6 = 0
   Ddrd.6 = 1
   If Sen_sa = 1 Then
      Print "BUS frei"
   End If
 
Beim SEN/STA kannst Du die laufende Übertragung abbrechend und der sendenden ECU sagen "Klappe halten". Und zum Anderen kannst Du damit erkennen, ob eine Übertragung stattfindet.

WICHTIG: Während Du sendest, musst Du den Empänger (Bit RXEN) und die dazugehörende ISR (Bit RXCIE) deaktivieren. Sonst hast Du eine Endlosschleife.

Ich habe irgendwo einpaar Beispiele für den TH3122, allerdings in C. Wenn es Dir hilft, kann ich sie raussuchen und hochladen.

Frohes Neues übrigens :)

Grüße
Heinrich
 
...WICHTIG: Während Du sendest, musst Du den Empänger (Bit RXEN) und die dazugehörende ISR (Bit RXCIE) deaktivieren. Sonst hast Du eine Endlosschleife...
Warum das?
Wirft der TH3122 das gesendete auch gleich zurück? (Weil er es auf den Bus legt, und dort gleich empfängt?)
Aber warum zwingend beides (also sowohl den RX-Interrupt, als auch den Empfänger als ganzes)?
Wenn Du der Interrupt-Hardware nur die Möglichkeit nimmst, beim RX einen IRQ auszulösen (also den RX complete Interrupt nicht enablest (RXCIE=0), tritt doch bei weiterhin aktiver RX kein IRQ ein. Du mußt dann aber das korrespondierende Interrupt-Flag löschen, bevor der der RXCIE wieder aktiviert wird.
Wenn Du lediglich den Empfänger abschaltest (also RXEN=0), sollte der RXCIE keine Rolle mehr spielen - da der RX-Pin gar nicht mit der UART-Logik verbunden ist, kann von dort auch kein komplettes UART-Paket empfangen worden sein, also auch das Flag nicht gesetzt, und kein Interrupt ausgeführt...
Warum zwingend beides?

Achtung: Wenn der Empfänger aktiv ist (RXEN=1), wird der korrespondierende Prozessorpin quasi zum Eingang (tristate) - unabhängig der Bits in DDR und PORT-Register, die sind ja abgekoppelt. Wenn der Empfänger abgeschaltet wird (RXEN=0), werden die Einstellungen (DDR und PORT) am Beinchen sofort wirksam. Das Beinchen wird mit der I/O-Hardware verbunden. Es müßte also sichergestellt werden, daß das Beinchen (dann) Eingang bleibt (weil der Prozessor ja sonst einen festen Pegel auf diese Leitung legt, und der 3122 vielleicht grad einen anderen.)
 
Warum das?
Wirft der TH3122 das gesendete auch gleich zurück? (Weil er es auf den Bus legt, und dort gleich empfängt?)

Ja, genau das ist das Problem an der Stelle. Er empfängt dann sein eigenes Echo.

Aber warum zwingend beides (also sowohl den RX-Interrupt, als auch den Empfänger als ganzes)?
Wenn Du der Interrupt-Hardware nur die Möglichkeit nimmst, beim RX einen IRQ auszulösen (also den RX complete Interrupt nicht enablest (RXCIE=0), tritt doch bei weiterhin aktiver RX kein IRQ ein. Du mußt dann aber das korrespondierende Interrupt-Flag löschen, bevor der der RXCIE wieder aktiviert wird.
Wenn Du lediglich den Empfänger abschaltest (also RXEN=0), sollte der RXCIE keine Rolle mehr spielen - da der RX-Pin gar nicht mit der UART-Logik verbunden ist, kann von dort auch kein komplettes UART-Paket empfangen worden sein, also auch das Flag nicht gesetzt, und kein Interrupt ausgeführt...
Warum zwingend beides?

Ich weiß nicht, ob es zwingend notwendig ist, ich habe es damals so gelöst, dass ich beides abgeschaltet habe. Hat einwandfrei funktioniert.

Grüße
Heinrich
 
irgendwie man mein bascom die rxen, ucsarb.rxen definitionen nich

wollt so in der art senden, allerdings , muss es platzsparend sein,. :/
Code:
Sub Sendbus(byref Startadres As Byte , Laenge As Byte , Zieladres As Byte , Data1 As Byte , Data2 As Byte)
   Local Xorcheck As Byte

   Xorcheck = 0 Xor 0
   Xorcheck = Xorcheck Xor Laenge
   Xorcheck = Xorcheck Xor Zieladres
   Xorcheck = Xorcheck Xor Data1
   Xorcheck = Xorcheck Xor Data2

   'portd = data register pullup
   'ddrd = data direction W 0=output / 1=input
   'pin d


   'Sender einschalten PIn als Output konfigueiren
   Portd.6 = 0
   Ddrd.6 = 0
   Sen_sa = 1

   'Prüfen ob bus frei ist
   Portd.6 = 0
   Ddrd.6 = 1


   If Sen_sa = 0 Then                                       ' transmission path enabled
      Print Hex(startadres) ; Hex(laenge) ; Hex(zieladres) ; Hex(data1) ; Hex(data2) ; Hex(xorcheck)
   End If

End Sub
 
wie kann ich in bascom den rx int deaktivieren, alles was ich probiert hab frisst es nich,.
sonst deaktiere ich alle interrupts,. das geht
 
Welcher Controller konkret?
Beim Mega48/88/168 aktiviert das Bit RXCIE0 ( RX Complete Interrupt Enable 0) im I/O-Register UCSR0B den Interrupt beim komplett empfangenem Paket (also dann, wenn das entsprechende Interrupt-Flag (RXC0 in UCSR0A) gesetzt wird). Da UCSR0B (bei diesem Controller) auf I/O-Adresse 0xC1 liegt, kann man das Bit nicht direkt setzen/löschen (SBI/CBI) - um die anderen Bits nicht zu manipulieren (vorsicht bei Flags), muß mittels ReadModifyWrite gearbeitet werden (in ASM hier sogar mit LDS/STS) - In Bascom sollte das aber "UCSR0B.RXC0=0" machen (wenn die Definitionsdatei stimmt).
Achtung:auch wenn der Interrupt so abgeschaltet wird, ist der Empfänger weiterhin aktiv - insbesondere werden weiterhin Bytes empfangen, und das Interrupt-Flag gesetzt. Es wird halt nur kein IRQ ausgelöst. Deswegen wird aber auch das Flag nicht gelöscht. Wenn der Interrupt also irgendwann freigegeben wird, wird deswegen sofort die ISR ausgeführt (das Flag ist ja noch aktiv, im Puffer befindet sich das zuletzt empfangene Byte). Um das zu umgehen müßte also direkt vor dem Reaktivieren des Interrupts das Flag gelöscht werden.

Auch RXEN0 befindet sich in UCSR0B (also auch R-M-W), aber wenn der Empfänger deaktiviert ist, laufen keine Nachrichten im Hintergrund in den Puffer - der ist ja gar nicht mit dem Pin verbunden.

Einfach mal im Datenblatt nachschlagen;)
 
Hmm... UCSRB ist Register 0x0A, Bit 7 = RXCIE, Bit 4 = RXEN.
"CBI UCSRB, RXEN" sollte(!) den Empfänger abschalten, "SBI UCSRB, RXCIE" den Interrupt aktivieren...

Hast Du mal einen Blick in die Definitionsdatei geworfen?

Ansonsten mal auf die harte Tour versuchen: "CBI 0x0A, 7"...
Mit welchem Fehler meckert Bascom denn?
 

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