Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor 15F628A C++


Vizitator aurelian77

Postări Recomandate

Vizitator aurelian77

Am scris un program in C++ dar m-am inpotmolit la cateva functii.

1. doresc sa comunic cu LCD-ul 16*2 prin I2C cea ce nu am reusit :( sa configurez I2C-ul pentru LCD pe BR6 si BR7 pini i-am ales deoarece folosesc osc intern deci ar fi disponibili.

2. La apesarea butonului adauga sau butonului scade sa imi semnaleze 1 Led apesarea lor iar daca butonul de adaugare sau de scadere este tinut apesat el sa adauge doar o singura data si alta scriere sa o faca doar daca butonul va fi elibeat si reapesat.

3. sa folosesc un pin ca si buton care sa dea pe un pin on/off la un led. Daca se apasa o data ledul a sta in on chiar daca se elibereaza butonul iar a doua apesare ledul va sta in off chiar daca se elibereaza butonul.

4. Daca butonul de adaugare va fi apesat si tinut apesat daca in acest timp se apeasa butonul de scadere el sa nu actioneze nici un calcul adica scadere sau adunare condifia find daca unul dintre butoane este apasat celalalt sa nu aiba nici o functie deci sa actioneze pe rand si conditionate unul de altul.

Eu am facut si am simulat in proteus codul pana acuma acesta:

 

program numarare_0---100;
 
var a,x,y: byte ;            // declarare variabile
 text1 : array[16] of char;   // initializare variabila text1  ca lcd 16carectere
 
procedure Init;
 
begin
  TRISB := 0; // toate liniile de port B RB0 (pentru a RB7), configurat ca iesiri
  PORTB := 0;    // clear portB
 
  Lcd_Init(PORTB);             // Initialize LCD on PORTB
  Lcd_Cmd(LCD_CURSOR_OFF);     // Turn off cursor
  Lcd_Cmd(LCD_CLEAR);
   a:=0;             // initializare valoare de start
   x:=0;
   y:=0;
  Lcd_out(1,1,'Initializare');
  delay_ms(2000);
  Lcd_Cmd(Lcd_Clear);
end;
 
procedure meniu;
 
 begin
  TRISB :=255;    // Init port b intrare
  PORTB :=255;    // clear portB
  begin
a :=0;
x :=0;
   repeat
    begin
      if button(portb,0,100,1) then
         a:=1;
      if button(portb,0,100,0) then
         x:=3;
      if button(portb,1,100,1) then
         a:=2;
      if button(portb,1,100,0) then
         x:=3;
    end;
   until (a > 0);
  end;
 end;
 
  procedure calcul;
  begin
        TRISB := 0; // toate liniile de port B RB0 (pentru a RB7), configurat ca iesiri
        PORTB := 0;    // clear portB
          Lcd_Init(PORTB);
          Lcd_Cmd(Lcd_Clear);
      if a=1 then
             begin
                 y :=y+1;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Numar');
             end;
 
      if a=2 then
             begin
                 y :=y-1;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Numar');
             end;
 
      if y>100 then
             begin
 
                 y :=100;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Plin');
             end;
 
       if y<0 then
             begin
 
                 y :=0;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Gol');
             end;
 
       end;
 
 
 
      // Programul principal
 
begin
  Init;
  while true do       // daca s-a facut initializarea
   begin
    repeat
     begin
 
         meniu;
          if ((a > 0) and (x = 3))  then calcul;
 
       end;
     until false;
   end;
end.
 
 
Simulat in proteus are urmatoarele nereguli
1 Daca un buton este tinut apesat el va numara in cintinu 
2. Un led pe un port nu este scris sa lumineze cand unul din butoanele adauga sau scade este apesat
3. La valoarea 0 es se da peste cap si incepe sa scada de la 99 ..98.......0...99 etc 
Mentionez ca sunt incepator in scrierea in limbaj c++ si utilizarea programului c++ mikroPascal dar tot codul l-am facut din ahaelp programului doar ca am declarat portul si pini corespunzator picului.
Am mai incercat sa fac si varianta cu ADC_RED dar se pare ca nu este suportata de controller-ul acesta.
I2C nu stiu cum sa implementez functia asta dar ar fi foarte utila scazand nr de pini conectati cu afisorul si simplificand drastic cablajul (interfata I2C pentru afisor o am care mai am avantajul ca are pe ia semireglabil contrast iluminare afisor )
Daca este posibil cateva sfaturi si eventual unde gresesc sau daca se poate implemanta protocolul I2C la acest controler si cum.
Multumesc pentru cei care ma va ajuta cu un sfat macar pentru a reusi sa fac prg. acesta functional.
Doresc daca se poate si nu cer prea mult comentarea liniilor pentru a putea sa le inteleg mai usor deoarece eu dupa cum am zis sunt incepator in C++ lucrez de doar 4 zile si totul am loat din info programului mikroPascal
 
Link spre comentariu
  • Răspunsuri 53
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Vizitator aurelian77

 

Am scris un program in C++ dar m-am inpotmolit la cateva functii.

1. Doresc sa comunic cu LCD-ul 16*2 prin I2C cea ce nu am reusit :( sa configurez I2C-ul pentru LCD pe BR6 si BR7 .

2. La apesarea butonului adauga sau butonului scade sa imi semnaleze 1 Led apesarea lor iar daca butonul de adaugare sau de scadere este tinut apesat el sa adauge doar o singura data si alta scriere sa o faca doar daca butonul va fi elibeat si reapesat.

3. sa folosesc un pin ca si buton care sa dea pe un pin on/off la un led. Daca se apasa o data ledul a sta in on chiar daca se elibereaza butonul iar a doua apesare ledul va sta in off chiar daca se elibereaza butonul.

4. Daca butonul de adaugare va fi apesat si tinut apesat daca in acest timp se apeasa butonul de scadere el sa nu actioneze nici un calcul adica scadere sau adunare condifia find daca unul dintre butoane este apasat celalalt sa nu aiba nici o functie deci sa actioneze pe rand si conditionate unul de altul.

Eu am facut si am simulat in proteus codul pana acuma acesta:

 

program numarare_0---100;
 
var a,x,y: byte ;            // declarare variabile
 text1 : array[16] of char;   // initializare variabila text1  ca lcd 16carectere
 
procedure Init;
 
begin
  TRISB := 0; // toate liniile de port B RB0 (pentru a RB7), configurat ca iesiri
  PORTB := 0;    // clear portB
 
  Lcd_Init(PORTB);             // Initialize LCD on PORTB
  Lcd_Cmd(LCD_CURSOR_OFF);     // Turn off cursor
  Lcd_Cmd(LCD_CLEAR);
   a:=0;             // initializare valoare de start
   x:=0;
   y:=0;
  Lcd_out(1,1,'Initializare');
  delay_ms(2000);
  Lcd_Cmd(Lcd_Clear);
end;
 
procedure meniu;
 
 begin
  TRISB :=255;    // Init port b intrare
  PORTB :=255;    // clear portB
  begin
a :=0;
x :=0;
   repeat
    begin
      if button(portb,0,100,1) then
         a:=1;
      if button(portb,0,100,0) then
         x:=3;
      if button(portb,1,100,1) then
         a:=2;
      if button(portb,1,100,0) then
         x:=3;
    end;
   until (a > 0);
  end;
 end;
 
  procedure calcul;
  begin
        TRISB := 0; // toate liniile de port B RB0 (pentru a RB7), configurat ca iesiri
        PORTB := 0;    // clear portB
          Lcd_Init(PORTB);
          Lcd_Cmd(Lcd_Clear);
      if a=1 then
             begin
                 y :=y+1;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Numar');
             end;
 
      if a=2 then
             begin
                 y :=y-1;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Numar');
             end;
 
      if y>100 then
             begin
 
                 y :=100;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Plin');
             end;
 
       if y<0 then
             begin
 
                 y :=0;
                 bytetostr(y ,text1);
                 Lcd_Out(2, 1,text1);         // Print text at LCD
                 Lcd_out(1,1,'Gol');
             end;
 
       end;
 
 
 
      // Programul principal
 
begin
  Init;
  while true do       // daca s-a facut initializarea
   begin
    repeat
     begin
 
         meniu;
          if ((a > 0) and (x = 3))  then calcul;
 
       end;
     until false;
   end;
end.
 
 
Simulat in proteus are urmatoarele nereguli
1 Daca un buton este tinut apesat el va numara in cintinu 
2. Un led pe un port nu este scris sa lumineze cand unul din butoanele adauga sau scade este apesat
3. La valoarea 0 es se da peste cap si incepe sa scada de la 99 ..98.......0...99 etc 
Mentionez ca sunt incepator in scrierea in limbaj c++ si utilizarea programului c++ mikroPascal dar tot codul l-am facut din ahaelp programului doar ca am declarat portul si pini corespunzator picului.
Am mai incercat sa fac si varianta cu ADC_RED dar se pare ca nu este suportata de controller-ul acesta.
I2C nu stiu cum sa implementez functia asta dar ar fi foarte utila scazand nr de pini conectati cu afisorul si simplificand drastic cablajul (interfata I2C pentru afisor o am care mai am avantajul ca are pe ia semireglabil contrast iluminare afisor )
Daca este posibil cateva sfaturi si eventual unde gresesc sau daca se poate implemanta protocolul I2C la acest controler si cum.
Multumesc pentru cei care ma va ajuta cu un sfat macar pentru a reusi sa fac prg. acesta functional.
Doresc daca se poate si nu cer prea mult comentarea liniilor pentru a putea sa le inteleg mai usor deoarece eu dupa cum am zis sunt incepator in C++ lucrez de doar 4 zile si totul am loat din info programului mikroPascal

 

Link spre comentariu

Esti curajos cu convertirea MikroPascal la C++ (ce compilator folosesti?). Ce PIC folosesti? Stiu, ai zis 15F628a... asta nu exista. 16F628a insa da!

 

Sa clarificam cate ceva:

1. Nu stii sa scrii un program: nu incepi prin a implementa toate functiile programului deodata. Una cate una, dupa cum merge. Nu va merge din prima si o sa-ti bati capul cu depanarea.

2. Probabil vrei sa folosesti MikroC, altfel ideea ta ca functiile compilatoarelor Mikroelektronika vor merge in orice compilator C este naiva.

 

Sa presupunem ca vei scrie un program in MikroC daca tot vrei functiile Mikroelektronika.

 

Nota: eu scriu exclusiv in MikroBasic, dar mai citesc si helpul C sau Pascal. Colegii "vorbitori" de C sunt invitati sa corecteze.

 

Sa presupunem si ca LCD-ul tau este unul standard pe 4 biti. Ai idee daca LCD-ul tau are controller pentru comunicatie I2C sau asa e proiectul? MikroC are functii hard si soft pentru I2C, dar e prematur sa incepi cu I2C cand nu stii sa controlezi un LED. FYI: http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/i2c_library.htm

 

Mesajul tau e greu de citit si inteles. In viitor foloseste butonul cu simbolul <> ca sa pui codul scris.

 

Inainte de a face orice program: iti controlezi toti registrii care ar conta in programul tau.

PORTB = 0;  TRISB = 0b00000000; // toate iesiri TRISA = 0b00000001; // RA0 este intrare switch, RA1 (LED) e iesireCMCON = 7; // dezactivezi comparatorul ca sa ai pinii numai digitali

Punctul 1: initializarea LCD (pe serial, nu pe I2C)

 

Sa purcedem cu LCD-ul pe 4 biti. Cum definim conexiunile? Poti asigna orice pin (nu neaparat din acelasi PORT) cata vreme pot fi facuti iesiri (exclus pin MCLR).

// LCD module connectionssbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB0_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit;sbit LCD_RS_Direction at TRISB4_bit;sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB0_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB3_bit;// End LCD module connections

Conexiuni ca aici:

Posted Image

Cum initializam (totul ca-n help-ul din compilator si de pe Internet):

  Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off  Lcd_Out(1,1,"Text aici");          // Write text in first row

Punctul 3 (sar peste punctul 2 caci nu inteleg ce vrei, ca de altfel si punctul 4): Cum citim switch-ul si aprindem LED-ul cand eliberam switch-ul:

Citim RA0, unde e switch-ul conectat; la tranzitie din 1 to 0 (luam degetul de pe switch),PORTA.1 (iesirea LED) e activata:- definim niste variabile:bit oldstate;                                    // Old state flag- in programul principal:if (Button(&PORTA, 0, 1, 1)) {                   // Detect logical one    oldstate = 1;                                // Update flag}if (oldstate && Button(&PORTA, 0, 1, 0)) {       // Detect one-to-zero transition   PORTA.1 = 1;                                  // PORTA.1 is ON   oldstate = 0;                                 // Update flag}

Hai sa-l stingem la urmatoarea apasare, odata aprins. Inlocuiesti ce-i mai sus cu:

- definim niste variabile:bit oldstate; // Old state flagbit ON // Ca sa stim ca a fost ONON = 0 // Predefinim ca la pornire nu e ON LED-ul- programul principal:if (ON == 0)	if (Button(&PORTA, 0, 1, 1)) {                   // Detect logical one    	    oldstate = 1;                                // Update flag	}	if (oldstate && Button(&PORTA, 0, 1, 0)) {       // LED is ON   	   oldstate = 0;                                 // Update flag	   ON == 1	}else if	if (Button(&PORTA, 0, 1, 1)) {                   // Detect logical one    	    oldstate = 1;                                // Update flag	}	if (oldstate && Button(&PORTA, 0, 1, 0)) {       // Detect one-to-zero transition   	   PORTA.1 = 0;                                  // LED is ON   	   oldstate = 0;                                 // Update flag	   ON == 0	}}

Deocamdata atata, macar sa reusesti acesti pasi. Ca sa nu mai pui puzderia aia de IF-uri, poate te orientezi catre SWITCH http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/switch_statement.htm

 

Mai explica o data ce voiai la punctul 2 si 4. Ceva schema (schita) ar ajuta.

 

LE: 3 butoane pe un ADC este extrem de simplu (dar pe alt PIC, 628 nu are ADC, doar comparator). Fa schita cu divizoarele si mai discutam.

 

LLE: uite aici toate functiile cu exemple http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/mikroc_pro_libraries.htm

Pentru proiectul tau merge sigur varianta FREE de la orice compilator Mikroelektronika.

Editat de thunderer
Link spre comentariu
Vizitator aurelian77

Esti curajos cu convertirea MikroPascal la C++ (ce compilator folosesti?). Ce PIC folosesti? Stiu, ai zis 15F628a... asta nu exista. 16F628a insa da!

 

Sa clarificam cate ceva:

1. Nu stii sa scrii un program: nu incepi prin a implementa toate functiile programului deodata. Una cate una, dupa cum merge. Nu va merge din prima si o sa-ti bati capul cu depanarea.

2. Probabil vrei sa folosesti MikroC, altfel ideea ta ca functiile compilatoarelor Mikroelektronika vor merge in orice compilator C este naiva.

 

Sa presupunem ca vei scrie un program in MikroC daca tot vrei functiile Mikroelektronika.

 

Nota: eu scriu exclusiv in MikroBasic, dar mai citesc si helpul C sau Pascal. Colegii "vorbitori" de C sunt invitati sa corecteze.

 

Sa presupunem si ca LCD-ul tau este unul standard pe 4 biti. Ai idee daca LCD-ul tau are controller pentru comunicatie I2C sau asa e proiectul? MikroC are functii hard si soft pentru I2C, dar e prematur sa incepi cu I2C cand nu stii sa controlezi un LED. FYI: http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/i2c_library.htm

 

Mesajul tau e greu de citit si inteles. In viitor foloseste butonul cu simbolul <> ca sa pui codul scris.

 

Inainte de a face orice program: iti controlezi toti registrii care ar conta in programul tau.

PORTB = 0;  TRISB = 0b00000000; // toate iesiri TRISA = 0b00000001; // RA0 este intrare switch, RA1 (LED) e iesireCMCON = 7; // dezactivezi comparatorul ca sa ai pinii numai digitali

Punctul 1: initializarea LCD (pe serial, nu pe I2C)

 

Sa purcedem cu LCD-ul pe 4 biti. Cum definim conexiunile? Poti asigna orice pin (nu neaparat din acelasi PORT) cata vreme pot fi facuti iesiri (exclus pin MCLR).

// LCD module connectionssbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB0_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit;sbit LCD_RS_Direction at TRISB4_bit;sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB0_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB3_bit;// End LCD module connections

Conexiuni ca aici:

Posted Image

Cum initializam (totul ca-n help-ul din compilator si de pe Internet):

  Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off  Lcd_Out(1,1,"Text aici");          // Write text in first row

Punctul 3 (sar peste punctul 2 caci nu inteleg ce vrei, ca de altfel si punctul 4): Cum citim switch-ul si aprindem LED-ul cand eliberam switch-ul:

Citim RA0, unde e switch-ul conectat; la tranzitie din 1 to 0 (luam degetul de pe switch),PORTA.1 (iesirea LED) e activata:- definim niste variabile:bit oldstate;                                    // Old state flag- in programul principal:if (Button(&PORTA, 0, 1, 1)) {                   // Detect logical one    oldstate = 1;                                // Update flag}if (oldstate && Button(&PORTA, 0, 1, 0)) {       // Detect one-to-zero transition   PORTA.1 = 1;                                  // PORTA.1 is ON   oldstate = 0;                                 // Update flag}

Hai sa-l stingem la urmatoarea apasare, odata aprins. Inlocuiesti ce-i mai sus cu:

- definim niste variabile:bit oldstate; // Old state flagbit ON // Ca sa stim ca a fost ONON = 0 // Predefinim ca la pornire nu e ON LED-ul- programul principal:if (ON == 0)	if (Button(&PORTA, 0, 1, 1)) {                   // Detect logical one    	    oldstate = 1;                                // Update flag	}	if (oldstate && Button(&PORTA, 0, 1, 0)) {       // LED is ON   	   oldstate = 0;                                 // Update flag	   ON == 1	}else if	if (Button(&PORTA, 0, 1, 1)) {                   // Detect logical one    	    oldstate = 1;                                // Update flag	}	if (oldstate && Button(&PORTA, 0, 1, 0)) {       // Detect one-to-zero transition   	   PORTA.1 = 0;                                  // LED is ON   	   oldstate = 0;                                 // Update flag	   ON == 0	}}

Deocamdata atata, macar sa reusesti acesti pasi. Ca sa nu mai pui puzderia aia de IF-uri, poate te orientezi catre SWITCH http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/switch_statement.htm

 

Mai explica o data ce voiai la punctul 2 si 4. Ceva schema (schita) ar ajuta.

 

LE: 3 butoane pe un ADC este extrem de simplu (dar pe alt PIC, 628 nu are ADC, doar comparator). Fa schita cu divizoarele si mai discutam.

 

LLE: uite aici toate functiile cu exemple http://www.mikroe.com/download/eng/documents/compilers/mikroc/pro/pic/help/mikroc_pro_libraries.htm

Pentru proiectul tau merge sigur varianta FREE de la orice compilator Mikroelektronika.

Cer scuze pentru greseli dare primul factor este nestiinta urmatorul este dezordinea si in final oboseala.

Eu am instalat multe programe care copileaza si deacea am lucrat in  mikroPascal dar cautam functii pentru c++.

Poate pot sa modific topical ca duc in deruta oameni.

Eu dupa cum am zis am doar 4 zile si tot caut sa vad care program este mai “bland” in expresii si functii care ma pot acomoda cu el sis a il invat.

Din fila “exemplu.bas” am luato si am incercat sa fac u un program cu “inbunatatiri” care de faptt nu am facut mai nimica L, dar cu siguranta doresc sa invat functiile logice si conditii corecte de a se aplica.

Corect pic-ul este 16f728a

Initial in exemplul era 16f627a dar avea 1k memorie si nu era suficenta

Am migrat la 16f628a cu 2k memorie destul de multa pentru a avea loc initializarea LCD  care ocupa mult spatiu.

Initial programul era scris si facut pentru PicBasic Pro fila fiind exemplu.bas mestiind dupa instalarea programului sa declar LCD 16*2 caractere am trecut la mikroPascal unde am gasit in ajutor exemplu cu LCD J.

M-am tot uitat prin ajutor si am scris programul sub alta forma care de fapt face si altceva din pacate (in mare parte face cam tot numai ca incorrect).

Ce trebuie sa faca el.

1. La alimentare sa apara pe LCD linia1 Initializare sis a ramana pana cand se va actiona un buton.

2. Sa aiba 2 butoane sa zicem “Buton+” si “Buton-” care sa se ocupe cu numararea de la 0 la 100

3.Sa mai aiba un buton care sa faca on/off pe un pin (aprind lumina pe afisor sau o sting pini afisor 16 si 16 comanda cu un bc747 sau bc557)

4. Un led sa lumineze doar in cazul in care unul din butoanele “Buton+” sau ”Buton-” va fi actionat dar, ledul sa nu mai lumineze in cazul in care pe ecran apare “Nr.0” si se va reapesa “Buton-“ si in cazul in care pe ecarn va aparea “Nr. 100” si se va apasa “Buton+”.

5. Conditia de butoanele de adaugare sau de scadere sa fie astfel : Daca “Buton+” va fi actionat si se va tine actionat el doar o data sa numere adica sa aduca pe afisor din (sa presupunem nr.5 sa aduca nr.6) chiar daca el va fi tinut apesat 1 ora el sa nu numere in continu si invers pentru “Buton-“  alta conditie ar fi daca unul din butoanele de numarat fie “Butom-” fie “Buton+” este apesat si tinut apesat atunci daca se apasa celalalt buton el sa fie ignorat.

6. Cand ajunge la nr.100 pe un pin sa trimita un semnal catre un buzzer.

La mine momentan

Afiseaza primul mesaj “initializare”

Actionarea nutoanelor “Buton-“ sau “Buton+” o face numai ca la tinerea apesata va numara incontinu si la “Buton-“ cand va ajunge la 0 va trece in 99, 98, 97, etc

Nici vorba de buton on/off (nu am reusit s ail scriu in program)

Nici vorba de led care sa semnalizeze apasarea unui buton (nu am reusit s ail scriu in program)

De buzzer………..

Voiam sa fac comunicarea pe I2C din motiv cablaj mai simplu on/off ar merge facut din soft, pini liberi pentru viitor a altor functii.(dar I2C pare a fi prea complicate pentru mine)

 

Mersi thunderer pentru informatii si sfaturi

O sa pun si schita dupa cum am conceputo si cateva poze de simulare in proteus daca ajuta pot sa pun si fila hex pentru cine  foloseste proteusul

Link spre comentariu

Scuze ca intru in discutie, dar textul scris de tine pare tradus cu Google translate din alta limba (multe greseli de toate tipurile).

Daca nu te descurci cu limba romana nu este nici-o rusine sa postezi in limba engleza. Majoritatea care stim cate ceva din domeniul embedded stim si limba engleza avand in vedere ca trebuie sa putem macar datasheet-ul sa il citim. Nu scriu doar ca sa ma aflu-n treaba ci pentru ca de exemplu nici nu am stat sa citesc tot ce ai scris din simplul motiv ca ma doare capul doar citind postarea ta. Cele bune.

 

Sorry for disrupting your discussion, but your post seems to be Google translated from another language (too many mistakes) to Romanian.

If you cannot speak Romanian language there is no shame to post here in English. Most of those who know a little embedded programming also know how to speak in English because we have to be able to at least read a datasheet.

I do not write this just for the sake of it, but because I did not finished reading your post just for the reason that my head hurts after reading it. All the best!

Editat de mars01
Link spre comentariu

Eu iti zic sa te hotarasti in ce limbaj/compilator vrei sa lucrezi. Mai toate au propriile functii implementate pentru usurarea vietii programatorilor.Apreciez re-scrierea enuntului proiectului. E mult mai clar, dar cere destula concentrare ca sa-l intelegi :).Deci, 1) in ce limbaj vrei sa scrii si 2) familiarizeaza-te cu facilitatile compilatorului ales. Si 3) scrie ceva cod, compileaza si uita de simulatoare, cata vreme nu intelegi programul.NB: faptul ca un cod e compilat nu inseamna ca va face ce voiai tu sa faca.PS: nu cred ca speri ca cineva aici va scrie programul intreg. Care, de altfel, nu e complicat deloc. Am exemple de programele facute de mine in Basic care puse impreuna fac ce vrei tu. Ceea ce se vrea pe forum e sa pui intrebari cand te impotmolesti. Altfel, vei fi trimis la rubrica de Joburi.

Link spre comentariu

@aurelian: discutiile pe privat nu-si gasesc rostul cand esenta forumului e discutia intre mai multi membri. Plus ca n-am nici timp, nici chef sa citesc romane pe PM.Te pot ajuta punctual numai.Cred ca exista o biblioteca pentru encodere in MikroPascal. A publicat-o (nu-mi mai aduc aminte de era Dany sau Janni) pe forumul Mikroe. O pun mai tarziu aici, ca nu are rost sa o reinventezi tu.

Editat de thunderer
Link spre comentariu

Aurelian, nu vreau sa crezi ca sunt rautacios dar esti foarte greu de inteles in felul in care te exprimi.

 

Mai jos ai un program in mikroC care, daca am inteles eu bine, ar trebui sa faca ce vrei tu. Nu am folosit intreruperi ca sa nu te confuzez mai tare.

#define LOW     0#define HIGH    1// Lcd pinout/*  PIN LCD     PIN uC  D7          RB7  D6          RB6  D5          RB5  D4          RB4  EN          RB3  RS          RB2*/sbit LCD_RS at RB1_bit;sbit LCD_EN at RB2_bit;sbit LCD_D7 at RB7_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D4 at RB4_bit;// Directie pini Lcdsbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB7_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB4_bit;char init_text[] = "Initializare";char txt[] = "Counter: ";char str[3];                            // string care va stoca valoarea contoruluibit bl;                             // tine minte starea backlight-uluiunsigned short counter;                 // contorul care este afisat pe ecranunsigned short old_state_plus, old_state_minus, old_state_bl;   //stocare stari anterioare butoanevoid init() {     VREN_bit = 0;                      // Dezactivare Voltage Ref     CMCON = 7;                         // Dezactivare comparatoare          TRISA0_bit = 0;                    // Setare RA0 ca iesire; aici este LED-ul     TRISA1_bit = 0;                    // Setare RA1 ca iesire; aici este BACKLIGHT-ul     RA0_bit = LOW;                     // Setare LOW a celor iesirii LED     RA1_bit = HIGH;                     // Backlight-ul este default ON asa ca il facem HIGH// Setare RA2, RA3, RA4 ca intrari, aici sunt butoanele     TRISA2_bit = 1;                     // butonul PLUS     TRISA3_bit = 1;                     // butonul MINUS     TRISA4_bit = 1;                     // butonul pentru control BACKLIGHT          TRISB3_bit = 0;                    // Setare RB3 ca si OUTPUT (pentru PWM)          Lcd_Init();                        // Initializare LCD     PWM1_Init(2000);                   // Initializare PWM cu frecventa de 3KHz     PWM1_Set_Duty(0);                  // Factor umplere nul <=> LOW la iesirea PWM (pin RB3)     Lcd_Cmd(_LCD_CLEAR);               // Clear display     Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off     bl = 1;}void main() {     init();  //apelare functia INIT          Lcd_Out(1, 1, init_text);     /* Cat timp nici-unul din butoane nu este apasat,        programul sta si asteapta apasarea unui buton.        In acest timp, pe ecran este afisat: "Initializare"     */     while (Button(&PORTA, 2, 10, 1) && Button(&PORTA, 3, 10, 1));     Lcd_Out(1,1,"                ");                     // LCD clear. Se poate face si cu Lcd_Cmd dar parca este mai rapid asa     Lcd_Out(1,1, txt);                                   // afisaj pe ecran defaultul de dupa initializare     Lcd_Out(1,12,"0");          while(1) {              if (Button(&PORTA, 4, 10, 1)) {             // Detect HIGH pe buton                 old_state_BL = 1;                        // updateaza flag              }              if (old_state_BL && Button(&PORTA, 4, 10, 0)) {   // se detecteaza tranzitia de la buton liber la buton apasat                 bl = ~bl;                                      // schimba starea backlight-ului                 old_state_BL = 0;                              // updateaza flag-ul                 RA1_bit = bl;              }                            if (Button(&PORTA, 2, 10, 1)) {                 old_state_plus = 1;              }              if (Button(&PORTA, 3, 10, 1)) {                 old_state_minus = 1;              }              if (old_state_plus && Button(&PORTA, 2, 10, 0)) {                 /* Daca butonul Plus este apasat se testeaza daca butonul Minus este                    apasat si daca butonul Minus este apasat nu va face nimic (de fapt un NOP)                    si trece mai departe.                 */                 if (Button(&PORTA, 3, 10, 0)) {                    asm NOP;        // instructiunea NOP apare ca sa nu optimizeze compilatorul aceasta sectiune, se poate sa mearga si fara.                 }                 else {                      if (counter >= 100) {    //daca variabila contor este >=100 atunci este initializata din acest moment cu 100                         counter = 100;                         PWM1_Start();          // Pornire PWM  - incepe sa scoata un sunet si se potoleste doar cand scade valoarea sub 100                         PWM1_Set_Duty(128);                      }                      else {                           counter++;       // daca var contor este mai mica de 100 atunci este incrementate                                                      RA0_bit = 1;     // aprinzi LED-ul pentru 50ms la fiecare apasare valida                           Delay_ms(50);                           RA0_bit = 0;                      }                      ByteToStr(counter, str); // convertim contorul din numar in string pentru a putea if afisat                      Lcd_Out(1, 10, "   ");   // curatam ecranul de ce a fost anterior pe pozitiile unde se afiseaza contorul                      Lcd_Out(1, 10, str);     // afisam valoarea contorului                                            old_state_plus = 0;      // tinem minte starea curenta a butonului                 }              }                            if (old_state_minus && Button(&PORTA, 3, 10, 0)) {                 /* Daca butonul Minus este apasat se testeaza daca butonul Plus este                    apasat si daca butonul Plus este apasat nu va face nimic (de fapt un NOP)                    si trece mai departe.                 */                 if (Button(&PORTA, 2, 10, 0)) {                    asm NOP;                 }                 else {                      if (counter == 0) {                         counter = 0;                      }                      else {                           PWM1_Stop();  //se opreste sunetul                           counter--;    //decrementare contor                           RA0_bit = 1;  // aprinzi LED-ul pentru 50ms  la fiecare apasare valida                           Delay_ms(50);                           RA0_bit = 0;                      }                      ByteToStr(counter, str);                      Lcd_Out(1, 10, "   ");                      Lcd_Out(1, 10, str);                                            old_state_minus = 0;                 }              }    }}

Ai atasat si proiectul mikroC cat si simularea in Proteus ISIS. LED-ul ar trebui sa se aprinda la fiecare apasare de buton (mai putin cand contorul este 0 sau 100) dar nu se aprinde, cred ca este o problema de simulator.

Sper sa te ajute.

Aurelian77.zip

Editat de mars01
Link spre comentariu

Se poate vedea un puls de cca 50ms. L-am pus asa scurt pentru ca delay-ul ala adunat cu debounce-ul din functia Button va genera un lag la apasarea butonului si am incercat sa il minimizez. 

Normal ca solutia cea mai buna ar fi folosirea unui timer/intrerupere dar am scris programelul sa fie mai simplu.

 

Ar fi o idee buna sa facem un topic unde sa postam snippet-uri, bucati de cod utile ca exemple. Fiecare pune acolo ce doreste, obligatoriu surse si nu fisiere .hex.

In felul acesta cei care chiar vor sa invete sa programeze, se vor putea ajuta de acele exemple ca sa treaca de bariera grea a inceputului cand totul este nefamiliar si aproape incomprehensibil.

 

OFF-Topic: Mi-as dori ca si in acest forum sa gasim lucruri de valoare dar si originale, chiar sa incepem proiecte originale mai complexe, in loc sa cautam tot timpul pe forumurile de afara. Ceva mai mult decat un voltmetru ...

Un lucru ma tot deranjeaza ca atitudine in Romania: cu cine vorbesti despre o idee, prima chestie care apare in dicutie este "cum sa faci bani mai repede". Intrebari naive de genul: "da poti breveta chestia aia?" sau "cati bani faci din cealalta!". Chiar ieri vorbeam cu un taximetrist despre care am aflat ca era electronist ca pregatire (ce coincidenta, nu?) si cand ii spuneam cate chestii faine se pot face prin masina, prima interventie a sa avea legatura cu cati bani se pot face din acest lucru.

 

Nu ma deranjeaza sa se faca bani doar ca as dori sa vad mai mult si chestii nonprofit. Din acest punct de vedere, noi romanii suferim din cauza saraciei impuse. Avem foarte multe resurse (intelectuale si de alt fel) dar vin altii straini (aka investitori) sa le foloseasca in loc sa le folosim noi, iar acest lucru si-a pus amprenta pe psihologia romanului.

Nu sunt religios din fire, dar parca traim timpurile biblice cu vitelu' de aur.

Editat de mars01
Link spre comentariu

OFF-Topic: Mi-as dori ca si in acest forum sa gasim lucruri de valoare dar si originale, chiar sa incepem proiecte originale mai complexe, in loc sa cautam tot timpul pe forumurile de afara. Ceva mai mult decat un voltmetru ...

Un lucru ma tot deranjeaza ca atitudine in Romania: cu cine vorbesti despre o idee, prima chestie care apare in dicutie este "cum sa faci bani mai repede". Intrebari naive de genul: "da poti breveta chestia aia?" sau "cati bani faci din cealalta!". Chiar ieri vorbeam cu un taximetrist despre care am aflat ca era electronist ca pregatire (ce coincidenta, nu?) si cand ii spuneam cate chestii faine se pot face prin masina, prima interventie a sa avea legatura cu cati bani se pot face din acest lucru.

 

Nu ma deranjeaza sa se faca bani doar ca as dori sa vad mai mult si chestii nonprofit. Din acest punct de vedere, noi romanii suferim din cauza saraciei impuse. Avem foarte multe resurse (intelectuale si de alt fel) dar vin altii straini (aka investitori) sa le foloseasca in loc sa le folosim noi, iar acest lucru si-a pus amprenta pe psihologia romanului.

Nu sunt religios din fire, dar parca traim timpurile biblice cu vitelu' de aur.

Ce te opreste sa faci o incercare de revolutie in domeniu?

Propune o tema de discutie, fa ceva util pentru acest forum, pentru tara asta, pentru conducatorii ei iubiti.

 

PS: exista si varianta sa joci baschet cu un (prost) ales , si sa treci usor peste astfel de chinuri intelectuale.

Eventual iti fu..ti o tesla intrun genunchi , treci la islam  si scapi si de vitelu' de aur :)

 

Parerea mea: Stai calm sau fugi din regiune.

Ce vrei tu nu merge intro tara in care la 25 de ani de la revolutie inca se mai voteaza cu comunistii.

Link spre comentariu

Ce te opreste sa faci o incercare de revolutie in domeniu?

Propune o tema de discutie, fa ceva util pentru acest forum, pentru tara asta, pentru conducatorii ei iubiti.

 

PS: exista si varianta sa joci baschet cu un (prost) ales , si sa treci usor peste astfel de chinuri intelectuale.

Eventual iti fu..ti o tesla intrun genunchi , treci la islam  si scapi si de vitelu' de aur :)

 

Parerea mea: Stai calm sau fugi din regiune.

Ce vrei tu nu merge intro tara in care la 25 de ani de la revolutie inca se mai voteaza cu comunistii.

Păi frate ...dacă toţi am gândi asa...vai de capul nostru...de aceea nu se prea face nimic în tara asta!!!

Din cauza gândirii păguboase ...”dece să-ţi ajuţi colegul/vecinul/prietenul...că cine ştie??! poate deveni mai bogat ca tine!”

Nu mai bine îi dai in cap ...şi faci tot ce e posibil să-l vezi  la ananghie!...aşa te vezi şi tu mult mai bine in faţa celorlalţi! NU??!

...aaaa să nu uit!...vezi să nu cumva să îmbogaţeşti pe ”comuniştii aştia”! Nu merită! :ras:

Editat de elmar
Link spre comentariu

Îi informez pe cei care încă mai văd comuniști la televizor, că în 20-30 de ani nu vor mai fi generațiile mature de dinainte de 89, dar, din păcate, mîrlănia, răutatea, prostia și nesimțirea vor dăinui.

scuze de off topic

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări