|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Sirij Član
Pridružen-a: Pon 21 Jan 2013 17:14 Prispevkov: 48 Aktiv.: 0.35 Kraj: Središče ob Dravi
|
Objavljeno: Sob Jan 31, 2015 5:37 pm Naslov sporočila: ATmega8 in prekinitve |
|
|
Malo se ukvarjam z ATmega8 in sem ugotovil, da mi je zmanjkalo interuptov. INT0 in INT1 sem že uporabil, ugotovil pa sem, da bi potreboval še vsaj en interupt, ATmega8 pa ne podpira pin change interuptov. Obstaja kakšen trik, s katerim bi rešil zadevo, ali je edina rešitev nakup ATmega88?
Lep pozdrav,
Mitja |
|
Nazaj na vrh |
|
|
Vlado Član
Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 561 Aktiv.: 2.52 Kraj: Ljubljana
|
Objavljeno: Sob Jan 31, 2015 5:52 pm Naslov sporočila: |
|
|
Kaj če bi zaupal malo več podatkov, za kaj uporabljaš prekinitve?
Ali lahko uporabiš zunanjo prekinitev timer-ja?
Drugače pa lahko uporabiš eno prekinitev, na ta pin prek dveh diod pripelješ dva signala (z dveh pinov) in v prekinitvi preverjaš na katerem pinu je prišlo do spremembe stanja.
LP |
|
Nazaj na vrh |
|
|
Sirij Član
Pridružen-a: Pon 21 Jan 2013 17:14 Prispevkov: 48 Aktiv.: 0.35 Kraj: Središče ob Dravi
|
Objavljeno: Sob Jan 31, 2015 8:10 pm Naslov sporočila: |
|
|
(Še vedno) izdelujem ta projekt.
http://www.elektronik.si/phpBB2/viewtopic.php?t=41829&highlight=
Shemo sem od zadnje objave v tisti temi predelal.
Program deluje tako. V glavni zanki se odvija subrutina sledenje, ki poganja koračni motor s stalno hitrostjo (sledenje zvezdam). INT0 uporabljam za premik motorja pri višji hitrosti v eno smer, INT1 pa za premik v drugo smer. Tretji interupt pa bi uporabil za spreminjanje hitrosti, vendar mi je zmanjkal. Trenutno preverjam pritisnjenost tipke z debounce za subrutino sledenje, kar pomeni, da se mora najprej izvesti celotna subrutina, kar lahko traja tudi dve sekundi, to pa pomeni, da se tipka preverja vsake dve sekundi. Zato potrebujem interupt. Sicer deluje tudi brez, vendar je manj praktično.
Koda: |
$crystal = 800000
$regfile = "m8adef.dat"
$hwstack = 32
$swstack = 8
$framesize = 32
'Config Clockdiv = 1
Dim Premor1 As Integer , Premor2 As Integer , Hitrost As Byte ,
____________________________
'konfiguracija RA stepperja
Config Portd.5 = Output
Portd.5 = 1
St_ra_a Alias Portd.5
Config Portd.6 = Output
Portd.6 = 1
St_ra_b Alias Portd.6
Config Portd.7 = Output
Portd.7 = 1
St_ra_c Alias Portd.7
Config Portb.0 = Output
Portb.0 = 1
St_ra_d Alias Portb.0
'____________________________________________________
'konfiguracija TIPK
Config Pind.2 = Input
Portd.2 = 1
T_ra1 Alias Pind.2
Config Pind.3 = Input
Portd.3 = 1
T_ra2 Alias Pind.3
Config Pind.4 = Input
Portd.4 = 1
T_hitrost Alias Pind.4
'____________________________________________________
'konfiguracija output za LED displej , indeksi a, b, c, d so inputi na 4511
Config Portc.4 = Output
Portc.4 = 1
Led_d Alias Portc.4
Config Portc.5 = Output
Portc.5 = 1
Led_a Alias Portc.5
Config Portb.1 = Output
Portb.1 = 1
Led_c Alias Portb.1
Config Portb.2 = Output
Portb.2 = 1
Led_b Alias Portb.2
Config Int0 = Change
On Int0 Int0_sub 'skoči v int0_sub
Config Int1 = Change
On Int1 Int1_sub
Enable Int0
Enable Int1
Enable Interrupts
Premor1 = 523
Hitrost = 1
Do
Gosub Led_sub 'na led displeju izpiše vrednost hitrosti
Gosub Sledenje
Debounce T_hitrost , 0 , Hitrost_sub , Sub
Loop
Sledenje:
'sledenje v polovičnem koraku
St_ra_a = 0
Waitms Premor1
St_ra_a = 1
St_ra_a = 0
St_ra_c = 0
Waitms Premor1
St_ra_a = 1
St_ra_c = 1
St_ra_c = 0
Waitms Premor1
St_ra_c = 1
St_ra_c = 0
St_ra_b = 0
Waitms Premor1
St_ra_c = 1
St_ra_b = 1
St_ra_b = 0
Waitms Premor1
St_ra_b = 1
St_ra_b = 0
St_ra_d = 0
Waitms Premor1
St_ra_b = 1
St_ra_d = 1
St_ra_d = 0
Waitms Premor1
St_ra_d = 1
St_ra_d = 0
St_ra_a = 0
Waitms Premor1
St_ra_d = 1
St_ra_a = 1
Return
Int0_sub:
Debounce T_ra1 , 0 , Ra_smer1 , Sub ' ko je sprožen interupt, skoči sem in preveri, če je ptirisnjena tipka.Če je, gre v ra_smer1.
Return
Int1_sub:
Debounce T_ra2 , 0 , Ra_smer2 , Sub
Return
Ra_smer1:
Waitms 25
While T_ra1 = 0
St_ra_a = 0
Waitms Premor2
St_ra_a = 1
St_ra_c = 0
Waitms Premor2
St_ra_c = 1
St_ra_b = 0
Waitms Premor2
St_ra_b = 1
St_ra_d = 0
Waitms Premor2
St_ra_d = 1
Wend
Return
Ra_smer2:
Waitms 25
While T_ra2 = 0
St_ra_d = 0
Waitms Premor2
St_ra_d = 1
St_ra_b = 0
Waitms Premor2
St_ra_b = 1
St_ra_c = 0
Waitms Premor2
St_ra_c = 1
St_ra_a = 0
Waitms Premor2
St_ra_a = 1
Wend
Return
Hitrost_sub:
Hitrost = Hitrost + 1
If Hitrost > 9 Then
Hitrost = 1
Premor2 = Premor1 * 1 ' določitev hitrosti pri premikanju teleskopa ' ko števec hitrost pride do 9, se števec hitrost nastavi na 1
Else
' določitev hitrosti pri premikanju teleskopa
Select Case Hitrost
Case 1 : Premor2 = Premor1
Case 2 : Premor2 = Premor1 / 8
Case 3 : Premor2 = Premor1 / 16
Case 4 : Premor2 = Premor1 / 32
Case 5 : Premor2 = Premor1 / 64
Case 6 : Premor2 = Premor1 / 128
Case 7 : Premor2 = Premor1 / 256
Case 8 : Premor2 = Premor1 / 512
Case 9 : Premor2 = Premor1 / 800
End Select
End If
Return
Led_sub:
Select Case Hitrost
Case 1 : Gosub St1
Case 2 : Gosub St2
Case 3 : Gosub St3
Case 4 : Gosub St4
Case 5 : Gosub St5
Case 6 : Gosub St6
Case 7 : Gosub St7
Case 8 : Gosub St8
Case 9 : Gosub St9
Case Else : Gosub St0 'izpiše se 0
End Select
Return
St1:
Led_a = 1
Led_b = 0
Led_c = 0
Led_d = 0
Return
St2:
Led_a = 0
Led_b = 1
Led_c = 0
Led_d = 0
Return
St3:
Led_a = 1
Led_b = 1
Led_c = 0
Led_d = 0
Return
St4:
Led_a = 0
Led_b = 0
Led_c = 1
Led_d = 0
Return A
St5:
Led_a = 1
Led_b = 0
Led_c = 1
Led_d = 0
Return
St6:
Led_a = 0
Led_b = 1
Led_c = 1
Led_d = 0
Return
St7:
Led_a = 1
Led_b = 1
Led_c = 1
Led_d = 0
Return
St8:
Led_a = 0
Led_b = 0
Led_c = 0
Led_d = 1
Return
St9:
Led_a = 1
Led_b = 0
Led_c = 0
Led_d = 1
Return
St0:
Led_a = 0
Led_b = 0
Led_c = 0
Led_d = 0
Return |
|
|
Nazaj na vrh |
|
|
Vlado Član
Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 561 Aktiv.: 2.52 Kraj: Ljubljana
|
Objavljeno: Sob Jan 31, 2015 9:07 pm Naslov sporočila: |
|
|
Ne vem zakaj uporabljaš toliko ukazov Waitms.
To ni najbolj praktično glede na to da bi rad imel hiter program.
Zakaj imaš prekinitev postavljeno na CHANGE, na ta način imaš prekinitev ob pritisku in ob spustu tipke. Pa ne misliti da procesor takoj skoči na prekinitev, pred tem opravi še kaj drugega.
Svetujem ti da Sub Sledenje, namesto z uporabo waitms narediš s timerjem, potem ti bo v glavni zanki zadostoval tudi debounce.
Tako kot imaš zdaj se za čas izvajanja prekinitve motor ustavi, če boš to naredil s timerjem bo šel naprej in upošteval spremembe.
LP |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3353 Aktiv.: 16.96
|
Objavljeno: Ned Feb 01, 2015 6:59 pm Naslov sporočila: |
|
|
Sicer ne poznam Bascoma, ampak če ti je "zmanjkalo prekinitev" pri tako "enostavnem" programu, boš moral od začetka zastavit drugače.
Mislim pa da vsi manjši do večji Atmeli imajo pin change interrupt. Beri PDF |
|
Nazaj na vrh |
|
|
rudiP Član
Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1234 Aktiv.: 6.07 Kraj: KOPER
|
Objavljeno: Ned Feb 01, 2015 8:41 pm Naslov sporočila: |
|
|
za merjenje hitrosti lahko uporabiš tudi To in T1. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
|
Sirij Član
Pridružen-a: Pon 21 Jan 2013 17:14 Prispevkov: 48 Aktiv.: 0.35 Kraj: Središče ob Dravi
|
Objavljeno: Ned Feb 01, 2015 8:46 pm Naslov sporočila: |
|
|
Vilko,
ukaze waitms sem uporabil, ker drugače nisem vedel. Sedaj sem nekaj poskušal s časovniki, pa ne vem, če sem se sploh dobro lotil. Skratka, ideja je, da počaka določen čas, nato skoči v subrutino sledenje, kjer začne prvi korak, potem timer zopet počaka določen čas, skoči v sledenje, prekine prvi korak in začne drugi in tako dalje. Je takšna logika dobra?
Koda: |
Dim N_koraka As Byte
N_koraka = 1
Const Timer1reload = 3124
Config Timer1 = Timer , Prescale = 256
load timer1 , Timer1Reload
On Ovf1 Sledenje
enable timer1
start timer1
enable interrupts
'Add your code here
'Timer value explination
' The timer is a 16Bit timer, it overflows when the timer reaches 65536
' The AVR is running at 8000000Hz, the prescaler is 64
' Each tick is 0,008 ms - (1 / CPUSpeed in KHz ) * Prescaler
' The timer needs 12500 ticks to reach the required time ( 12500 * 0,008 = 100ms)
' The start value for the timer must be set to 53036 so that it will overflow at 65536 after 12500 ticks
' NOTE: The load command does the inversion for you (256-value or 65536-value)
Sledenje:
load timer1, Timer1Reload
Select Case N_koraka
Case 1 : St_ra_d = 1 ' prekine prejšnji korak
St_ra_a = 1
St_ra_a = 0 'začne novi korak
N_koraka = 2
Case 2 : St_ra_a = 1
St_ra_a = 0
St_ra_c = 0
N_koraka = 3
Case 3 : St_ra_a = 1
St_ra_c = 1
St_ra_c = 0
N_koraka = 4
Case 4 : St_ra_c = 1
St_ra_c = 0
St_ra_b = 0
N_koraka = 5
Case 5: St_ra_c = 1
St_ra_b = 1
St_ra_b = 0
N_koraka = 6
Case 6 : St_ra_b = 1
St_ra_b = 0
St_ra_d = 0
N_koraka = 7
Case 7 : St_ra_b = 1
St_ra_d = 1
St_ra_d = 0
N_koraka = 8
Case 8 : St_ra_d = 1
St_ra_d = 0
St_ra_a = 0
N_koraka = 1
End Select
Return
|
|
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|