Hallo,
wie kann ich feststellen wie hoch der IIC-Takt ist?
Und wie kann ich diesen ändern?
Welche min.- bzw. max- Werte sind möglich?
Herzlichen Dank!
Hallo,
wie kann ich feststellen wie hoch der IIC-Takt ist?
Und wie kann ich diesen ändern?
Welche min.- bzw. max- Werte sind möglich?
Herzlichen Dank!
IIC Bus-Frequnz? Schau mal ob du hier fündig wirst!
steht im Datenblatt
Ich hab mir min. 50 Seiten angesehen.
Da steht nix von IIC-Tack von bis oder so.
Geschweige den wie ich den ändere. :s
Ich freue mich auf eine Antwort die mir weiter hilft.
Herzlichen Dank
Ich hab mir min. 50 Seiten angesehen.
war wohl noch nicht ausreichend
wie kann ich feststellen wie hoch der IIC-Takt ist?
mit einem Oszilloskop gehts auch
Und wie kann ich diesen ändern?
durch umprogrammieren
Welche min.- bzw. max- Werte sind möglich?
steht immer noch im Datenblatt!
mal im Ernst, deine Art zu fragen ist eher suboptimal, vielleicht versuchst du mal was zu ändern?
Für zielgerichtete Antworten bedarf es schon zielgerichtete Fragen.
Wie ist das Wetter wird dir weltweit ne Menge verschiedenster Antworten bringen!!
Hallo 182,
Ich hab mir min. 50 Seiten angesehen.
Da steht nix von IIC-Tack von bis oder so.
Geschweige den wie ich den ändere. :sIch freue mich auf eine Antwort die mir weiter hilft.
Herzlichen Dank
Zitat
The I2C clock bps (bits per second) can be set between 125Mbps and 3826 (250Mhz core clock with even divider between 2 and 65536). BCM2835 ARM Peripherals pages 28-36.
So?
Beste Grüße
Andreas
So?
Beste Grüße
Andreas
Die Frage am PI war nicht gestellt und meine I2C Chips verbitten sich 3826Mbps
Meine wichtigste Frage ist das ändern der Frequenz
sorry aber so gefragt konnte ich nicht anders:
Zitat
Im dichten Nebel verliert ein Ballonfahrer die Orientierung. Er lässt seinen Ballon langsam ab, bis er am Boden einen Menschen sieht, und ruft herab: "Wo bin ich hier?" Daraufhin grübelt der Passant eine Weile und antwortet: "Im Ballon!"Woran erkennt man, dass der Mann ein Mathematiker ist?
Er überlegt lange.
Seine Antwort ist wahr.
Seine Aussage ist zu nichts zu gebrauchen.
Moin 182,
wie möchtest du den den Bus ansprechen? Was selbst programmieren??
Oder besser was soll erreicht werden?
Gruss Bernd
Hi,
Meine wichtigste Frage ist das ändern der Frequenz
solange Du nicht damit rausrückst womit Du die Frquenz umstellen willst, ist es schwierig Dir zu antworten. Andreas hatte den Hinweis ja schon gepostet, wie und in welchem Bereich die Frequenz umgestellt werden kann.
Womit willst Du da rangehen? Akkuschrauber, Lötkolben, bash script, Pfuiton script, Kettensäge ... :s
//da war Bernd mal wieder schneller ...
cu,
-ds-
182: Du merkst vielleicht, daß hier um mehr Informationen gebeten wird, um Dir helfen zu können. Es ist für die Helferlein immer etwas frustrierend Freizeit zu investieren, wenn der Fragende noch nicht mal bereit ist, das selbst zu tun. Pauschale Aussagen wie "habe 50 Seiten gelesen", ohne überhaupt kund zu tun, was man gelesen hat, wirkt eher weniger glaubwürdig. Man hilft einfach Leuten viel lieber, wenn diese zugeben keine Ahnung zu haben, aber nicht nur durch Worte bekunden, etwas daran ändern zu wollen, sondern bereit sind ebenfalls Zeit für Ihre Probleme zu investieren.
Nun kurz zu Deinem Problem.
In Linux (und auch anderen OSen) übernehmen Treiber die Vermittlung zwischen Applikation und Hardware. Also fragt man sich, welcher Treiber das wohl sein könnten.
lsmod
verrät so einiges.
mit
lsmod | grep i2c*
purzeln zwei raus i2c_bcm2708 und i2c_dev
Mittels modinfo erfährt man etwas über die Parameter.
modinfo i2c_bcm2708
spuckt u.a. aus: parm: baudrate:The I2C baudrate (uint)
Na, das ist doch schon mal etwas. Also könnte:
[font="Courier New, monospace"]sudo modprobe -r i2c_bcm2708[/font]
[font="Courier New, monospace"]sudo modprobe i2c_bcm2708 baudrate=32000[/font]
Dein Problem möglicherweise lösen.
Sollte es im Devicetree versteckt sein, so könnte:
[font="Courier New, monospace"]dtparam=i2c1_baudrate=50000[/font]
ggf. Deine Lösung sein.
Einen Blick Wert ist auch
[font="Courier New, monospace"]/sys/module/i2c_bcm2708/parameters[/font]
Immer natürlich vorausgesetzt, wir reden hier von einem Raspberry Pi mit einem "Linux" drauf. Ansonsten war meine letzte halbe Stunde eher für die Katz =(
Danke schnasseldag ,
Aber euch ist schon klar das ganz oben
"Deutsches Raspberry Pi Forum | Die RPi Community Hardware Raspberry Pi 2, Modell B und B+ IIC Bus-Frequnz "
steht.
Und zum Beweis, das ich hier nicht nur auf Antworten warte.
# -*- coding: utf-8 -*-
import time
from smbus2 import SMBusWrapper
address = 0x04
vStdOld = 24
#with SMBusWrapper(1) as bus:
# try:
# bus.write_byte_data(address, 0, 0xF3) #EEPROM im Arduino löschen
# except:
# print("Schreibfehler ")
while True:
with SMBusWrapper(1) as bus:
vTimeDate = time.localtime()
y=vTimeDate[0]-2000
data = [y, vTimeDate[1], vTimeDate[2], vTimeDate[3], vTimeDate[4], vTimeDate[5]]
vXOR = 0
for x in data:
vXOR = vXOR^x
data = [y, vTimeDate[1], vTimeDate[2], vTimeDate[3], vTimeDate[4], vTimeDate[5], vXOR]
try:
bus.write_i2c_block_data(address, 0xF2, data)
print ("Nachricht an Arduino ", data)
except IOError:
print("Schreibfehler ")
time.sleep(1)
try:
block = bus.read_i2c_block_data(address, 0xF1, 8)
#LByte Temp. / HByten Temp. / LByte Pegel / HByte Pegel / Störungsnummer /3 Byte reserve
vWaTemp = (block[1]*256)+block[0]*0.06255
vPegel = block[3]
vPegel = vPegel<<8
vPegel = vPegel+block[2]
y=vTimeDate[0]-2000
vDataStr = str(block[0])+";"+str(block[1])+";"+str(block[2])+";"+str(block[3])+";"+str(block[4])+";"+str(block[5])+";"\
+str(block[6])+";"+str(block[7])+";"+str(y)+";"+str(vTimeDate[1])+";"+str(vTimeDate[2])+";"+str(vTimeDate[3])
fx=open("/mnt/RAMDisk/GWWerte.wet", "w")
fx.write(vDataStr) # stellt die Werte der Flutüberwachung
fx.close() # für die Webseite und die Datenbank zur Verfügung
print("Nachricht von Arduino", block, "Wassertemp. ", round(vWaTemp,5), "Pegel ", vPegel)
except:
print("Lesefehler")
time.sleep(1)
if vTimeDate[3]!=vStdOld and vTimeDate[4]==1:
vStdOld=vTimeDate[3]
with SMBusWrapper(1) as bus:
vCND = 0
while True:
try:
vEEProm = [0]
X = 0xA0
while X < 0xC0:
block1 = bus.read_i2c_block_data(address, X, 32)
X += 1
vEEProm.extend(block1)
break
except:
time.sleep(0.3)
vCND+=1
print("Lesefehler EEProm")
if vCND>10:
break
X=vEEProm.pop(0)
print("EEProm in RAMDisk", vEEProm)
vEEPromStr =""
for y in range(0,1023):
vEEPromStr+=str(vEEProm[y])+";"
vEEPromStr=vEEPromStr[:-1]
fx=open("/mnt/RAMDisk/GWListe.wet", "w")
fx.write(vEEPromStr) # stellt die Werte der letzten 1024 Std der Flutüberwachung
fx.close() # für die Webseite und die Datenbank zur Verfügung
time.sleep(10)
Alles anzeigen
#include <OneWire.h> // OneWire-Bibliothek einbinden
#include <Wire.h> // IIC-Bibliothek einbinden
#include <pitches.h>
#include <EEPROM.h>
#define SLAVE_ADDRESS 0x04 //i2c Adresse
#define schalterSolobetrieb 13 //Schalter: Betrieb mit oder ohne Zeitsynchronisation
#define piezo 9 //Piezo-Signalgeber
#define relaisPumpe1 5 //schaltet die Pumpe 1
#define relaisPumpe2 6 //schaltet die Pumpe 2
#define relaisBewaess 7 //schaltet die Bewässerung
#define relaisAlarm 8 //schaltet weitere Alarmgeber
#define schlterEndNull A0 //Endschalter des Pegelschalters (Nullstellung)
#define sensorPegel A1 //prüft auf kontakt mit Wasser
#define dirpin 10 //Schrittmotor
#define steppin 12 //Schrittmotor
#define sleeppin 4 //Schrittmotor
OneWire ds(11); // OneWire Referenz setzen Pin 11
float vWasserPegel; //Grundwasser über Normal Null in m
int vWasserTemp; //Grundwassertemperatur in 1/10°C
byte vZeit[6] = {0, 0, 0, 0, 0, 0}; //Zeit-Array Jahr, Monat, Tag, Stunde, Minute, Sekunde
int vIIC_Data; //empfangene IIC-Daten
uint8_t vTempByte0, vTempByte1; //Byte 0 und 1 vom Scratchpad des DE18B20 für die i2c-Übertragung
uint8_t vPegelHByte, vPegelLByte; //WasserPegel für die i2c-Übertragung
uint8_t vData[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //i2c Array
byte vStundeAlt; //speichert die aktuelle Stunde um einen Stundenwechsel zu erkennen
byte vFehler; /*Fehlerbyte: Bit 0 = Temperaturfühler; Bit 1 = Pegelsensor absenken; Bit 2 = Pegelsensor hoch ziehen;
Bit 3 = Sensor-Endschalter*/
boolean vEEPromInit = false; //ist True, wenn das EEPROM gelöscht werden soll
int vEEPromRead = 1024; //gibt den zu lesenden Teil des EEProms an, bei 1024 wird nichts gelesen
byte vEEPart[32];
void setup(){
int vCndDl = 0; //Durchlaufzähler
pinMode(schlterEndNull,INPUT_PULLUP);
pinMode(schalterSolobetrieb,INPUT_PULLUP);
pinMode(relaisPumpe1,OUTPUT);
pinMode(relaisPumpe2,OUTPUT);
pinMode(relaisBewaess,OUTPUT);
pinMode(relaisAlarm,OUTPUT);
pinMode(dirpin, OUTPUT); //Schrittmotor
pinMode(steppin, OUTPUT); //Schrittmotor
pinMode(sleeppin, OUTPUT); //Schrittmotor
Serial.begin(9600);
TCNT1 = 0; //Timer Counter 1
TCCR1A = 0; //Timer Counter Controll Register A
TCCR1B = 0; //Timer Counter Controll Register B
OCR1A = 15624; //Output Compare Register A
// Setze CS10 und CS12 - Clock Select Bit 10/12 (Prescaler 1024)
TCCR1B |= (1 << CS12) | (1 << CS10);
//CTC-Mode ein
TCCR1B |= (1 << WGM12); // CTC-Mode (Clear Timer and Compare)
//Timer/Counter Interrupt Mask Register
TIMSK1 |= (1 << OCIE1A); //Output Compare A Match Interrupt Enable
sei(); //Setze globales Interruptflag
do{
TempMessen(false); //Temperatur Messen
PegelMessen(); //Wasserpegel messen
vWasserPegel=388; //test
if((vWasserTemp<250) && (vWasserTemp>0) && (vWasserPegel>380) && (vWasserPegel<390) ){ //sind Temperatur und Wasserpegel im realistischen Bereich
goto labBeep;
}
else{ //warten bis Werte realistische sind
Beep(200);
if(digitalRead(schalterSolobetrieb)==HIGH) { //ist der Solobetrieb an
goto labBeep;
}
}
delay(300);
TempMessen(false); //Wasserstand und Temperatur Messen
vCndDl++;
} while(vCndDl<100);
digitalWrite(relaisAlarm,HIGH);
delay(60000);
goto labAlarmAUS;
labBeep:;
Beep(1000);
labAlarmAUS:;
digitalWrite(relaisAlarm,LOW);
Wire.begin(SLAVE_ADDRESS); //Arduino als IIC-Slave
Wire.onReceive(receiveData); //Empfangsroutiene definieren
Wire.onRequest(sendData); //Senderoutiene definieren
}
/////////////////////////////////////////////////////////////////
void loop() {
if(vEEPromInit==true){
FormatEEPROM(); //EEPROM wird gelöscht
vEEPromInit=false; //Flage löschen
}
if(vZeit[0]>0){ //ist die Zeit synchron
TempMessen(true); //Temperatur Messen
if(vStundeAlt!=vZeit[3]){ //beim Stundenwechsel vZeit[3]
vStundeAlt=vZeit[3]; //aktuelle Stunde speichern
DatumAktuell(); //Datum aktualisieren
PegelMessen(); //Wasserpegel messen
DataInEEPROM(vZeit[1], vZeit[2], vZeit[3], vData[2], vData[3], vData[0], vData[1], vData[4]);
}
}
int vTempVorwarn = DS18B20(0x28, 0xFF, 0x8A, 0x84, 0x15, 0x14, 0x0, 0x41, false);
int vTempWarn1 = DS18B20(0x28, 0xFF, 0x91, 0x42, 0x12, 0x14, 0x0, 0x7, false);
int vTempWarn2 = DS18B20(0x28, 0xFF, 0xFF, 0x52, 0x2C, 0x4, 0x0, 0x4A, false);
/*Serial.print("vTempVorwarn "); Serial.println(vTempVorwarn);
Serial.print("vTempWarn1 "); Serial.println(vTempWarn1);
Serial.print("vTempWarn2 "); Serial.println(vTempWarn2);*/
if(vTempVorwarn<230){ //ist der unterste Pegelsensor unter 23°C
digitalWrite(relaisPumpe1,true); //Pumpe 1 ein
}
if(vTempVorwarn>240){ //wenn wieder über 24°C dann
digitalWrite(relaisPumpe1,false); //Pumpe 1 aus
}
if(vTempWarn1<230){
digitalWrite(relaisPumpe2,true);
}
if(vTempWarn1>240){
digitalWrite(relaisPumpe2,false);
}
if(vTempWarn2<230){
digitalWrite(relaisBewaess,true);
digitalWrite(relaisAlarm,true);
}
if(vTempWarn2>240){
digitalWrite(relaisBewaess,false);
digitalWrite(relaisAlarm,false);
}
vData[3]=StatusReg(digitalRead(relaisPumpe1),digitalRead(relaisPumpe2),digitalRead(relaisBewaess)); //Status der Pumpen auf vData[3] schreiben
delay(2000);
}
///////////////////////////////////////////////////////////////////
int8_t StatusReg(boolean vP1, boolean vP2, boolean vBW){
uint8_t vStatusTemp1=0;
uint8_t vStatusTemp2=0; //Setzt die Statubits für
vStatusTemp1=bitWrite(vStatusTemp2,0,vP1); //Pumpe1 = Bit 0
vStatusTemp2=vStatusTemp1; //Pumpe2 = Bit 1
vStatusTemp1=bitWrite(vStatusTemp2,1,vP2); //Bewässerung = Bit 2
vStatusTemp2=vStatusTemp1;
vStatusTemp1=bitWrite(vStatusTemp2,2,vBW);
return vStatusTemp1;
}
int DS18B20(byte adr1, byte adr2, byte adr3, byte adr4, byte adr5, byte adr6, byte adr7, byte adr8, boolean Tempbyte){
byte data[9];
ds.reset(); //startet alle Fühler
ds.write(0xCC); //ROM überspringen Kommando
ds.write(0x44); //starte Temperaturmessung aller Fühler
delay(700); //Wandlungszeit
ds.reset(); //startet alle Fühler
ds.write(0x55); //Fühler bereitmachen zum Empfang der Adressbytes (Match ROM)
ds.write(adr1); //Adressbyte 1
ds.write(adr2); //adressbyte 2
ds.write(adr3); //usw
ds.write(adr4);
ds.write(adr5);
ds.write(adr6);
ds.write(adr7);
ds.write(adr8);
ds.write(0xBE); //Befehl zum Scratchpad lesen (nur der angesprochene Fühler)
for (byte i=0;i<9;i++){ //komplettes Scratchpad des angesprochenen
data[i] = ds.read(); //Fühlers lesen
}
if (OneWire::crc8( data, 8) == data[8]){ //crc-Prüfung
if(Tempbyte==true){
vTempByte0 = data[0]; //Temperaturbytes für die i2c-Übertragung
vTempByte1 = data[1];
}
return (data[1] * 256 + data[0]) * 0.6255; //wenn alles OK, die Temperaur berechnen und in 1/10°C zurückgeben
}
else{
return 999; //wenn nicht OK, Fehlercode zurück
}
}
void Beep(int ms){
pinMode(piezo,OUTPUT);
delay(10);
tone(piezo,880,ms);
delay(ms);
pinMode(piezo,INPUT_PULLUP);
}
void receiveData(int howMany) {
int vCnd = 0;
uint8_t c = 0;
uint8_t vTem[7] = {0,0,0,0,0,0,0}; //Empfangspuffer für Befehl F2
boolean vF2 = false; //Flage für (Slave auf Datenempfang) löschen
while (Wire.available()) { //Schleife bis Empfangspuffer leer ist
c = Wire.read(); //Wert aus Empfangspuffer lesen
if(vF2 == true){ //wurde der Befehl F2 (Slave auf Datenempfang) empfangen
uint8_t vXOR=0;
switch(vCnd){ //verteilt die empfangenen Werte
case 0:
vTem[0]=c; //Jahr
break;
case 1:
vTem[1]=c; //Monat
break;
case 2:
vTem[2]=c; //Tag
break;
case 3:
vTem[3]=c; //Stunde
break;
case 4:
vTem[4]=c; //Minute
break;
case 5:
vTem[5]=c; //Sekunde
break;
case 6:
vTem[6]=c; //Prüfziffer
for(byte x=0;x<=5;x++){ //Prüfzahl berechnen
vXOR = vXOR^vTem[x];
}
if(vXOR==vTem[6]){ //Prüfzahlen vergleichen
for(byte x=0;x<=5;x++){ //wenn OK - übertragen
vZeit[x]=vTem[x];
}
}
else{
Serial.println("Prüfzahlfehler");
}
vF2 = false;
break;
}
vCnd++; //Empfangszähler
}
if(c == 0xF2){ //prüft auf Befehle F2
vF2 = true; //Befehlsflage setzen
}
}
switch(c) {
case 0xF1: //prüft auf Befehle F1 = Befehl für "Slave sendet Daten"
vData[0] = vTempByte0; //Daten zum senden vorbetreiten
vData[1] = vTempByte1;
vData[2] = vPegelLByte;
vData[3] = vPegelHByte;
vData[4] = vFehler;
break;
case 0xF3: //EEPROM löschen
vEEPromInit=true;
Serial.println("Befehl F3");
break;
case 0xA0 ... 0xBF:
vEEPromRead = (c-0xA0)*32;
break;
default:
break;
}
}
void sendData(){
if(vEEPromRead != 1024){
for(int i = 0;i <= 31;i++){
vEEPart[i] = EEPROM.read(vEEPromRead + i);
}
Wire.write(vEEPart,32);
vEEPromRead=1024;
}
else{
Wire.write(vData,8);
}
}
void TempMessen(boolean vChack){
boolean vBad;
int vCnd = 0;
do{
int vTempTemp = DS18B20(0x28, 0xFF, 0xDD, 0x64, 0x15, 0x14, 0x0, 0xCC, true); //Grundwassertemperatur messen
if(vChack == true){
if((vTempTemp<250) && (vTempTemp>0)){
vWasserTemp = vTempTemp; //Temperatur übergeben
vBad = false;
}
else{
vBad = true;
bitSet(vFehler,0);
}
}
else{
vWasserTemp = vTempTemp; //Temperatur übergeben
break;
}
vCnd++;
if(vCnd > 20){
break;
}
else{
bitClear(vFehler,0);
}
}while(vBad);
/*Serial.print("Feler ");
Serial.print(vFehler);
Serial.print(" °C ");
Serial.println(vWasserTemp);*/
}
void PegelMessen(){
long vSchrittCND=0;
long vX = 0;
int vPegelmm = 0;
Serial.println("Pegel messen");
//Messeinheit in Nullstellung
if(digitalRead(schlterEndNull)==HIGH){
digitalWrite(sleeppin,HIGH); //Motor aktivieren
digitalWrite(dirpin,HIGH); //Motor dreht aufwärts
Serial.println("vor der Messung in Nullstellung");
do{
digitalWrite(steppin,LOW); //der LOW/HIGH- Wechsel dreht den
delayMicroseconds(400); //Pause
digitalWrite(steppin,HIGH); //Schrittmotor eine Schritt weiter
delayMicroseconds(1000); //Pause
vSchrittCND++; //Mikroschrit zählen
if(vSchrittCND>20000){ //wurden die max zulässigen Umdrehungen überschritten
bitSet(vFehler,2); //Fehlermeldung
Beep(500);
delay(200);
Beep(500);
goto labMotorEnde; //Schleife verlassen
} //die Nullstellung befindet sich 389105 mm ü NN
}while(digitalRead(schlterEndNull)==HIGH); //warten bis der Pegelsensor in der Nullstellung ist
bitClear(vFehler,2);
}
//beginn der Messung
vSchrittCND=0; //Schrittzähler löschen
digitalWrite(sleeppin,HIGH); //Motor aktivieren
digitalWrite(dirpin,LOW); //Motor dreht abwärts
delay(200);
Serial.println("Messung");
do{
digitalWrite(steppin,LOW); //der LOW/HIGH- Wechsel dreht den
delayMicroseconds(400); //Pause
digitalWrite(steppin,HIGH); //Schrittmotor eine Schritt weiter
delayMicroseconds(1000); //Pause
vSchrittCND++; //Mikroschrit zählen
if(vSchrittCND>20000){ //wurden die max zulässigen Umdrehungen überschritten
bitSet(vFehler,1); //Fehlermeldung
Beep(500);
delay(200);
Beep(500);
goto labZurueck; //Schleife verlassen
}
if(vSchrittCND>500&&digitalRead(schlterEndNull)==LOW){ //ist der Endschalter nach 500 Schritten immer noch in Endstellung
bitSet(vFehler,3); //Fehler anzeigen
goto labMotorEnde;
}
else{ //kein Fehler
bitClear(vFehler,3);
}
}while(analogRead(sensorPegel)>512); //Schleife verlassen bei kontakt mit Wasser
bitClear(vFehler,1);
vPegelmm = vSchrittCND*0.09001; //0,09001 mm =^ 1 Schritt //die Nullstellung befindet sich 389105 mm ü NN
vPegelLByte=lowByte(vPegelmm);
vPegelHByte=highByte(vPegelmm);
Serial.print("vSchrittCND ");
Serial.println(vSchrittCND);
Serial.print(" Pegel ");
Serial.print(vPegelHByte);
Serial.print(" - ");
Serial.println(vPegelLByte);
Serial.print("mm ü NN ");
Serial.println(389105-vPegelmm);
Beep(10);
//Messeinheit wieder in Nullstellung
labZurueck:
vSchrittCND=0; //Schrittzähler löschen
digitalWrite(sleeppin,HIGH); //Motor aktivieren
digitalWrite(dirpin,HIGH); //Motor dreht aufwärts
delay(200);
Serial.println("nach der Messung in Nullstellung");
do{
digitalWrite(steppin,LOW); //der LOW/HIGH- Wechsel dreht den
delayMicroseconds(400); //Pause
digitalWrite(steppin,HIGH); //Schrittmotor eine Schritt weiter
delayMicroseconds(1000); //Pause
vSchrittCND++; //Mikroschrit zählen
if(vSchrittCND>20000){ //wurden die max zulässigen Umdrehungen überschritten
bitSet(vFehler,2); //Fehlermeldung
Beep(500);
delay(200);
Beep(500);
goto labMotorEnde; //Schleife verlassen
} //die Nullstellung befindet sich 389105 mm ü NN
}while(digitalRead(schlterEndNull)==HIGH); //warten bis der Pegelsensor in der Nullstellung ist
bitClear(vFehler,2);
labMotorEnde:;
digitalWrite(sleeppin,LOW); //Motor deaktivieren
}
void DatumAktuell(){
boolean vSJ=false;
for(byte i=16;i<99;i=i+4){ //die Schaltjahre durchzählen
if(i==vZeit[0]){ //ist das aktuelle Jahr ein Schaltjahr
vSJ=true; //Flage setzen
}
}
switch(vZeit[1]){ //Monat wählen
case (1, 3, 5, 7, 8, 10, 12): //Monate mit 31 Tagen
if(vZeit[2]>31){
vZeit[2]=1;
vZeit[1]++;
}
break;
case 2: //Februar
if(vSJ=true){
if(vZeit[2]>29){
vZeit[2]=1;
vZeit[1]++;
}
}
else{
if(vZeit[2]>28){
vZeit[2]=1;
vZeit[1]++;
}
}
break;
case (4, 6, 9, 11): //Monate mit 30 Tagen
if(vZeit[2]>30){
vZeit[2]=1;
vZeit[1]++;
}
break;
}
if(vZeit[1]>12){
vZeit[1]=1;
vZeit[0]++;
}
}
void DataInEEPROM(byte vMonat, byte vTag, byte vStunde, byte vPegelLByte, byte vPegelHByte, byte vTemp0, byte vTemp1, byte vPegelSchalter){
int vAeltester=0;
unsigned long vDatumAeltestes=BytesInULong(EEPROM.read(0), EEPROM.read(1), EEPROM.read(2));
unsigned long vDatumVergleich=0;
for(int i=0;i<=1023;i=i+8){ //prüfen ob die Stunde schon gespeichert ist
if(EEPROM.read(i)==vMonat&&EEPROM.read(i+1)==vTag&&EEPROM.read(i+2)==vStunde){
Serial.println("Stunde ist schon gespeichert!");
return;
}
}
for(int i=0;i<=1023;i=i+8){
if(EEPROM.read(i)==0){ //ist das EEProm-Speicherstelle noch unbeschrieben
EEPROM.write(i,vMonat);
EEPROM.write(i+1,vTag);
EEPROM.write(i+2,vStunde);
EEPROM.write(i+3,vPegelLByte);
EEPROM.write(i+4,vPegelHByte);
EEPROM.write(i+5,vTemp0);
EEPROM.write(i+6,vTemp1);
EEPROM.write(i+7,vPegelSchalter);
Serial.print("schreibe EEPROM 1x ");
Serial.print(i);
Serial.print(" ");
Serial.print(vMonat);
Serial.print(" ");
Serial.print(vTag);
Serial.print(" ");
Serial.print(vStunde);
Serial.print(" ");
Serial.print(vPegelLByte);
Serial.print(" ");
Serial.print(vPegelHByte);
Serial.print(" ");
Serial.print(vTemp0);
Serial.print(" ");
Serial.print(vTemp1);
Serial.print(" ");
Serial.println(vPegelSchalter);
return; //zum Ende
}
}
for(int i=8;i<=1023;i=i+8){ //suche nach dem ältesten Eintrag
vDatumVergleich=BytesInULong(EEPROM.read(i), EEPROM.read(i+1), EEPROM.read(i+2));
if(vDatumAeltestes>vDatumVergleich){
vDatumAeltestes=vDatumVergleich;
vAeltester=i;
}
}
Serial.print("vAeltester=");
Serial.print(vAeltester);
Serial.print(" vDatumVergleich=");
Serial.print(vDatumVergleich);
Serial.print(" vDatumAeltestes=");
Serial.println(vDatumAeltestes);
Serial.println(vDatumAeltestes);
EEPROM.write(vAeltester,vMonat);
EEPROM.write(vAeltester+1,vTag);
EEPROM.write(vAeltester+2,vStunde);
EEPROM.write(vAeltester+3,vPegelLByte);
EEPROM.write(vAeltester+4,vPegelHByte);
EEPROM.write(vAeltester+5,vTemp0);
EEPROM.write(vAeltester+6,vTemp1);
EEPROM.write(vAeltester+7,vPegelSchalter);
Serial.print("schreibe EEPROM Xx");
Serial.print(vAeltester);
Serial.print(" ");
Serial.print(vMonat);
Serial.print(" ");
Serial.print(vTag);
Serial.print(" ");
Serial.print(vStunde);
Serial.print(" ");
Serial.print(vPegelLByte);
Serial.print(" ");
Serial.print(vPegelHByte);
Serial.print(" ");
Serial.print(vTemp0);
Serial.print(" ");
Serial.print(vTemp1);
Serial.print(" ");
Serial.println(vPegelSchalter);
}
unsigned long BytesInULong(byte Byte2, byte Byte1, byte Byte0){
unsigned long vULong=0;
unsigned long vULongTemp=0;
vULongTemp=Byte2;
vULong=vULongTemp*10000+vULong;
vULongTemp=Byte1;
vULong=vULongTemp*100+vULong;
vULong+=Byte0;
return vULong;
}
void FormatEEPROM(){
for(int i=0;i<=1023;i++){ //alle Zellen mit Null beschreiben
EEPROM.write(i,0);
Serial.println(EEPROM.read(i));
}
Serial.println("EEPROM gelöscht!!!");
}
ISR(TIMER1_COMPA_vect){ //Interrupt-Serviceroutine
vZeit[5]++;
if(vZeit[5]>59){
vZeit[4]++;
vZeit[5]=0;
}
if(vZeit[4]>59){
vZeit[3]++;
vZeit[4]=0;
}
if(vZeit[3]>23){
vZeit[2]++;
vZeit[3]=0;
}
//das Datum wird in loop berechnet
}
Alles anzeigen
Ich möchte in meinen Projekt nur den IIC-Takt verringern, weil nach dem Einbau am Bestimmungsort
öfter Fehler bei der Übertragung vorkommen.
Automatisch zusammengefügt:
Hallo schnasseldag,
wo steht jetzt da der IIC-Takt?
Ich auch kontrollieren, was ich eingestellt habe.
pi@webpi:~ $ modinfo i2c_bcm2835
filename: /lib/modules/4.9.24-v7+/kernel/drivers/i2c/busses/i2c-bcm2835.ko
alias: platform:i2c-bcm2835
license: GPL v2
description: BCM2835 I2C bus adapter
author: Stephen Warren <swarren@wwwdotorg.org>
srcversion: 9023C1192DF5A4CD8E2F440
alias: of:N*T*Cbrcm,bcm2835-i2cC*
alias: of:N*T*Cbrcm,bcm2835-i2c
depends:
intree: Y
vermagic: 4.9.24-v7+ SMP mod_unload modversions ARMv7 p2v8
parm: debug:1=err, 2=isr, 3=xfer (uint)
Alles anzeigen
Moin 182,
ja, so ist es mit den Fragen und Antworten...
Jeder sieht es anders...
Egal, schau dir mal das an
Und such dort nach I2C.
Dort steht die Antwort.
Das ist nun deine Baustelle.
Gruss Bernd
Hallo,
lt. https://raspberrypi.stackexchange.com/questions/2910…audrate-for-i2c
brauche ich die Datei /sys/module/i2c_bcm2835/parameters/baudrate
leider fehlt mir die Berechtigung
pi@webpi:~ $ sudo touch /sys/module/i2c_bcm2835/parameters/baudrate
touch: „/sys/module/i2c_bcm2835/parameters/baudrate“ kann nicht berührt werden: Keine Berechtigung
Wie komme ich an die Berechtigung?
Moin 182,
der Beitrag in deinem Link ist über 2 Jahre alt...
Sage mal, ließt du eigentlich was dir geschrieben wird??
Gruss Bernd
//edit Du weißt aber auch das man den I2C-Bus nicht zu lang machen sollte. Einstrahlung von anderen Komponenten kannst du auch ausschliessen??
Hallo wie kann ich das wieder rückgängig machen
Na, das ist doch schon mal etwas. Also könnte:
[font="Courier New, monospace"]sudo modprobe -r i2c_bcm2708[/font]
[font="Courier New, monospace"]sudo modprobe i2c_bcm2708 baudrate=32000[/font]
Jetzt habe ich "No such file or directory: `/dev/i2c-1`
Die /dev/i2c-1 kann ich auch nicht im Editor öffnen.
Ich bitte um Nachsicht, aber Linux ist für mich noch ein Buch mit 7 Siegeln.
Die Leitung kann nicht zu lang (ca. 1,5m) sein. Ich verwende ein geschirmtes Kabel mit geschäumter Aderisolierung.
Die Leitung kann nicht zu lang (ca. 1,5m) sein. Ich verwende ein geschirmtes Kabel mit geschäumter Aderisolierung.
ist aber ein Widerspruch per Definition!
https://de.wikipedia.org/wiki/I%C2%B2C
"Er wird hauptsächlich geräteintern für die Kommunikation zwischen verschiedenen Schaltungsteilen benutzt"
welches Gerät ist 1,5m lang?
"Stabilität
Das Protokoll des I²C-Bus ist von der Definition her recht einfach, aber auch recht störanfällig. Diese Tatsache schränkt die Verwendung auf störarme Umgebungen ein, wo weder mit Übersprechen, Rauschen, EMV-Problemen noch mit Kontaktproblemen (Stecker, Buchsen) zu rechnen ist. Auch ist er ungeeignet zur Überbrückung größerer Entfernungen, wie es beispielsweise für Feldbusse typisch ist.
Der Bus kann jedoch mit speziellen Treibern auf einen höheren Strom- oder Spannungspegel umgesetzt werden, wodurch der Störabstand und die mögliche Leitungslänge steigen. Ein noch größerer Störabstand ist durch eine Umsetzung auf den physikalischen Layer des CAN-Busses möglich, "
Moin 182,
geh einmal in raspi-config. Schalte dort I2c aus. Reboot. Wieder raspi-config, Bus wieder einschalten. Eventuell wieder einen Reboot.
Kontrolle mit ls -l /dev/i2c*
Gruss Bernd
Danke G8BR,
Jetzt bleibt nur noch das Problem mit der Taktreduzierung.
Probleme mit der Leitung können definitiv ausgeschlossen werden.
Ich verwende einen P82715 für die Übertragung.
Ich vermute das der Arduino Uno am anderen Ende evt. mit der Geschwindigkeit überfordert ist.
Der Fehler tritt nur auf wenn 32 Byte übertragen werden, bei 1 Byte past immer alles.
Das komische ist auch das es seit zwei Monaten an einen provisorischen RP ohne Probleme funktioniert hat.
Darum wollte ich auch wissen wo die Busfrequenz abzulesen ist, weil der provisorische RP evt. eine andere Frequenz hat wie der jetzige.
Ein Wechsel der RP kommt nicht in Frage weil auf dem fest eingebauten RP alles Andere einwandfrei läuft.
Frequenzmessung an SCL ist nicht möglich, weil der Takt nicht permanent anliegt.
Moin 182,
freut mich.
Aber im Ernst schau dir folgende Datei an
und such dort nach I2C. Dort steht der genaue Parameter und wo das hin soll.
Gruss Bernd
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!