www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Ne najdem napake na preprostem programu
Pojdi na stran 1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Tor Apr 05, 2016 8:53 pm    Naslov sporočila:  Ne najdem napake na preprostem programu Odgovori s citatom

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;
  }   



2016-04-05 20.44.55.jpg
 Opis:
 Velikost datoteke:  1005.37 KB
 Pogledana:  16 krat

2016-04-05 20.44.55.jpg



_________________
Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
joze
Član
Član



Pridružen-a: Pet 26 Jan 2007 10:27
Prispevkov: 200
Aktiv.: 0.96

PrispevekObjavljeno: Sre Apr 06, 2016 9:51 am    Naslov sporočila:   Odgovori s citatom

LP!

Ledica je vezana iz + preko upora na Anodo katoda pa na PCF, ko
bo PCF na "0" ledica sveti?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sre Apr 06, 2016 10:02 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sre Apr 06, 2016 10:14 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Eisenhorn
Član
Član



Pridružen-a: Tor 08 Dec 2009 11:50
Prispevkov: 200
Aktiv.: 1.15
Kraj: LJ

PrispevekObjavljeno: Sre Apr 06, 2016 10:52 am    Naslov sporočila:   Odgovori s citatom

Kaj pa če v setup na začetek dodaš še:
Koda:
Wire.begin();


Lp,
David
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sre Apr 06, 2016 5:51 pm    Naslov sporočila:   Odgovori s citatom

Eisenhorn je napisal/a:
Kaj pa če v setup na začetek dodaš še:
Koda:
Wire.begin();

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Eisenhorn
Član
Član



Pridružen-a: Tor 08 Dec 2009 11:50
Prispevkov: 200
Aktiv.: 1.15
Kraj: LJ

PrispevekObjavljeno: Sre Apr 06, 2016 7:36 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.11

PrispevekObjavljeno: Sre Apr 06, 2016 8:06 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Sre Apr 06, 2016 8:17 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Sre Apr 06, 2016 8:52 pm    Naslov sporočila:   Odgovori s citatom

Jutri.l
_________________
Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Čet Apr 07, 2016 2:18 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Čet Apr 07, 2016 2:39 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Čet Apr 07, 2016 2:50 am    Naslov sporočila:   Odgovori s citatom

Š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 Smile)

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.09
Kraj: Dragomer

PrispevekObjavljeno: Čet Apr 07, 2016 3:07 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Pet Apr 08, 2016 8:26 pm    Naslov sporočila:   Odgovori s citatom

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.



I2C_Scan.rar
 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2, 3  Naslednja
Stran 1 od 3

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group