|
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: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Tor Apr 05, 2016 8:53 pm Naslov sporočila: Ne najdem napake na preprostem programu |
|
|
Arduino Mega sem priklopil na PCF8574 - glej sliko
Na pin9 (P4) PCF8574 se dal ledico, da vidim, da dela.
Napisal sem preprost program. Vsako sekundo naj bi in ledica na Arduinu in ledica na PCF8574 spremenila stanje. Hm, pa me ne uboga.
Ledica na Arduinu utriplje,
Ledica na PCf8574 pa zasveti samo prvo sekundo po resetu, nato ostane ugasnjena.
Kaj pravite?
Koda: |
// Opomba: Če bomo res delali za atmega644p, potem morajo biti urniki tipa bajt
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
#include<Wire.h>
// Globalne konstante in spremenljivke
const int ledPin = 13; // 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!)
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
/////////////////////////////////////////// SETUP //////////////////////////////////
void setup() {
// sprosti releje na IO EXPANDERJU:
Wire.beginTransmission(PCF8574W);
Wire.write(Releji);
Wire.endTransmission();
//
pinMode(ledPin, OUTPUT);
mySerial.begin(9600);
}
////////////////////////////////////////// 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++;
mySerial.println(Sekunde); // dela, izpisuje na Brayv terminal
// Želim, da utripa ledia na
Wire.beginTransmission(PCF8574W);
Wire.write(Releji);
Wire.endTransmission();
Releji = Releji ^ 0XFF;
} |
Opis: |
|
Velikost datoteke: |
1005.37 KB |
Pogledana: |
16 krat |
|
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
joze Član
Pridružen-a: Pet 26 Jan 2007 10:27 Prispevkov: 200 Aktiv.: 0.95
|
Objavljeno: Sre Apr 06, 2016 9:51 am Naslov sporočila: |
|
|
LP!
Ledica je vezana iz + preko upora na Anodo katoda pa na PCF, ko
bo PCF na "0" ledica sveti?
|
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Sre Apr 06, 2016 10:02 am Naslov sporočila: |
|
|
joze je napisal/a: |
LP!
Ledica je vezana iz + preko upora na Anodo katoda pa na PCF, ko
bo PCF na "0" ledica sveti? |
In tudi sveti, toda samo takoj po resetu, ko void setup postavi pcfporte na 0
Čim pa pridem v void setup in počakam sekundo ledica ugasne in ostane ugasnjena.
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Sre Apr 06, 2016 10:14 am Naslov sporočila: |
|
|
Popravljam:
Ledica se prižge, ko prvič pride v void loop.
v void setup sem dal delay 10000 da se prepričam, da je on prižgal ledico.
Bi morala ledica goreti 10 sekund, pa ne. Po desetih sekundah se za eno sekundo prižge, in ko ugasne, je konec utripanja
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
Eisenhorn Član
Pridružen-a: Tor 08 Dec 2009 11:50 Prispevkov: 200 Aktiv.: 1.14 Kraj: LJ
|
Objavljeno: Sre Apr 06, 2016 10:52 am Naslov sporočila: |
|
|
Kaj pa če v setup na začetek dodaš še:
Lp,
David
|
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Sre Apr 06, 2016 5:51 pm Naslov sporočila: |
|
|
Eisenhorn je napisal/a: |
Kaj pa če v setup na začetek dodaš še:
Lp,
David |
Sem že, in v Setup in v Loop
Nič.
Kako dobim najnovejšo verzijo wire.h biblioteke? Po mojem imam kako staro verzijo..
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
Eisenhorn Član
Pridružen-a: Tor 08 Dec 2009 11:50 Prispevkov: 200 Aktiv.: 1.14 Kraj: LJ
|
Objavljeno: Sre Apr 06, 2016 7:36 pm Naslov sporočila: |
|
|
Poskusite še zamenjati Wire.write(Releji); z Wire.write(Releji, 8);
Lp,
David
P.S.: Prehitro in preveč površno prebral Arduino stran, moj popravek ne bo deloval...
Nazadnje urejal/a Eisenhorn Sre Apr 06, 2016 8:10 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
igo Član
Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3638 Aktiv.: 17.06
|
Objavljeno: Sre Apr 06, 2016 8:06 pm Naslov sporočila: |
|
|
Odstrani spanje. Namesto njega daj delay(2500).
Kako je z naslovi A0 = A1 = A2 = 1 ?
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.92 Kraj: Grosuplje
|
Objavljeno: Sre Apr 06, 2016 8:17 pm Naslov sporočila: |
|
|
Vilko, Wire.endTransmission(naslov) vrne 0,1,2,3 ali 4
Citiram: |
Returns byte, which indicates the status of the transmission:
0:success
1:data too long to fit in transmit buffer
2:received NACK on transmit of address
3:received NACK on transmit of data
4:other error |
Poizkusi to in rezultat pošlji na serijski port.
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Sre Apr 06, 2016 8:52 pm Naslov sporočila: |
|
|
Jutri.l
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Čet Apr 07, 2016 2:18 am Naslov sporočila: |
|
|
igo je napisal/a: |
Odstrani spanje. Namesto njega daj delay(2500).
Kako je z naslovi A0 = A1 = A2 = 1 ? |
Seveda sem probaval to in ono, in tudi sem spanje zamenjal z delay - isti rezultat.
A0=A1=A2=1 high
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Čet Apr 07, 2016 2:39 am Naslov sporočila: |
|
|
Jaka57 je napisal/a: |
Vilko, Wire.endTransmission(naslov) vrne 0,1,2,3 ali 4
Citiram: |
Returns byte, which indicates the status of the transmission:
0:success
1:data too long to fit in transmit buffer
2:received NACK on transmit of address
3:received NACK on transmit of data
4:other error |
Poizkusi to in rezultat pošlji na serijski port. |
No sedaj smo pa bliže. Del programa sem spremenil tako:
Koda: |
mySerial.println(Releji, HEX );
//Wire.begin();
Wire.beginTransmission(PCF8574W);
Wire.write(Releji);
int i = Wire.endTransmission();
mySerial.print ( "return from endtransmition "); mySerial.println (i);
if ( Releji == 0 ) Releji = 0Xff ;
else Releji = 0 ;
|
in dobil sledeči izpis:
Citiram: |
8
FF
return from endtransmition 0
9
0
return from endtransmition 4
10
FF
return from endtransmition 0
11
0
return from endtransmition 4 |
8,9,10, so sekunde, ne igra vloge
0 ali FF je byte releji hex
in če pošljem na PCF 0 dobim return 4
če pošljem na PCF FF dobim return 0 - jasno, da ledica ne gori.
Sedaj moramo še najti način, da se znebimo return 4
Potem sem zamenjal program, misleč, da samo nule noče poslati in spremenil tako:
Koda: |
if ( Releji == 1 ) Releji = 0Xff ;
else Releji = 1 ;
|
pa isto:
Citiram: |
FF
return from endtransmition 0
24
1
return from endtransmition 4
25 |
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Čet Apr 07, 2016 2:50 am Naslov sporočila: |
|
|
Šele, ko ponovim pisanje, dobim return 0 in tudi ledica utriplja:
Koda: |
mySerial.println(Releji, HEX );
//Wire.begin();
Wire.beginTransmission(PCF8574W);
Wire.write(Releji);
int i = Wire.endTransmission();
mySerial.print ( "return from endtransmition "); mySerial.println (i);
mySerial.println(Releji, HEX );
//Wire.begin();
Wire.beginTransmission(PCF8574W);
Wire.write(Releji);
i = Wire.endTransmission();
mySerial.print ( "return from endtransmition "); mySerial.println (i);
if ( Releji == 1 ) Releji = 0Xff ;
else Releji = 1 ; |
Citiram: |
27
FF
return from endtransmition 0
FF
return from endtransmition 4
28
1
return from endtransmition 0 <enojska uspešno zapisana
1
return from endtransmition 0
29
FF
return from endtransmition 0 < FF uspešno zapisan
FF
return from endtransmition 4 < FF neuspešno zapisan
30 |
Zaobilazni put ( Tako smo v JLA imenovali pot, ki nas je pripeljala do cilja, ne da bi podrli oviro, ki nam je bila na poti )
Po vsakem pisanju testiraj return kodo in če ni nič, ponovi pisanje.
Ko dvakrat zaporedno dobiš kodo !=0 tedaj alarm
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.04 Kraj: Dragomer
|
Objavljeno: Čet Apr 07, 2016 3:07 am Naslov sporočila: |
|
|
Je pa to ena velika packa.
V Bascomu se mi to ni dogajalo.
Tam sem enostavno zapisal
Koda: |
I2csend Wpcf8574a , Releji |
in zadeva je delala
Še vedno razmišljam, da bi pri update-u knjižnice wire.h to morda bilo rešeno.
Ali sem prvi med vami, ki se ukvarjam z PCF8574?
Taka napaka lahko vodi do slučaja, ko mikroprocesor ne bo sposoben v nuji izklopiti naprav, ki visijo na relejih !!
_________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.92 Kraj: Grosuplje
|
Objavljeno: Pet Apr 08, 2016 8:26 pm Naslov sporočila: |
|
|
Vilko, sem se malo pohecal z ATmega1284p (na 11.0592MHz) in PCF8574A, nastalo je tole:
Bootloader dela brez problemov, prav tako tudi tvoj (malenkost spremenjen) program, s katerim si želel testirat PCF expander.
V glavnem osnovni problem v tvojem programu je adresiranje PCF8574(A) in pri tem mi enostavno ne gre v "lajšto" razlaga adresiranja iz podatkovnega lista za PCF8574A, na spodnji sliki:
in tabela iz istega podatkovnega lista
Če pogledamo prvo sliko iz te sledi, kot si napisal, če je A0=A1=A2=1 potem je naslov PCFa za vpisovanje na porte 0x7E, toda iz tabele pa sledi, da je ta naslov 0x3F, kar mi je vračal tudi I2C scaner,
prav tako sem ugotovil, po malo iskanja po NETu, da uporabljajo za PCF8574 (brez A) naslove 0x2X in ne 0x4X.
Po teh ugotovitvah sem malo popravil tvoj program, da izgleda za PCF8574A takole:
Koda: |
// Opomba: Če bomo res delali za atmega644p, potem morajo biti urniki tipa bajt
#include<Wire.h>
// Globalne konstante in spremenljivke
const int ledPin = 13; // 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!)
const byte PCF8574= 0X27; // I2C PCF8574A write addres je od 0X38 do 0x3F
// I2C PCF8574 write addres je od 0x20 do 0x27
/////////////////////////////////////////// SETUP //////////////////////////////////
void setup() {
Serial.begin(9600);
Wire.begin(); // inicializacija Wire, to je potrebno samo enkrat
// sprosti releje na IO EXPANDERJU:
Wire.beginTransmission(PCF8574);
Wire.write(Releji);
Wire.endTransmission();
//
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 ledia na
Wire.beginTransmission(PCF8574);
Wire.write(Releji);
Wire.endTransmission();
Releji = Releji ^ 0XFF;
}
|
Ven sem pobrisal vse #include razen Wire.h, ki je potreben za I2C in programski serial port, ter uporabil strojnega. Mega644 (1284) ima dva serijska porta, torej, zakaj uporabljai programskega?
Pobrisal sem tudi set_sleep_mode(). In zadeva dela tako kot naj bi oz. kot si si zamislil.
V prilogi je I2C scener, ki sem ga pobral iz arduino.cc strani.
Opis: |
|
Download |
Ime datoteke: |
I2C_Scan.rar |
Velikost datoteke: |
1.02 KB |
Downloadano: |
5 krat |
_________________ Lp, Jaka
Nazadnje urejal/a Jaka57 Sob Apr 09, 2016 5:02 pm; skupaj popravljeno 1 krat |
|
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: 68 dni
Powered by phpBB © 2001, 2005 phpBB Group
|