Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Controler für I2C befehl



hans67
15.10.2019, 11:41
Hallo!

Ich suche nach einer Möglichkeit, die guten und preiswerten UHF-Modulatoren nutzen zu können, die für ihren Betrieb und Parametrierung eine I2C-Befehlssequenz brauchen.
Hier am PC und mit dem kleinen Programm "I2C Beispiel" hab ich das hingekriegt, aber nach Unterbrechung der Betriebsspannung is wieder Ritze.
Professionell gelöst wird das z.B. in dem Modulator von "König", da ist ein 8er DIP-Schalter und ein Proz. EM78P153, der macht das wunderbar.
Kann man den EM revers engineeren, also kopieren? Oder einen anderen CMOS-Proz ähnlich programmieren?
Elektronik, also eine Schaltung und Platine machen is für mich kein Problem, auch einfache Programmiergeräte (sind meist nur Pegelwandler) mach ich selbst.
Aber keine Ahnung von Programmiersprachen und Compilern und . . . für solche Käfer.

Könnt ihr mir da helfen?

Holomino
15.10.2019, 12:48
Meinst Du sowas? https://www.onetransistor.eu/2018/01/i2c-analog-tv-modulator-arduino-lcd.html

Gnom67
15.10.2019, 13:03
Wenn du wirklich nur eine feste Sequenz brauchst, die beim Start gesendet wird, könntest du mit relativ überschaubarem Aufwand mit der Arduino IDE einen ATTiny 48 oder 88 programmieren.
Meines Wissens können die I2C. Evtl. geht es auch mit kleineren µC (Attiny 13), dann mit I2C-Emulation (Bitbanging).

hans67
15.10.2019, 14:29
@ Holomino ja sowas meinte ich. Ich habe vorwiegend Modulatoren mit dem MC44353. Dein link ist sehr interessant, hilft mir aber nicht gänzlich, der Quellcode is ja noch kein funktionierender uC.
@ Gnom67 ja, welcher uC ist mir eigentlich egal, solange ich am besten über PC (oder zusätzlich mit DIP-Schaltern) dem Käfer den Befehl eingeben kann, der dann nach Anlegen der Spannung den Modulator-IC entsprechend in Funktion bringt.
der uC sollte deshalb in Sockel steckbar sein und möglichst wenig Strom verbrauchen (und nicht unbedingt ein Vermögen kosten, so wie der König-Modulator!)

Gnom67
15.10.2019, 18:34
Technisch kein besonders großes Problem. Wenn du allerdings ohne Vorkenntnisse da dran gehst, wird es dich einige Mühe kosten, das Ding zu bauen.
Wie viele verschiedene Befehlssequenzen brauchst du denn? Wenn es nur einige, feststehende Sequenzen sind, ist es vielleicht recht einfach.
Der Einfachheit halber könntest du einen Arduino Nano nehmen. Mit einem DIP-Schalterblock kannst du die entsprechende Anzahl Einstellvarianten ermöglichen.
Mit welcher Spannung arbeitet die Elektronik auf diesen Modulatoren? Der Arduino hat 5 Volt. Wenn die mit mehr oder weniger arbeiten, musst du das noch anpassen.
Wenn der µC gestartet wird, liest er die DIP-Schalter aus, und sendet per I2C die gewünschte Sequenz.
Das Programm musst du aber irgendwie selbst schreiben - in Anlehnung an den Link von Holomino.

hans67
15.10.2019, 20:43
Hallo und Danke,
Der uC muß nach Anlegen der Spannung, also Initialisierung, eine einzige Sequenz an den Mod-chip senden. die besteht aus paar Teilen (Blöcken) für Frequenz, Audio-Träger, Testsignal, Mod.-Tiefe u.dgl.
Mir ist es egal, ob ich alle Parameter, die in dieser Sequenz enthalten sein müssen, vorher am PC festlege (und ins EEPROM schreibe ??) oder Teile (Blöcke) davon per DIP nachträglich modifizieren kann.
Auch die Versorgung von üC und Modulator mit möglicherweise verschiedenen Spannungen und daraus resultierende Pegelanpassungen sind (ich bin Elektroniker) kein Thema.
Mein Problem ist allein das Erstellen des Programms. Ich bin keine 17 mehr und wollte mit eurer Hilfe vermeiden, noch mal Programmiersprache usw. wegen dieses Projekts lernen zu müssen.

Gnom67
15.10.2019, 21:23
Ein bisschen Getüftel wird es schon.
Der Arduino Nano lässt sich aber sehr einfach programmieren (Entwicklungsumgebung im PC installieren, Nano mit USB-Kabel anschließen - das ist eingetlich schon alles).
Für dein Programm dürften die wesentlichen Teile die Einbindung der Wire-Bibliothek

#include <Wire.h>

und das Senden der Sequenzen

Wire.beginTransmission(MOD_ADDRESS);
Wire.write(0x88 )
Wire.write(0x40 | mod_sound[soundIdx]);
Wire.write(fm);
Wire.write(fl);
Wire.endTransmission();

sein. Die Werte hier sind im Programm mit Hilfe der Tasten und des LCD eingestellt. Du kannst sie natürlich als feste Werte in den Klammern hinterlegen (so wie der Wert 0x88 in der zweiten Zeile).
MOD_ADRSESS solltest du duch so etwas wie 0xCA (Adresse des Moduls aus dem Beispiel) ersetzen können. Die Definition
#define MOD_ADDRESS (0xCA >> 1)

verschiebt den Wert um ein Bit nach rechts - was das soll, verstehe ich allerdings nicht.
In der Setup-Sektion ist offenbar noch ein

Wire.begin();

nötig.
Jetzt heißt es für dich wohl: Frisch ans Werk.

HaWe
15.10.2019, 22:07
verschiebt den Wert um ein Bit nach rechts - was das soll, verstehe ich allerdings nicht.

Arduino verwendet zur Adressierung per Wire die 7-bit i2c dev Adresse (0...127), 0xCA (dec 202) ist eine 8-bit-Adresse (least significant bit 1/0 für r/w).
Durch >> 1 wird es rausgekickt (Division durch 2) und man erhält aus der 8-bit die "reine" 7-bit i2c addr
202 >> 1 = 101 (hex 0x65)

hans67
15.10.2019, 22:46
o.k. ! etwas "Getüftel" is bei allen solchen Projekten normal.
Also paar dieser Teile:

https://www.banggood.com/de/ATmega328P-Nano-V3-Controller-Board-Compatible-Arduino-p-940937.html?gmcCountry=DE&currency=EUR&createTmp=1&utm_source=googleshopping&utm_medium=cpc_bgs&utm_content=frank&utm_campaign=pla-de-dp-xt-0816-pc&ad_id=378178099625&gclid=Cj0KCQjw3JXtBRC8ARIsAEBHg4mpotx55yRb6G2fnNMT m-ldTQ89ubdQR04R-_0pc6ZNwqOiHaezvesaAiZXEALw_wcB&cur_warehouse=CN

kaufen, "arduino-1.8.10-windows.exe" installieren, usb-Verbindung und los gehts: " Wire.beginTransmission(0xCA); " usw. . . . ??

Mein Modulator-chip MC44353 hat übrigens lt. Datenblatt auch die Adresse CA(hex), der wird doch nicht etwa kompatibel sein mit dem im Link von Holomino ??

hans67
17.10.2019, 03:48
Hi,
also ganz ohne eure externe Hilfe wirds doch nix. Mein Modulator chip mc44353 ist zwar sehr ähnlich dem MBS74T1AEF im Link von Holomino, alle bytes haben die selbe Bezeichnung und Funktion, aber es gibt doch paar Unterschiede.
Die keyPad- und LCD- funktionen wie bei "Cornelius´ projekt brauch ich nicht, die umständliche umrechnung der PAL-Kanal-nummern in die eigentliche frequenz auch nich, mit meinem chip reicht es, die gewünschte Video-Frequenz als Vielfaches von 0,25 MHz in die beiden bytes FL und FM zu schreiben, die begrenzung der Kanäle " if ((channel < 21) || (channel > 69)) channel = 21;
innerhalb 21 bis 69 is genau so überflüssig.
Hab jetzt keine Ahnung wie ich aus dem Quellcode aus dem Link einen für mich machen kann??

Gnom67
17.10.2019, 15:23
Na, jetzt musst du dich schon mal selbst dranmachen...
Aus deinem Datenblatt kannst du doch die gewünschten Bits leicht entnehmen. Da ist ebenso eine Tabelle wie im Link von Holomino.
Füllst du die vier Bytes mit deinen gewünschten Werten aus, erhältst du die Binärwerte, die du senden musst. kannst du in hex umrechnen und als 0x?? angeben oder als binär müsste auch gehen (B????????)
Beim Code kannst du den ganzen Schnickschnack weglassen. Du brauchst nur die Importe, die Rahmenstruktur, die Initialisierung des I2C und die Sendebefehle für deine Bytes. Nach dem Einschalten wird er einen Moment warten müssen, bis der Modulator empfangsbereit ist (wie lange, musst du ausprobieren). Dann die Adresse senden. Danach deine vier Bytes. Dann kommt noch das beenden der Sendesequenz. Dann könntest du den µC in den Tiefschlaf schicken, denn er hat seinen Dienst ja getan. Beim Reset/Einschalten sendet er die Sequenz und schläft dann...
Also, so schwer erscheint mir das nicht. Insgesamt müsste das ungefähr so aussehen.

#include <Wire.h>
#define MOD_ADDRESS (0xCA >> 1)

void setup() {


Wire.begin();

}

void loop() {


delay(100); // 100 ms warten

Wire.beginTransmission(MOD_ADDRESS);
Wire.write(0x??);
Wire.write(0x??);
Wire.write(0x??);
Wire.write(0x??);
Wire.endTransmission();

set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();

}

hans67
17.10.2019, 18:37
O.K. ganz vielen Dank @ Gnom67!

jetzt bin ich guter Hoffnung, daß ich das hinbekomme. Genial wäre es, die Frequenz gleich in dezimal in kHz eintragen zu können, und der Controller rechnet das in binär um und setzt die bits gleich in das entsprechende Byte. Alle anderen Bytes können auf festen Werten bleiben, die muss ich nur einmal festlegen. Dafür müsste man wohl innerhalb der letzten beiden Bytes (FL und FM) die Bits als Variablen einsetzen, oder?? Die gewünschte eingegebene Frequenz durch 250 teilen, in eine Binärzahl wandeln und deren Stellen in die Variablen schreiben? Ich stell mir das so leicht vor, in der Praxis is das meist viel schwieriger.
zudem muß ich mich erst mal mit der IDE auseinadersetzen, davor graust es mir. Die will schon beim Start nen "Code" ?? Hab gar keinen . . . ? dann muß das Machwerk bestimmt noch irgendwie kompiliert werden oder sowas, usw, usw . . .

HaWe
17.10.2019, 18:55
dem C-Programm ist es völlig egal, ob du Zahlen in hex oder in bin oder in dec eingibst, es versteht alle Schreibweisen sofort (hex am "x", bin am "B", ansonsten ist es automatisch dec).
Für alle anderen Umrechnungen (durch 250 teilen,...,...) kannst du dir auch eigene kleine Umrechnungsfunktionen schreiben. 8)

Alles klingt aber so, als solltest du mal als erstes einen Grundkurs mit einem Arduino-Tutorial machen!

hans67
17.10.2019, 19:19
@ HaWe

Ja du hast recht, ich hab keine Ahnung vom programmieren, ich habe es auch weiter oben schon geschrieben, daß ich keine größeren Lehrgänge in dieser Richtung mehr machen wollte. Ich dachte stattdessen dieses kleine Projekt mit eurer Hilfe hinzubekommen.

HaWe
17.10.2019, 19:21
ohne programmieren lernen zu wollen, wirst du kaum Erfolg haben, aber Arduino macht es einem wirklich einfach, denn gerade für Nicht-Fachleute wurde es entwickelt.