AT89C2051 - Programi za pocetnike (Bascom)

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Pozdrav!

Evo i ja polako ulazim u svijet mikrokontrolera, a buduci da na internetu nisam uspio naci neke jednostavne programe za pocetnike odlucio sam otvoriti ovaj topic u nadi da ce netko od vas eksperta imati volje pomoci svima koji se tek pocinju baviti mikrokontrolerima. Da se tema ne bi razvodnila ogranicio bih se na programiranje mikrokontrolera AT89C2051 iskljucivo u Bascom-u 8051. Predlazem da svi koji krecu s ovakvim programiranjem svoje probleme/zadatke predstave ovdje ukoliko trebaju pomoc.

Pa evo za pocetak:
Kako bi se programski realizirao jednostavan brojac impulsa (npr. na pinu P1.0)? Svaki put kada signal prijedje iz niskog logickog stanje u visoko varijablu X treba povecati za 1.

Hvala!
Branez
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 457
Joined: 22-04-2008, 16:27
Location: Maribor(SLO) Koprivnica(HR)
Contact:

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Branez »

Odlično, znači budeš vodio kurs poput Pedje ali u Bascom-u!

Ajde, čekamo.
Real Radios Glow in the Dark!
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Mislim da bi bilo lijepo organizirat tako nesto jer ipak vecina ljudi na ovom forumu zeli nauciti nesto novo a ovo je odlican nacin da se sistematizira znanje (ili barem neke osnove) iz ovog podrucja. Nadam se da ce bit onih koji imaju iskustva u ovom podrucju i voljni su pomoci. :D
Branez
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 457
Joined: 22-04-2008, 16:27
Location: Maribor(SLO) Koprivnica(HR)
Contact:

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Branez »

Ja sam mislio da budeš ti taj.
Real Radios Glow in the Dark!
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by pedja089 »

Bilo je vec pokusaja, ali brzo se odustalo. Ja se nadam da neces odustati, pa da i ja naucim nesto novo...
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Ne znam koliko cu moci pomoci buduci da ja tek krecem uciti. Zato mi treba pomoc onih koji to znaju, a znam da ih ima na ovom forumu. Naravno, ja cu se potruditi stavljati svoje neke programe s objasnjenjima ako budem napredovao u ovome ali mi definitivno treba pomoc drugih.

Bilo bi dobro kad bi se ljudi zeljni znanja iz ovog podrucja javljali s konkretnim pitanjima i realizacijama krenuvsi od jednostavnijih stvari. Bio bih zahvalan da i oni koji znaju sudjeluju u ovome i daju neke odgovore.
Ja sam dao inicijativu. :)
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Kizo »

Evo da riješim zadatak u nadi da će se i ostali priključiti.

Netko tko tek počinje bi vjerojatno to ovako riješio:
1. provjeri dali je stanje na P1.0 "0"
2. čekaj dok se stanje ne promjeni u "1"
3. povećaj X
4. vrati se na početak

U Bascomu-8051 bi to izgledalo otprilike ovako:

Code: Select all

'definiranje varijabla
Dim X As Byte 		'varijabla x može imati vrijednost između 0 i 255


'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do                                          'beskonačna petlja

   If P1.0 = 0 Then                     'stanje P1.0 ulaza je "0"?

      Bitwait P1.0 , Set	             'čekaj dok P1.0 ne promjeni stanje u "1"
      Incr X                              'povećaj varijablu x

   End If

Loop
End                                       'nikad ne dođe do kraja programa
Evo i kako to izgleda u Bascom-AVR:

Code: Select all

'definiranje varijabla
Dim X As Byte       'varijabla x može imati vrijednost između 0 i 255


'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do                                                    'beskonačna petlja

   If PINB.0 = 0 Then                             'stanje PB.0 ulaza je "0"?

      Bitwait PINB.0 , Set                 'čekaj dok PB.0 ne promjeni stanje u "1"
      Incr X                                         'povećaj varijablu x

   End If

Loop
End                                    'nikad ne dođe do kraja programa
Pa u inline asembleru:

Code: Select all

'definiranje varijabla
Dim X As Byte       'varijabla x može imati vrijednost između 0 i 255



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Pocetak:                         'početak beskonačne petlje


'---Testiranje stanja ulaza PB.0---

RCALL Citaj_pb0          'pozovi podprogram za čitanje stanja ulaza PB.0
BRNE Pocetak           'PB.0 je "1"? -> vrati se na početak, inače nastavi dalje



'---Čekaj dok se PB.0 ne promjeni u "1"---

Cekanje:
RCALL Citaj_pb0           'pozovi podprogram za čitanje stanja ulaza PB.0
BREQ Cekanje             'PB.0 je "0"? -> skoči na "cekanje", inače nastavi dalje



'---Povečaj varijablu X---

LDS r24, {x}                   'učitaj prijašnje stanje adrese oznake X u r24
INC r24                            'povećaj registar r24 za 1
STS {x}, r24                  'spremi vrijednost registra r24 u adresu pod oznakom X
RJMP pocetak                   'vrati se na Pocetak
End                                 'nikad ne dođe do kraja programa



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Podprogram za čitanje stanja ulaza PB.0
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Citaj_pb0:
IN r24, PINB            'u r24 učitaj stanje ulaza PB
ANDI r24, 1  'maskiraj sve ulaze osim PB.0 pomoću logičkog množenja r24 i konstante 1
RET              'vrati se iz podprograma
A evo i u AVR-GCC:

Code: Select all

#include <avr/io.h>

//---Početak glavnog programa---

int main(void) {

unsigned char x = 0; // varijabla x može imati vrijednost između 0 i 255


	for(;;){					// beskonačna petlja
	
	if((PINB&(1<<PB0))==0){ 	// stanje PB.0 ulaza je "0"?
		
		while(~PINB&(1<<PB0));	// čekaj dok PB.0 ne promjeni stanje u "1"
		x++;					// povećaj varijablu x
		}
	}
return 0;
}
Inače ovaj pristup je prilično loš jer blokira program, tj. program se neće nastaviti sve dok stanje na ulazu ne pređe iz "0" u "1".

Evo mali trik kako se to može riješiti sa jednom pomoćnom varijablom:

Code: Select all

'definiranje varijabla
Dim X As Byte                        'varijabla x može imati vrijednost između 0 i 255
Dim Flag As Bit                          'pomočna varijabla (vrijednost 0 ili 1)



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do                                               'beskonačna petlja

If P1.0 = 0 Then Flag = 1           'stanje PB.0 ulaza je "0"? -> postavi zastavicu

If P1.0 = 1 And Flag = 1 Then     'stanje PB.0 ulaza je "1" i zastavica je uključena?
   Incr X                                     'povećaj varijablu x
   Flag = 0                                    'resetiraj zastavicu
End If

Loop
End                                             'nikad ne dođe do kraja programa
kikici1
Penjem se :)
Penjem se :)
Posts: 91
Joined: 14-03-2010, 09:27

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by kikici1 »

Svaka čast na inicijativi, počnite dečki tu smo. Osobno radim avr, ali ako ustreba bacit čemo se opet na čitanje samo da tema zaživi. Imate moju podršku u svakom smislu.
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Hvala na podrsci i na prvom programu! :wink:
Imam samo jos jedan prijedlog. Neka programi budu u Bascom-8051 programskom jeziku tako da ne bi zbunjivalo ljude koji ce se eventualno kasnije ukljucit. Svi jezici u kombinaciji samo kompliciraju stvari za nas pocetnike. :D
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Buduci da nitko ne komentira programe za 1. zadatak, pretpostavit cu da su svima jasni (a kako i ne bi bili uz sva objasnjenja? :) ) Evo onda novog zadatka:

Treba napisati program koji ce kratkim impulsom (klikom) na pinu P1.0 zapoceti uzastopno paljenje i gasenje diode na pinu P1.1 odredjenom brzinom. Novim impulsom na pinu P1.0 pin P1.1 postavlja se u 0.
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Kizo »

Osobno bi rađe da se radi AVR, ova 8051 arhitektura je toliko limitirana u usporedbi sa AVRom kao da voziš auto sa dignutom ručnom, ali ajde, probat ćemo ovako, osnovni principi su isti.

Onaj prijašnji zadatak, tu se nema šta posebno reći, ali ako nekom nešto nije jasno neka slobodno pita.
A ovaj zadatak se nastavlja na prijašnji, samo treba dodati blinkanje ledice.

Jedno od rješenja klasičnim, linearnim razmišljanjem:

Code: Select all

'definiranje I/O portova
Tipka Alias P1.0                          'tipka je spojena na P1.0
Ledica Alias P1.1                         'ledica je na P1.1

'definiranje varijabla
Dim Tipka_nije_pritisnuta As Bit          'oznaka dali je tipka pritisnuta
Dim Blinkaj_ledicu As Bit                 'oznaka dali treba blinkati ledicu



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do                                        'beskonačna petlja

'---provjera stanja tipke (P1.0)---

If Tipka = 0 Then Tipka_nije_pritisnuta = 1 'stanje PB.0 ulaza je "0"? -> postavi zastavicu

If Tipka = 1 And Tipka_nije_pritisnuta = 1 Then   'rastući brid impulsa detektiran?
   Blinkaj_ledicu = Not Blinkaj_ledicu    'promjeni stanje "blinkanja"
   Tipka_nije_pritisnuta = 0              'resetiraj zastavicu
End If



'---blinkanje ledice (P1.1)---

If Blinkaj_ledicu = 1 Then                'treba blinkati ledicu?
   Wait 1                                 'čekaj 1 sekundu
   Ledica = Not Ledica                    'promjeni stanje na P1.1
Else                                      'ne treba blinkati ledicu?
   Ledica = 0                             'postavi P1.1 u "0"
End If


Loop
End                                       'nikad ne dođe do kraja programa
Inače u ozbiljnim programima wait i slične naredbe se nikada ne koriste jer blokiraju procese, a zlatno pravilo glasi da procesor nikada ne smije čekati.
Tako i ovdje je problem da taj
kratki impuls (klik)
mora trajati najmanje sekundu kako bi ga se detektiralo. Da se to riješiti da se koristi, primjerice, waitms 1 i pomoćna varijabla koja će kad odbroji 1000 promijeniti stanje ledice, pretakanje iz šupljega u prazno, ali što ako taj impuls traje svega par mikrosekundi??

Dali su otprilike jasni pojmovi timer i interapti ili tu treba par riječi?
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Jasno je u cemu je problem. Kratki impuls definitivno ne traje 1s. Taj problem treba nekako ispraviti, ako se da. Nekako slutim da je rjesenje u timeru i interruptu.
Timer bi bio nekakav unutarnji brojac mikrokontrolera dok je interrupt prekid koji pokrece prekidnu rutinu nakon cega se ponovno nastavlja izvodit glavni program.
To su ovako dosta sazete definicije ali slobodno ih ti prosiri.
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Kizo »

Točno to. Timer/Counter (radi se o istoj stvari) je neki vrag koji broji impulse. Može brojati unutarnje (Timer) ili vanjske (Counter) impulse. 89C2051 ima 2 16-bitna timera, dakle mogu brojati maksimalno do 65535. Kad dođe do te vrijednosti, opet počinje od nule i istovremeno se daje zahtjev za pokretanjem njegove prekidne rutine (ako je uključena).
Timer koristi sistemski klok podijeljen sa 12 kao izvor impulsa. U slučaju da uC radi na 12MHz, timer će povećavati svoju vrijednost svake 1us. Ostanimo kod 12MHz pošto je s tim najlakše računati.
Timeri mogu raditi u 4 moda, nama treba 16bitni mod 1 (detaljnije u srču).
Konfigurirat ćemo ga da daje interapt otprilike svake milisekunde, tako da ćemo svaki put u prekidnoj rutini upisati u njega vrijednost 64535.

Ovako onda izgleda program:

Code: Select all

'definiranje korištenog procesora i kristala
$regfile = "89C2051.DAT"                  'koristimo 89C2051
$crystal = 12000000                       'uC radi na 12MHz

'definiranje I/O portova
Tipka Alias P1.0                          'tipka je spojena na P1.0
Ledica Alias P1.1                         'ledica je na P1.1

'inicijalizacija hardvera
Config Timer0 = Timer , Gate = Internal , Mode = 1       'Timer0 kao 16-bitni timer

'definiranje interapta
On Timer0 Timer0_ovf_vect                 'ime prekidne rutine za Timer0

'definiranje varijabla
Dim Tipka_nije_pritisnuta As Bit          'oznaka dali je tipka pritisnuta
Dim Blinkaj_ledicu As Bit                 'oznaka dali treba blinkati ledicu
Dim Milisekunde As Word                   'varijabla koja broji milisekunde

'uključi interapte
Enable Timer0                             'uključi Timer0
Enable Interrupts                         'uključi globalne interapte

'inicijalizacija početnih uvjeta
Th0 = &HFC                                'upiši vrijednost 64535 u timer0
Tl0 = &H17
Start Timer0                              'pokreni Timer0



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do                                        'beskonačna petlja


If Tipka = 0 Then Tipka_nije_pritisnuta = 1 'stanje PB.0 ulaza je "0"? -> postavi zastavicu

If Tipka = 1 And Tipka_nije_pritisnuta = 1 Then 'rastući brid impulsa detektiran?
   Blinkaj_ledicu = Not Blinkaj_ledicu    'promjeni stanje "blinkanja"
   Tipka_nije_pritisnuta = 0              'resetiraj zastavicu
End If


Loop
End                                       'nikad ne dođe do kraja programa



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Timer0 prekidna rutina
'Ova rutina će se pokretati otprilike svake milisekunde
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Timer0_ovf_vect:


'---upiši vrijednost 64535 u timer0---

Th0 = &HFC                                'upiši vrijednost prvo u gornji bajt
Tl0 = &H17                                'zatim u donji



'---vodi računa o vremenu i blinkanju ledice---

If Blinkaj_ledicu = 1 Then                'treba blinkati ledicu?

   Incr Milisekunde                       'broji milisekunde

   If Milisekunde >= 1000 Then            '1 sekunda je prošla?
      Ledica = Not Ledica                 'promjeni stanje na P1.1
      Milisekunde = 0                     'resetiraj milisekunde
   End If

Else                                      'ne treba blinkati ledicu?
   Ledica = 0                             'postavi P1.1 u "0"
   Milisekunde = 0                        'resetiraj milisekunde
End If

Return
Ovaj program će moći detektirati impulse trajanja i 100-tinjak us.

Ako hoćemo detektirati jako kratke impulse, reda par us, moramo koristiti vanjski interapt.
Konfigurirat ćemo INT0 da pokrene prekidnu rutinu na padajući brid na P3.2.

Code: Select all

'definiranje korištenog procesora i kristala
$regfile = "89C2051.DAT"                  'koristimo 89C2051
$crystal = 12000000                       'uC radi na 12MHz

'definiranje I/O portova
Ledica Alias P1.1                         'ledica je na P1.1

'inicijalizacija hardvera
Config Timer0 = Timer , Gate = Internal , Mode = 1       'Timer0 kao 16-bitni timer
Set Tcon.0                                'padajući brid generira interapt za INT0

'definiranje interapta
On Int0 Int0_vect                         'ime prekidne rutine za Int0
On Timer0 Timer0_ovf_vect                 'ime prekidne rutine za Timer0

'definiranje varijabla
Dim Blinkaj_ledicu As Bit                 'oznaka dali treba blinkati ledicu
Dim Milisekunde As Word                   'varijabla koja broji milisekunde

'uključi interapte
Enable Int0                               'uključi Int0
Enable Timer0                             'uključi Timer0
Enable Interrupts                         'uključi globalne interapte

'inicijalizacija početnih uvjeta
Th0 = &HFC                                'upiši vrijednost 64535 u timer0
Tl0 = &H17
Start Timer0                              'pokreni Timer0



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Glavni program
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Do                                        'beskonačna petlja

Loop
End                                       'nikad ne dođe do kraja programa



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'Timer0 prekidna rutina
'Ova rutina će se pokretati otprilike svake milisekunde
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Timer0_ovf_vect:


'---upiši vrijednost 64535 u timer0---

Th0 = &HFC                                'upiši vrijednost prvo u gornji bajt
Tl0 = &H17                                'zatim u donji



'---vodi računa o vremenu i blinkanju ledice---

If Blinkaj_ledicu = 1 Then                'treba blinkati ledicu?

   Incr Milisekunde

   If Milisekunde >= 1000 Then            '1 sekunda je prošla?
      Ledica = Not Ledica                 'promjeni stanje na P1.1
      Milisekunde = 0                     'resetiraj milisekunde
   End If

Else                                      'ne treba blinkati ledicu?
   Ledica = 0                             'postavi P1.1 u "0"
   Milisekunde = 0                        'resetiraj milisekunde
End If

Return




'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'------------------------------------------------------------------------------
'INT0 prekidna rutina
'Ova rutina će se pokrenuti svaki put kada se pojavi padajući brid na P3.2
'------------------------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Int0_vect:
Blinkaj_ledicu = Not Blinkaj_ledicu       'promjeni stanje "blinkanja"
Return
To je to. Kveščns?
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Napokon sam uspio skontat ove programe. Malo mi je bilo to sve komplicirano jer se susrecem prvi put s time pa sam odlucio razbit ovaj zadatak na dva jednostavnija.

1) Treba napisati program za brojac (kao i u 1. zadatku) koristeci interrupt.

Code: Select all

$regfile = "89C2051.DAT"
$crystal = 12000000

On Int0 Prekidna_rutina

Dim X As Byte
X = 0

Enable Int0
Enable Interrupts

Do
Loop
End

Prekidna_rutina:
Incr X
Return
2) Napisati program koristeci timer koji ce odredjenom frekvencijom uzastopno paliti i gasiti diodu na pinu P1.0.

Code: Select all

$regfile = "89C2051.DAT"
$crystal = 12000000

Config Timer0 = Timer , Gate = Internal , Mode = 1
On Timer0 brojac

Dim X As Long

Enable Timer0
Enable Interrupts

Th0 = &HFC
Tl0 = &H17
Start Timer0

Do
If X = 1000 Then
   P1.0 = Not P1.0
   X = 0
End If
Loop
End

brojac:
Th0 = &HFC
Tl0 = &H17
Incr X
Return

Objasnjenja pojedine linije koda nisam pisao jer je Kizo to poprilicno kvalitetno odradio u svojim kodovima.

Jedino jos nisam shvatio ovu liniju:
Set Tcon.0

Vidim da program jednako dobro radi i bez te linije (barem u simulatoru).
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Kizo »

Kod 89C2051 vanjski interapt INT0 može da reagira na padajući brid (prelazak sa "1" na "0") ili na "low level" (dok je u "0") što se može odabrati prvim bitom u TCON registru. Na žalost, ni kod mene u simulatoru nije ovo implementirano. U stvarnosti, ako izostaviš liniju Set Tcon.0, varijabla x će se jako brzo povećavati sve dokle je P3.2 u "0".
Inače, ako nisi vidio, bascom ima prilično dobru dokumentaciju, tako da više informacija možeš naći Help->Indeks->Search->"tcon"(Enter)->prvi link

Par prijedloga u svezi drugog zadatka.

Code: Select all

Dim X As Long
Rasipanje resursima pošto X ne prelazi 1000, dovoljna je deklaracija kao Word.

Code: Select all

If X = 1000 Then
Ovdje isto leži potencijalni problem. Kad bi imao neki veliki program, moglo bi se dogoditi da interapt više puta okine prije nego što se dođe natrag do ove provjere, te da pređe ovih 1000. Onda se, radi sigurnosti stavlja ">=" (dali je x veći ili jednak 1000).
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Hvala na primjedbama! Evo i ispravljenih programa:

1)

Code: Select all

$regfile = "89C2051.DAT"
$crystal = 12000000

On Int0 Prekidna_rutina
Set Tcon.0

Dim X As Byte
X = 0

Enable Int0
Enable Interrupts

Do
Loop
End

Prekidna_rutina:
Incr X
Return
2)

Code: Select all

$regfile = "89C2051.DAT"
$crystal = 12000000

Config Timer0 = Timer , Gate = Internal , Mode = 1
On Timer0 brojac

Dim X As Word

Enable Timer0
Enable Interrupts

Th0 = &HFC
Tl0 = &H17
Start Timer0

Do
If X = 1000 Then
   P1.0 = Not P1.0
   X = 0
End If
Loop
End

brojac:
Th0 = &HFC
Tl0 = &H17
Incr X
Return
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Evo, nakon Bozica i Nove godine vracam se opet mikrokontrolerima.
Kao prvo, svima zelim sve najbolje! :D

Iskreno, ne padaju mi neki novi zadaci na pamet. Zato bi bilo dobro da se i drugi ukljuce sa svojim zadacima inace ovaj topic pada u vodu. Ono sto mene jos zanima vezano je za AD pretvorbu i serisku komunikaciju (npr. program za neki jednostavni IR prijemnik) ali bojim se da to vec prelazi pocetnicku razinu.

Prijedlozi?!
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by pedja089 »

Realizuj sve ovo isto sa atmelom.
http://www.elektronika.ba/forum/viewtop ... f=3&t=4260" onclick="window.open(this.href);return false;
I mozda ne bi bilo lose napraviti ovakav uvod
http://www.elektronika.ba/forum/viewtop ... f=3&t=4249" onclick="window.open(this.href);return false;
User avatar
Kizo
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 387
Joined: 01-11-2009, 22:40
Location: Hrvatska

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by Kizo »

Sve najbolje u novoj godini i puno uspješnih projekata!

@Sephiroth: 89C2051 nema ADC modul, tako da je nemoguće mjeriti napon na nekom pinu, ali zato recimo da treba odrediti položaj potenciometra se da iskombinirati da se spoji kondenzator preko tog potenciometra i onda se mjeri potrebno vrijeme da se kond napuni i/ili isprazni. Pogledaj GETRC naredbu, mada nebi smio biti neki problem sam to napisati.

IR prijemnik također nije problem, ima gotova naredba GETRC5 za RC5 protokol.

@Pedja: Takav uvod, pa i više od uvoda, bi svakako bilo dobro napraviti. Ja mogu pisati o AVR procesorima, pošto njih najbolje poznajem, ali nema ozbiljnog/ih dobrovolj(a)ca da se podjele teme, pa svaki obradi dio. Bi napravio sam da nemam nikakvih drugih obaveza, ovako ima previše toga za jednoga.
User avatar
sephiroth
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 08-10-2010, 22:08
Location: Osijek

Re: AT89C2051 - Programi za pocetnike (Bascom)

Post by sephiroth »

Meni je tesko voditi kurs kad ni sam ne znam puno o programiranju mikrokontrolera. Ja sam samo otvorio temu i dao inicijativu kako bih naucio osnove. A buduci da tema nije zazivjela, tj. ovo se sve svelo na dijalog izmedju Kize i mene, ja sam za da netko od vas znalaca preuzme. :wink:

Odnosno jos je bolje otvoriti kurs za AVR kontrolere buduci da su to kontroleri suvremenije arhitekture. Samo ja tu necu moci puno pomoci (kao sto u ostalom nisam mogao ni do sad) ali imate moju podrsku. Obecavam da cu sudjelovat u novom kursu ako nikako drugacije onda barem s pitanjima. :D
Post Reply