» »

Leteče luči; AT90S2313, AT89C2051

Leteče luči; AT90S2313, AT89C2051

Mikron ::

Lep pozdrav.

Naredil sem si naslednje vezje:


Mikrokontroler AT89C2051 sem za test zamenjal z AT90S2312.

Pri programiranju sem začetnik in me zanima, kako naj napišem enostaven program, da bi za test vezje delovalo kot nekakšne leteče luči.

Nekaj sem že probaval, vendar imam problem z nastavitvijo vhodno/izhodnih spremenljivk.

Tukaj je moj testni program:

Dim D1 As Bit
Dim D2 As Bit
Dim D3 As Bit
Dim D4 As Bit
Dim D5 As Bit
Dim D6 As Bit
Dim D7 As Bit
Dim D8 As Bit
Dim D9 As Bit
Dim D10 As Bit
Dim D11 As Bit
Dim D12 As Bit
Dim D13 As Bit
Dim D14 As Bit


D1 Alias Pind.0
D2 Alias Pind.1
D3 Alias Pind.2
D4 Alias Pind.3
D5 Alias Pind.4
D6 Alias Pind.5
D7 Alias Pind.6
D8 Alias Portb.0
D9 Alias Portb.1
D10 Alias Portb.2
D11 Alias Portb.3
D12 Alias Portb.4
D13 Alias Portb.5
D14 Alias Portb.6

Config Portd = 0
Portd = 255

Config Portb = 255
Portb = 0

Do
Set D1
Waitms 100
Set D2
Waitms 100
Set D3
Waitms 100
Set D4
Waitms 100
Set D5
Waitms 100
Set D6
Waitms 100
Set D7
Waitms 100
Set D7
Waitms 100
Set D8
Waitms 100
Set D9
Waitms 100
Set D10
Waitms 100
Set D11
Waitms 100
Set D12
Waitms 100
Set D13
Waitms 100
Set D14
Waitms 100
Loop
  • zavaroval slike: Azrael ()

miko 55 ::

probaj tale program:

''''''''''''''''''''''''''''''''''''''

$regfile = "ATtiny2313.dat" 'Tip mikrokontrolerja
$crystal = 1200000 'Frekvenca kristala = 1.2 MHz

Dim N As Byte , M As Byte , Bport As Byte
Dim Dport As Byte , Cikli As Byte , Pause As Byte

Ddrb = 255 'Določitev izhodov na B portu
Ddrd = 255 'Določitev izhodov na D portu

Do 'Začetek glavne zanke
Portb = 0 'Ugasni port b. Na izhodih je "0".
Portd = 0 'Ugasni port d. Na izhodih je "0".

For N = 1 To 5 'Določi število ponovitev (5x).
Pause = 50 'Določi hitrost preklapljanja.
Cikli = 16 'Določi koliko podatkov je v tabeli.
Restore Tabela_1 'Aktiviraj 1. tabelo.
Gosub Read_data 'Izvedi cikel.
Next N

For N = 1 To 3 'Druga kombinacija (3X)
Pause = 50 'z drugačno hitrostjo,
Cikli = 16 'enakim št. ciklov
Restore Tabela_2 'in drugo tabelo
Gosub Read_data
Next N

For N = 1 To 1 'Tretja kombinacija
Pause = 50
Cikli = 16
Restore Tabela_3
Gosub Read_data
Next N

For N = 1 To 1 'Četrta kombinacija
Pause = 50
Cikli = 16
Restore Tabela_4
Gosub Read_data
Next N

'Na to mesto lahko vstavljate dodatne kombinacije, vendar
'morate tudi vpisati podatke v tabelo npr Tabela_5 itd.

Loop

End 'Konec glavne zanke

Read_data:
For M = 1 To Cikli 'Število ciklov
Read Dport
Read Bport
Portd = Dport
Portb = Bport
Waitms Pause 'Počakaj
Next M
Return

'Tabele s podatki

Tabela_1:
Data 0 , 0 , 1 , 0 , 2 , 0 , 4 , 0 , 8 , 0 , 16 , 0 , 32 , 0 , 64 , 0
Data 0 , 1 , 0 , 2 , 0 , 4 , 0 , 8 , 0 , 16 , 0 , 32 , 0 , 64 , 0 , 128

Tabela_2:
Data 0 , 128 , 0 , 64 , 0 , 32 , 0 , 16 , 0 , 8 , 0 , 4 , 0 , 2 , 0 , 1
Data 64 , 0 , 32 , 0 , 16 , 0 , 8 , 0 , 4 , 0 , 2 , 0 , 1 , 0 , 0 , 0

Tabela_3:
Data 1 , 1 , 2 , 2 , 4 , 4 , 8 , 8 , 16 , 16 , 32 , 32 , 64 , 64 , 0 , 128
Data 64 , 64 , 32 , 32 , 16 , 16 , 8 , 8 , 4 , 4 , 2 , 2 , 1 , 1 , 0 , 0

Tabela_4:
Data 0 , 1 , 64 , 2 , 32 , 4 , 16 , 8 , 8 , 16 , 4 , 32 , 2 , 64 , 1 , 128
Data 64 , 2 , 32 , 4 , 16 , 8 , 8 , 16 , 4 , 32 , 2 , 64 , 1 , 0 , 0 , 0

'Zapis si sledi v vrstnem redu DATA1 , DATA2 , DATA1...
'Število ciklov mora biti prilagojeno številu podatkov
'v tabeli, in sicer 1/2.

:D

definirane imaš porte B in D
LP
2 GOOD 2 B 4GOT10
NAJPREPROSTEJŠA RAZLAGA JE NAJVERJETNEJŠA

Zgodovina sprememb…

  • spremenil: miko 55 ()

int47 ::

Basic ni ravno moja specialnost.
Tako na prvi pogled, ti manjka del, kjer ugašaš ledice. Po prvem preletu zanke, so vse ledice prižgane in ni nič več videti.

Obstaja tudi lažja pot, pri kateri dostopaš do porta in ne do bitov. Primer je za 8 bitov.

* Potrebuješ spremenljivko stevec_pomikov.
* Potrebuješ spremenljivko tmp, ki hrani trenutno stanje izhodnih registrov.
nov_prelet:
* V spremenljivko stevec pomikov vpises vrednost 7
* V spremenljivko tmp vpišeš vrednost npr 1
zanka:
* Spremenljivko tmp vpišeš v izhodni register porta.
* Počakaš nekaj časa ( zakasnitev)
* Spremenljivko množiš z dve. ( Množenje z dve, pomeni, da se '1' v spremenljivki premakne za 1 bit v levo). Bolj učinkovita (hitrejša) varianta bi bila z uporabo pomikov. Če želiš pomik v desno, deliš z dva, oz. uporabiš pomik za 1 bit v desno.
* Če je stevec_pomikov enako 0, skoči na nov_prelet
* Stevec pomikov zmanjsaj za 1
skoci na zanka

Za 15 bitov, v stevec pomikov vpises 14, tmp pa je pred vpisom v izhodni register potrebno razbiti na MSB in LSB, ter vsakega vpisati v ustrezen izhodni register.

Zgodovina sprememb…

  • spremenil: int47 ()

int47 ::

Upostevaj tudi, da je AVR glede I/O drugačen od 8051.
8051 ima en izhodni register. Če vanj vpisuješ, spreminjaš smer in stanje I/0 pina. Branje istega registra, ti navadno vrne vrednost na portu.
AVR ima tri registre: vhodni register, smerni register in izhodni register.

Razlika je tudi v izvedbi I/O porta.
Pri 8051 visoko stanje I/O pina zagotavlja interni ali externi pull up upor, zato je tok v 'H' stanju bistveno manjši, kot ga lahko da AVR. Pri 8051 je lahko baza NPN tranzistorja vezana direktno na I/O pin uC.
Pri AVR uC je to sicer mogoče(v izhodni register vpišeš '1', nato pa pri dostopu do porta uporabljaš smerni register), ni pa priporočljivo, ker lahko zaradi programske napake kaj skuriš.

Mikron ::

Najprej hvala za odgovore.

miko 55 Program sicer deluje vendar zaradi poti od mikrokontrolerja do LED diode (ni vezano po vrsti) led diode ne utripajo pravilno. To sem ugotovil šele takrat, ko sem povečal čas preklaplanja "Pause = 50 'Določi hitrost preklapljanja.", ki je bil prekratek.
Pa še tole: "$crystal = 1200000 'Frekvenca kristala = 1.2 MHz". Pri meni je frekvenca kristala 12MHz a pol napišem $crystal = 12000000 ?

int47
"Tako na prvi pogled, ti manjka del, kjer ugašaš ledice. Po prvem preletu zanke, so vse ledice prižgane in ni nič več videti."


Ko sem to prebral sem se nasmejal svoji malomarnosti in nastal je moj, posodobljen program.
Ta program nekako deluje, vendar je problem da Led diode vezane na Portd ne gorijo.

Dim D1 As Bit
Dim D2 As Bit
Dim D3 As Bit
Dim D4 As Bit
Dim D5 As Bit
Dim D6 As Bit
Dim D7 As Bit
Dim D8 As Bit
Dim D9 As Bit
Dim D10 As Bit
Dim D11 As Bit
Dim D12 As Bit
Dim D13 As Bit
Dim D14 As Bit


D1 Alias Pind.0
D2 Alias Pind.1
D3 Alias Pind.2
D4 Alias Pind.3
D5 Alias Pind.4
D6 Alias Pind.5
D7 Alias Pind.6
D8 Alias Portb.0
D9 Alias Portb.1
D10 Alias Portb.2
D11 Alias Portb.3
D12 Alias Portb.4
D13 Alias Portb.5
D14 Alias Portb.6

Config Portd = 255
Portd = 0

Config Portb = 255
Portb = 0

Do
Set D1
waitms 100
Reset D1
Set D2
waitms 100
Reset D2
Set D3
waitms 100
Reset D3
Set D4
waitms 100
Reset D4
Set D5
waitms 100
Reset D5
Set D6
waitms 100
Reset D6
Set D7
waitms 100
Reset D7
Set D8
waitms 100
Reset D8
Set D9
waitms 100
Reset D9
Set D10
waitms 100
Reset D10
Set D11
waitms 100
Reset D11
Set D12
waitms 100
Reset D12
Set D13
waitms 100
Reset D13
Set D14
Waitms 100
Reset D14
Loop

Zgodovina sprememb…

  • spremenil: Mikron ()

Mikron ::

Podrobno sem pregledal program, ki mi ga je napisal miko 55. Pomoje bom uporabil kar tega, ker mi na njemu delujeta oba porta.
Imam vprašanje, kako naj napišem, te tabele v programu, da bodo ledice delovale takole:


Razumem da je treba vsako binarno število pretvorit v desetiško in jih potem vpisovat po vrsti. Zanima me, kako ločit port D od porta B
Če uzamem naprimer tole:
Tabela_1:
Data 0 , 0 , 1 , 0 , 2 , 0 , 4 , 0 , 8 , 0 , 16 , 0 , 32 , 0 , 64 , 0
Data 0 , 1 , 0 , 2 , 0 , 4 , 0 , 8 , 0 , 16 , 0 , 32 , 0 , 64 , 0 , 128
a je tukaj prva vrstica za port B, druga pa za port D?

Res me zelo zanima kako je s temi tabelami.

Zgodovina sprememb…

  • zavaroval slike: madviper ()

Brane2 ::

Ko takole gledam te vaše BASIC programe, se vprašam kam je šla vsa ta enostavnost, hudiča ?

BASIC naj bi bil enostaven in programi v njem glede na funkcionalnost realativno kratki.

Videt pa je, da se vsi spotikate ob "drobni tekst" v navodilih za njegovo uporabo toliko, da vam to požre vse potencialne koristi.

Drugače rečeno ta BASIC vas poskuša izolirat od low-level HW ampak vse kar doseže je to, da se potem zaj* s tem, kako je to implementirano v tem compilerju, pa še to samo v primeru, da implementacija zadovoljuje vaše želje.

S temi stvarmi se ne ukvarjam več skorajda nič, čeporav mislim da bi v dnevu ali dveh prišel spet not, vidim pa, da moji programi v strojnem jeziku ne bi bili kaj dosti daljši od tehle v basicu, če ne bi bili celo krajši. :\
On the journey of life, I chose the psycho path.

Red_Mamba ::

Config Portb = Output
Config Portd = Output

Portb = 0
Portd = 0

Dim Shft As Byte
Dim Tmp As Byte
Const Pocakaj = 5

Shift_data:
Data 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128

Shft = 0

Do
For Shft = 0 To 7
Tmp = Lookup(shft , Shift_data)
Portb = Tmp Xor &HFF
Waitms Pocakaj
Next Shft
Portb=255

For Shft = 0 To 7
Tmp = Lookup(shft , Shift_data)
Portd = Tmp Xor &HFF
Waitms Pocakaj
Next Shft
Portd = 255

For Shft = 0 To 7
Tmp = Shft Xor 7
Tmp = Lookup(tmp , Shift_data)
Portd = Tmp Xor &HFF
Waitms Pocakaj
Next Shft
Portd = 255

For Shft = 0 To 7
Tmp = Shft Xor 7
Tmp = Lookup(tmp , Shift_data)
Portb = Tmp Xor &HFF
Waitms Pocakaj
Next Shft
Portb = 255
Loop

Try this 0:)
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

Mikron ::

Pri programu od Red_Mamba vse led diode gorijo potem pa se ena ugaša. Program ne deluje po zgornji tabeli.

miko 55 ::

V tabeli bi moral med vsako številko dodati še ničlo pa bi se morale ugašati LED-ice
LP
2 GOOD 2 B 4GOT10
NAJPREPROSTEJŠA RAZLAGA JE NAJVERJETNEJŠA

Mikron ::

Še ena tabela, kako naj moje vezje deluje.

Ko se vsi koraki izvedejo (od 1. do 27.) se mora program vrnat na začetek in se brez prestanka ponavljat "Loop"

Zgodovina sprememb…

  • zavaroval slike: madviper ()

Mikron ::

Hvala, za odgovore.
Program sem uspel pripeljati do konca, tako da zdaj dela. Rej je, da bi lahko bil krajši, ampak na samem delujočem vezju se ne vidi kakšen je program:)) .

No pa še delujoči program:

Config Portb = Output
Config Portd = Output

Portb = 0
Portd = 0

Do
Portd = 2
Waitms 200
Portd = 0
Portd = 1
Waitms 200
Portd = 0
Portd = 4
Waitms 200
Portd = 0
Portd = 8
Waitms 200
Portd = 0
Portd = 16
Waitms 200
Portd = 0
Portd = 32
Waitms 200
Portd = 0
Portd = 64
Waitms 200
Portd = 0
Portb = 1
Waitms 200
Portb = 0
Portb = 2
Waitms 200
Portb = 0
Portb = 4
Waitms 200
Portb = 0
Portb = 64
Waitms 200
Portb = 0
Portb = 32
Waitms 200
Portb = 0
Portb = 16
Waitms 200
Portb = 0
Portb = 8
Waitms 200
Portb = 0
'obrat'
Portb = 16
Waitms 200
Portb = 0
Portb = 32
Waitms 200
Portb = 0
Portb = 64
Waitms 200
Portb = 0
Portb = 4
Waitms 200
Portb = 0
Portb = 2
Waitms 200
Portb = 0
Portb = 1
Waitms 200
Portb = 0
Portd = 64
Waitms 200
Portd = 0
Portd = 32
Waitms 200
Portd = 0
Portd = 16
Waitms 200
Portd = 0
Portd = 8
Waitms 200
Portd = 0
Portd = 4
Waitms 200
Portd = 0
Portd = 1
Waitms 200
Portd = 0
Portd = 2
Waitms 200
Portd = 0
Loop

Red_Mamba ::

no daj da ti podprem lenobo :D

zamenjaj
Portd = Tmp Xor &HFF
Portb = Tmp Xor &HFF

z

Portd = Tmp
Portb = Tmp

ter

Portd = 255
Portb = 255

z

Portd = 0
Portb = 0


in če boš takšne programe pisal kot je tvoj zgornji se že zdaj križam in molim zate
malo ga le izpili in se ob tem še kaj nauči :)
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Bascom AVR

Oddelek: Programiranje
61012 (830) listje123
»

Branje vhoda, posamezen bit

Oddelek: Elektrotehnika in elektronika
6681 (510) mirch
»

Microchip MPLAB icd 2 (pic16f876a)

Oddelek: Programiranje
111179 (1056) Highlag
»

PIC18F4550 in ds18s20

Oddelek: Elektrotehnika in elektronika
191992 (1671) snow
»

programiranje PIC..c++ ali zbirnik?

Oddelek: Programiranje
61723 (1615) Highlag

Več podobnih tem