 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Pet Apr 08, 2016 8:43 pm Naslov sporočila: |
|
|
Jaka, neskončna hvala, zelo si se potrudil in uspel!
Bom moral to še prebavit.
Opis: |
|
Velikost datoteke: |
47.28 KB |
Pogledana: |
17 krat |

|
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Pet Apr 08, 2016 10:16 pm Naslov sporočila: |
|
|
Zanimivo, našel sem TIjev clip, v katerem je takoj na vrhu napisano adresiranje obeh PCF8574.
Torej:
- PCF8574 od 0x20 do 0x27,
- PCF8574A od 0x38 do 0x3F.
Opis: |
|
 Download |
Ime datoteke: |
PCF8574_short.pdf |
Velikost datoteke: |
289 KB |
Downloadano: |
5 krat |
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Apr 09, 2016 9:54 am Naslov sporočila: |
|
|
Torej sem kopiral tvoj način naslavljanja PCF8574 - ni šlo.
Nato sem naredil z vsemi štirimi variantami.
Moj čip je PCF8574 torej brez A , naslovni pini so na 1
Koda: |
const byte PCF8574AW = 0X7E; // I2C PCF8574A write addres je &H7E A0=A1=A2=1
const byte PCF8574W = 0X4E; // I2C PCF8574 write addres je &H4E A0=A1=A2=1
const byte PCF8574A = 0X3F; // I2C PCF8574A write addres je &H7E A0=A1=A2=1
const byte PCF8574 = 0X2E; // I2C PCF8574 write addres je &H4E A0=A1=A2=1
|
In tu so rezultati: PCF8574AW
Koda: |
Sekunde 1
Releji hex = 0
return from endtransmition 4
Sekunde 2
Releji hex = FF
return from endtransmition 4
Sekunde 3
Releji hex = 0
return from endtransmition 4
Sekunde 4
Releji hex = FF
return from endtransmition 4
|
In tu so rezultati: PCF8574AW - MOJA PRVOTNA VARIANTA
Koda: |
Sekunde 1
Releji hex = 0
return from endtransmition 4
Sekunde 2
Releji hex = FF
return from endtransmition 0
Sekunde 3
Releji hex = 0
return from endtransmition 4
Sekunde 4
Releji hex = FF
return from endtransmition 0
Sekunde 5
Releji hex = 0
return from endtransmition 4 |
In tu so rezultati: PCF8574A
Koda: |
Sekunde 1
Releji hex = 0
return from endtransmition 4
Sekunde 2
Releji hex = FF
return from endtransmition 4
Sekunde 3
Releji hex = 0
return from endtransmition 4
|
In tu so rezultati: PCF8574
Koda: |
Sekunde 1
Releji hex = 0
return from endtransmition 4
Sekunde 2
Releji hex = FF
return from endtransmition 4
Sekunde 3
Releji hex = 0
return from endtransmition 4
|
Pravih rezultatov ne dobim nikakor, le pri mojem načinnu je return koda 0 pri vsakem drugem poizkusu?
Hm, je z mojim čipom kaj narobe? Dvomim. Kupil sem novega pri Justu pred dnevi..
Je ušel dim ven?
Bom prinesel s seboj moje vezje, ko se dobiva, boš poizkusil še ti.
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Sob Apr 09, 2016 10:46 am Naslov sporočila: |
|
|
Vilko, prevedi in poženi program iz priloge.
Opis: |
|
 Download |
Ime datoteke: |
I2C_Scan.zip |
Velikost datoteke: |
1.2 KB |
Downloadano: |
1 krat |
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
joze Član


Pridružen-a: Pet 26 Jan 2007 10:27 Prispevkov: 204 Aktiv.: 0.91
|
Objavljeno: Sob Apr 09, 2016 11:01 am Naslov sporočila: |
|
|
LP!
Kaj pa pullup upori na SDA in SCL.
|
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Apr 09, 2016 11:03 am Naslov sporočila: |
|
|
joze je napisal/a: |
LP!
Kaj pa pullup upori na SDA in SCL. |
Ne igrajo vloge. Sem probal z in brez, enak rezultat.
Sedaj unzipam tvoj program.
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Apr 09, 2016 11:12 am Naslov sporočila: |
|
|
Citiram: |
In tu so rezultati:
Scanning...
I2C device found at address 0x27 !
done |
Probam še 0x27 in javim.
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sob Apr 09, 2016 11:16 am Naslov sporočila: |
|
|
Tudi z 0X27 ne gre:
Citiram: |
Sekunde 1
Releji hex = 0
return from endtransmition 4
Sekunde 2
Releji hex = FF
return from endtransmition 4
Sekunde 3
Releji hex = 0
return from endtransmition 4 |
Izgleda, da sem padel v globoko jamo ...
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Sob Apr 09, 2016 5:31 pm Naslov sporočila: |
|
|
Vilko, tako globoka pa zopet ni, da ne bi splezal ven.
Ker uporabljaš za tole preizkušanje Mego2560, sem to isto naredil s tako platko in mi zadeva funkcionira BP.
Program sem malenkost spremenil, da se ne miksa PCF8574 in PCF8574A, sedaj je v programu (tvojem, ki sem ga prilepil na prejšnji strani) samo PCF8574.
Pri sebi imam A0=A1=A2=0 in ko poženem scan mi najde PCF na 0x38, ta naslov vpišem v tvoj program, prevedem in pošljem v Mego2560 in ledice veselo blinkajo na vsako sekundo.
Knjižnjica Wire uporablja 7 bitno adresiranje, zato so vsi naslovni biti pomaknjeni za eno mesto v desno.
Sem pa poizkusil kompletno zadevo s programskim I2C, kjer lahko izbereš pine po želji in verjel ali ne, celo deluje .
Uporabil sem tvoj program in ga preizkusil na megi1284 z 10.0592MHz.
Koda: |
// Opomba: Če bomo res delali za atmega644p, potem morajo biti urniki tipa bajt
//Definicije, ki se nanašajo na knjižnjico SoftI2CMaster
#define SDA_PORT PORTD // kot je to v tvojem načrtu
#define SDA_PIN 7
#define SCL_PORT PORTD
#define SCL_PIN 5
#define I2C_TIMEOUT 100
#define I2C_NOINTERRUPT 0
#define I2C_SLOWMODE 1
#define FAC 1
#define I2C_CPUFREQ (F_CPU/FAC)
#include <SoftI2CMaster.h>
// Globalne konstante in spremenljivke
#define PCF8574_W_ADDR 0x7e // 8 bitni naslov A0=A1=A2=1 za pisanje je bit0=0 torej je naslov 0x7e
#define PCF8574_R_ADDR 0x7f // 8 bitni naslov A0=A1=A2=1 za branje je bit0=1 torej je naslov 0x7f
const int ledPin = 12; // the number of the LED pin
int ledState = 0; // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 1000; // interval at which to blink (milliseconds)
int Sekunde,Minute;
byte Releji = 0; // releji na PCF8574A
// rele je vključen, če je odgovarjajoči bit 0! (Negativno krmiljenje!)
/////////////////////////////////////////// SETUP //////////////////////////////////
void setup() {
#if FAC != 1
CPUSlowDown(FAC);
#endif
Serial.begin(9600);
Serial.println(F("Intializing ..."));
Serial.print("I2C delay counter: ");
Serial.println(I2C_DELAY_COUNTER);
if (!i2c_init())
Serial.println(F("Initialization error. SDA or SCL are low"));
else
Serial.println(F("...done"));
pinMode(ledPin, OUTPUT);
}
////////////////////////////////////////// LOOP ////////////////////////////////////
void loop() {
unsigned long currentMillis = millis(); // Ali je interval ene sekunde prekel
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Da. Nastavimo na sledečo sekundo
Sekunda(); // Kličemo podprogram Sekunda
}
// set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
}
////////////////////////////////////////VOID SEKUNDA MINUTA URA /////////////////////////////////
void Sekunda() {
// Tukaj kodiramo aktivnosti, ki se morajo odviti vsako sekundo
ledState = ~ledState ; // invertiram ledState
digitalWrite(ledPin, ledState); // To dela, ledica utripa
Sekunde++;
Serial.println(Sekunde); // dela, izpisuje na Brayv terminal
// Želim, da utripa ledica na
if (i2c_start(PCF8574_W_ADDR))
{
i2c_write(Releji);
i2c_stop();
Releji = Releji ^ 0XFF;
}
else
{
Serial.println("NAPAKA");
if (!i2c_init())
Serial.println(F("Ne morem komunicirati s PCF"));
}
} |
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.00
|
Objavljeno: Ned Apr 10, 2016 3:45 am Naslov sporočila: |
|
|
Vilko, zdaj pa dosti heca.
Če ne gre zlepa (knjižnice in fensi-šmensi), pa zgrda (bit za bitom) zabij podatke v PCF.
Na vse izhode PCF daj upore in ledice.
V programčku določi arduino številki od pinov SCL ter SDA.
Programček bo v zanki pošiljal podatek (seveda enak naslovu) na naslove od 0x00 do 0x7F. Podatke z neveljavnimi naslovi bo PCF ignoriral, saj niso namenjeni njemu.
Veljaven I2C naslov se bo pojavil v binarni obliki iz prižganih in ugasnjenih ledic.
Če je bit naslova enak "1" (ali "0", če open collector negira izhod), bo ledica svetila.
Koda: |
/*
vilkoi2c
*/
// PINI
#define pinI2Cd 20? // i2c SDA pin ???????????????????
#define pinI2Cc 21? // i2c SCL pin ???????????????????
// SPREMENLJIVKE
unsigned char i;
unsigned char j;
unsigned char k;
unsigned char naslov;
void setup()
{
delay(50);
pinMode(pinI2Cc, OUTPUT); // i2c SCL
pinMode(pinI2Cd, OUTPUT); // i2c SDA
}
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void loop() //
{
for (naslov = 0; naslov < 128; naslov++) // NASLOV gre od 0 do 127
{
digitalWrite(pinI2Cd, LOW ); // START na SDA pin
digitalWrite(pinI2Cc, LOW); // START na SCL pin
PiseI2Cz(naslov << 1); // ZANKA, ki vpiše 8 bitov // NASLOV je zgornjih 7 bitov, bit0 je 0 (WRITE)
digitalWrite(pinI2Cd, LOW ); // ACK, pošlje 0
digitalWrite(pinI2Cc, HIGH); // ACK impulz na SCL pin
digitalWrite(pinI2Cc, LOW); //
PiseI2Cz(naslov); // ZANKA, ki vpiše 8 bitov // Najprej 0 in nato 7-bitni NASLOV se pošlje kot 8-bitni podatek
digitalWrite(pinI2Cd, LOW ); // ACK, pošlje 0
digitalWrite(pinI2Cc, HIGH); // ACK impulz na SCL pin
digitalWrite(pinI2Cc, LOW); //
digitalWrite(pinI2Cc, HIGH); // STOP na SCL pin
digitalWrite(pinI2Cd, HIGH ); // STOP na SDA pin
delay(50);
}
}
// NA IZHODIH PCF MORAJO SVETITI LEDICE NA PINIH, NA KATERIH IMA NASLOV BIT enak 1. (ali 0, če je negirana izhodna logika od PCF)
//////////////////////////////////////////////////
//////////////////////////////////////////////////
void PiseI2Cz(char k) // (spremenljivka) ZANKA
{
j=0x80; // maska 1000 0000 // MSB = bit 7 GRE NAJPREJ ven
for(i=0; i<8; i++)
{
if ((k & j) != 0 ) //
{
digitalWrite(pinI2Cd, HIGH ); // pošlje 1
}
else
{
digitalWrite(pinI2Cd, LOW ); // pošlje 0
}
digitalWrite(pinI2Cc, HIGH); // impulz na CLK pin
digitalWrite(pinI2Cc, LOW); //
j = j >> 1; // ZACNE NA BITU 7 (MSB od k)
}
}
|
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Ned Apr 10, 2016 10:55 am Naslov sporočila: |
|
|
Hvala obema!
Zelo si me razveselil, Jaka, ko si dosegel, da lahko programiramo katerikoli atmel, to mi boš ob priliki pokazal. In tudi ti Igo, In tudi, da lahko uporabiš katerikoli par pinov za i2c.
nisem vedel, za 7-bitno adresiranje. Bom takoj probal z mojim programom, le da bom naslov šibnil en bit v desno, saj je tako mišljeno, kaj ne?
Bom javil uspeh ali neuspeh.
Pozdrav
VS
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Jaka57 Moderator



Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5820 Aktiv.: 24.56 Kraj: Grosuplje
|
Objavljeno: Ned Apr 10, 2016 12:26 pm Naslov sporočila: |
|
|
Igo, ja tudi to dela, ko je bit 1 je na izhodu 1, torej je ledica ugasnjena.
Vilko, če se ne motim, uporablja PCF samo za vklaplanje relejev, torej bi lahko uporabil tvoj program kot funkcijo in ne bi potreboval nikakršne dodatne knjižnjice,
s tem, da se odpove kontroli ali je PCF OK ali ni.
Ja in za tvoj primer potrebuje pullup upore na SDA in SCL pinih.
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3361 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Ned Apr 10, 2016 1:05 pm Naslov sporočila: |
|
|
S katerikoli naslovom, dobim vedno return 4.
Jutri bom šel k Justu po nov PCF8574 tokrat v varianti A
Koda: |
// Definiram vse mogoče naslove in poizkusim z vsemi
byte naslovi[] = {0X4E, // PCF8574W
0X7E, // PCF8574AW
0X4F, // PCF8574R
0X7F, // PCF8574AR
// In še isto 7-bitno se pravi /2 tam se r/~w bit izgubi
0X27, // PCF8574
0X3F }; // PCF8574A |
Koda: |
4E return from endtransmition 4
4E return from endtransmition 4
4E return from endtransmition 4
4E return from endtransmition 4
4E return from endtransmition 4
4E return from endtransmition 4
7E return from endtransmition 4
7E return from endtransmition 4
7E return from endtransmition 4
7E return from endtransmition 4
7E return from endtransmition 4
7E return from endtransmition 4
4F return from endtransmition 4
4F return from endtransmition 4
4F return from endtransmition 4
4F return from endtransmition 4
4F return from endtransmition 4
4F return from endtransmition 4
7F return from endtransmition 4
7F return from endtransmition 4
7F return from endtransmition 4
7F return from endtransmition 4
7F return from endtransmition 4
7F return from endtransmition 4
27 return from endtransmition 4
27 return from endtransmition 4
27 return from endtransmition 4
27 return from endtransmition 4
27 return from endtransmition 4
27 return from endtransmition 4
3F return from endtransmition 4
3F return from endtransmition 4
3F return from endtransmition 4
3F return from endtransmition 4
3F return from endtransmition 4
3F return from endtransmition 4 |
in ja, imam pullupe, škoditi nemorejo ...
_________________ Nihče ni za vojno in vsi so za mir,
vsi so za bratstvo, nihče za prepir.
Od same ljubezni vsak čas na granatah
bo vtisnjeno geslo: "Darilo za brata"
Janez Menart |
|
Nazaj na vrh |
|
 |
Obelix Član

Pridružen-a: Pon 19 Maj 2008 13:59 Prispevkov: 1881 Aktiv.: 9.04 Kraj: Maribor
|
Objavljeno: Ned Apr 10, 2016 4:15 pm Naslov sporočila: |
|
|
Vilko. Če ne dobiš si tukaj izberi ustreznega in bo čez cca. 10 dni pri tebi.
|
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.00
|
Objavljeno: Ned Apr 10, 2016 4:52 pm Naslov sporočila: |
|
|
Ja, v prvem 8-bitnem paketu naslov zaseda zgornjih 7 bitov (7, 6, 5, 4, 3, 2 in 1). Bit0 pa je ukaz Read (beri, če je Bit0 enak 1) oziroma Write (piši, če je Bit0 enak 0).
V naslovu so zgornji 4 biti fiksni (7, 6, 5 in 4), od tod tista 4 (0100) ali 7 (0111).
Spodnje 3 določimo s kombinacijo vhodov A2, A1 in A0.
Temelj zmede pa je v tem, da se je nekdo spomnil te tri bite združiti z ukazom in jih skupaj z zgornjimi štirimi
poimenovati naslov.
Preglednejše bi bilo za tiste s 4:
#define PCF4000W B01000000;
#define PCF4001W B01000010;
...
#define PCF4111W B01001110;
Za tiste s 7 pa:
#define PCF7000W B01110000;
#define PCF7001W B01110010;
...
#define PCF7111W B01111110;
Nato pa še za branje
#define PCF4000R B01000001;
#define PCF4001R B01000011;
...
#define PCF4111R B01001111;
in
#define PCF7000R B01110001;
#define PCF7001R B01110011;
...
#define PCF7111R B01111111;
Potem vedno natančno veš, s katerim izmed 16 PCF-jev komuniciraš ter kaj želiš početi (brati/pisati).
Za pisanje je torej Bit0 enak 0.
Potem postaviš Start zaporedje:
SDA na 0;
SCL na 0;
Z mojo zanko oddrdraš naslov naprimer PisiI2Cz(PCF4111W);
SDA na 0;
SCL na 1; // ACK
SCL na 0;
Nato pa oddrdraš še podatek PisiI2Cz(podatek); // (releji)
SDA na 0;
SCL na 1; // ACK
SCL na 0;
SCL na 1; // STOP
SDA na 1;
Če želiš brati nek vhod, moraš najprej v njegov bit vpisati 1, da izklopiš tranzistor. To narediš z gornjim zaporedjem. (podatek) mora imeti "1" na bitih, ki jih želiš brati, ostali biti so taki, kot so stanja izhodov.
(Poglej si vklop/izklop bitov z maskiranjem s tistimi B0je0 do B7je1 iz prejšnje teme).
Takoj za tem pa ponoviš začetni del s
PisiI2Cz(PCF4111R);
pri čemer je bit0 enak 1, da sledi Branje.
Druga zanka pa je
BeriI2Cz();
ki sem jo pripel v prejšnji temi (z imenom BereVHOz). Samo imena obeh pinov se preimenuje.
Za test v moj programček dodaj delay(50); za čisto vsakim digitalWrite. Malo dlje bo trajalo, a dodaj še ledici na scl in sda, da boš videl, če se sploh kaj dogaja.
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 495 dni
Powered by phpBB © 2001, 2005 phpBB Group
|