AT89C2051 - Programi za pocetnike (Bascom)
Moderators: pedja089, stojke369, trax, InTheStillOfTheNight
AT89C2051 - Programi za pocetnike (Bascom)
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!
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!
-
- Pravo uznapredovao :)
- Posts: 457
- Joined: 22-04-2008, 16:27
- Location: Maribor(SLO) Koprivnica(HR)
- Contact:
Re: AT89C2051 - Programi za pocetnike (Bascom)
Real Radios Glow in the Dark!
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
-
- Pravo uznapredovao :)
- Posts: 457
- Joined: 22-04-2008, 16:27
- Location: Maribor(SLO) Koprivnica(HR)
- Contact:
Re: AT89C2051 - Programi za pocetnike (Bascom)
Ja sam mislio da budeš ti taj.
Real Radios Glow in the Dark!
Re: AT89C2051 - Programi za pocetnike (Bascom)
Bilo je vec pokusaja, ali brzo se odustalo. Ja se nadam da neces odustati, pa da i ja naucim nesto novo...
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
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.
Re: AT89C2051 - Programi za pocetnike (Bascom)
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:
Evo i kako to izgleda u Bascom-AVR:
Pa u inline asembleru:
A evo i u AVR-GCC:
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:
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
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
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
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;
}
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
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
Re: AT89C2051 - Programi za pocetnike (Bascom)
Hvala na podrsci i na prvom programu!
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.
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.
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
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.
Re: AT89C2051 - Programi za pocetnike (Bascom)
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:
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
Dali su otprilike jasni pojmovi timer i interapti ili tu treba par riječi?
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
Tako i ovdje je problem da taj
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??kratki impuls (klik)
Dali su otprilike jasni pojmovi timer i interapti ili tu treba par riječi?
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
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.
Re: AT89C2051 - Programi za pocetnike (Bascom)
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: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.
To je to. Kveščns?
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
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
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
2) Napisati program koristeci timer koji ce odredjenom frekvencijom uzastopno paliti i gasiti diodu na pinu P1.0.
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).
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
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
Jedino jos nisam shvatio ovu liniju:
Set Tcon.0
Vidim da program jednako dobro radi i bez te linije (barem u simulatoru).
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
Rasipanje resursima pošto X ne prelazi 1000, dovoljna je deklaracija kao Word.
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).
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
Code: Select all
If X = 1000 Then
Re: AT89C2051 - Programi za pocetnike (Bascom)
Hvala na primjedbama! Evo i ispravljenih programa:
1)
2)
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
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
Re: AT89C2051 - Programi za pocetnike (Bascom)
Evo, nakon Bozica i Nove godine vracam se opet mikrokontrolerima.
Kao prvo, svima zelim sve najbolje!
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?!
Kao prvo, svima zelim sve najbolje!
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?!
Re: AT89C2051 - Programi za pocetnike (Bascom)
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;
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;
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
@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.
Re: AT89C2051 - Programi za pocetnike (Bascom)
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.
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.
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.