[ enaB @ 02.03.2008. 13:25 ] @
Nov sam u programiranju mikrokontrolera i imao bih nekoliko pitanja u vezi mikroC-a :)

Šema:


Code:
#include "D:\Documents and Settings\user\Desktop\LED_Disp.h"
int i=0;
void main() {
  TRISB    = 0;
  PORTB    = 0;
  TRISA    = 0x03;
  PORTA    = 0x00;
  
  for(;;) {
          if(i>9)
                 i=0;

       PORTB=LED_Disp(i);
       if(i==0)
               PORTA.F2=~PORTA.F2;
       if(PORTA.F0)
                     Delay_ms(500);
            else
                if(PORTA.F1)
                     Delay_ms(2000);
                else
                     Delay_ms(1833);
         i++;
  }
}


1. Zašto je greška ako se "i" deklariše kao lokalna promenljiva unutar main-a?
2. Zašto se pritiskom na odgovarajući taster ne menja brzina brojanja, nego je stalno 500ms? Ako napišem if(!PORTA.F0) onda je stalno 1833ms. Meni bi bilo logično da 500ms bude dok je pritisnut taster T1, a 2000ms dok je pritisnut T2, a ako nije pritisnut ni jedan od njih onda 1833ms. Zašto nije tako?
[ POW R TOC H @ 02.03.2008. 13:58 ] @
Sumnjam da ti mozemo odgovoriti na sva pitanja ako nam ne kazes sta je u LED_Disp.h...
Ali odma' da ti dam par saveta :
Umesto Delay_ms() koristi interrupt-e, jer su mnogo precizniji, a i nema potrebe da ti program spava dok ceka. Takodje, onu for petlju si mogao da ugnezdis u jednu while(1), i da je koristis za 'vrtenje' promenljive 'i' :

while(1)
{
for(i = 0; i < 10; i++)
{
...
}

}

sto je mnogo citljivije i elegantnije resenje.
Sto se tice promenljive i, meni radi kad se deklarise u funkiji main() :D
Nadam se da ti je ovo nekako pomoglo.
[ enaB @ 02.03.2008. 15:25 ] @
Ovde je samo tabelica za prikaz cifara
Code:

/*LED_Disp.h*/
int LED_Disp(int x) {
            switch(x) {
                        case 0: return 0b01111110;
                        case 1: return 0b00001100;
                        case 2: return 0b10110110;
                        case 3: return 0b10011110;
                        case 4: return 0b11001100;
                        case 5: return 0b11011010;
                        case 6: return 0b11111010;
                        case 7: return 0b00001110;
                        case 8: return 0b11111110;
                        case 9: return 0b11011110;

          }
}


Hvala ;)
[ sander @ 02.03.2008. 20:37 ] @
Ja bih prvo proverio da li imas dobar kontakt na pinu A0 jer po tome kako si objasnio(la) tebi se ne menja stanje na tom pinu, proveri da li imas 5V i 0V na pinu prilikom pritiska i otpustanja tastera.

Varijablu mozes da postavis u main funkciji ali prvo definises varijablu pa onda redjas naredbe, funkcije ...

Malo prelistaj literaturu u vezi programiranja u c programskom jeziku jer ti je program prilicno necitak pa ces kod pisanja vecih programa i sam(a) biti zbunjen(a) u razumevanju koda koji si sam(a) napisao(la).

Cemu kasnjenje 1833? Ajde razlika 500 i 2000, ali razlika 1833 i 2000 je prilicno neprimetna.
[ branko_g @ 02.03.2008. 20:37 ] @
Code:

/*LED_Disp.h*/
int LED_Disp(int x) {
            switch(x) {
                        case 0: return 0b01111110;
...

Aj aj aj aj..
To se tako ne radi.
Prvo:
U Header File NE IDE C-KOD!
SAMO DEFINICIJE!
Ako već hoćeš da projekat podeliš na nekoliko fajlova radi preglednosti i lakšeg održavanja
programa onda funkciju int LED_Disp,(int x).. pripada u jedan fajl
sa ekstenzijom .c:
/*leddisp.c*/
#include leddisp.h

int LED_Disp(int x){...
/* end of leddisp.c*/

uz taj .c fajl pripada UVEK jedan .h fajl sa istim nazivom. U njemu su definicije:
/*leddisp.h*/
#ifndef _LEDDISP_H
#define _LEDDISP_H
#define abc ABC
...
extern int LED_Disp(int x);
#endif
/* end of leddisp.h*/

Drugo:
Kao dobar programerski stil se smatra ako funkcija ima SAMO JEDNU povratnu vrednost:
Code:

int LED_Disp(int x) {
int temp;
            switch(x) {
                        case 0: temp= 0b01111110; break;
                        case 1: temp= 0b00001100; break;
.
}// end of switch(x)
return temp; // Samo jedna povratna vrednost u jednoj funkciji
}


Treće:
Nađi neku dobru knjigu o C-programiranju


Pozdrav Branko

[ branko_g @ 02.03.2008. 20:45 ] @
I još nešto:
Zašto će ti tip int(integer) kao parametar i povratna vrednost kada ti je mustra dugačka samo 8 bajta?
Za to je dovoljan tip char, pogotovo ako tu povratnu vrednost hoćeš da izbaciš na jedan port
mikrokontrolera na kojem ti se nalazi displej, koji je verovatno širok isto 8 bita.
Ovako ćeš možda imati problema zbog nekompatibilnosti tipova.


[ enaB @ 02.03.2008. 20:53 ] @
Našao sam problem - nisam dobro okrenuo prekidače....
Hvala na sugestijama, sa C/C++ -om sam dosta dugo upoznat i dobre knjige sam već čitao, ali se tokom pisanja uopšte nisam ni trudio da to lepo izgleda, troši što manje memorije i da je po ustaljenim "pravilima", već samo da služi svrsi, tj. drži vodu dok majstori odu :)
1833ms je zato što ne znam tačnu frekvenciju a ovako je približno 1s u stvarnosti.

Tnx ;)
[ branko_g @ 03.03.2008. 07:10 ] @
Uostalom:
Citat:

Ovde je samo tabelica za prikaz cifara

Code:

/*LED_Disp.h*/
int LED_Disp(int x) {
switch(x) {
case 0: return 0b01111110;
case 1: return 0b00001100;
case 2: return 0b10110110;
case 3: return 0b10011110;
case 4: return 0b11001100;
case 5: return 0b11011010;
case 6: return 0b11111010;
case 7: return 0b00001110;
case 8: return 0b11111110;
case 9: return 0b11011110;

}
}


Hvala ;)


Zašto topovima na vrabce?
Tako nešto se rešava jednostavnije sa jednom tabelom(Array):
Code:

char LED_Tabela[10]={
0b01111110,
0b00001100,
..
0b11011110,
};


A koristI se kao:
Code:

PORTB=LED_Tabela[cifra];


[ Elktro Alek @ 12.03.2008. 10:32 ] @
I ja se slazem da delay_ms nije najbolji nacin da to uradis. Drugo, ja bih ti predlozio da pogledas malo i oko oscilatora, tj frekfencije....mada radis se o fizickom pritiskanju tastera tako da ti to i nije toliko bitno
[ POW R TOC H @ 12.03.2008. 10:42 ] @
Cekaj sekund... enaB... Sa foruma SK, i Krstarice?
Onaj koji je bio samnom na seminaru elektronike?
Nazvao bih se fingerprint, ali je ime vec bilo zauzeto...
[ enaB @ 13.03.2008. 05:16 ] @
Oscilator bih ubacio, ali nisam našao 2 ista kondenzatora tako male vrednosti(najmanje što sam isčeprkao su 1nF a sa tim neće da radi)


@POW R TOC H