www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

ATmega8 in prekinitve

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Sirij
Član
Član



Pridružen-a: Pon 21 Jan 2013 17:14
Prispevkov: 48
Aktiv.: 0.35
Kraj: Središče ob Dravi

PrispevekObjavljeno: Sob Jan 31, 2015 5:37 pm    Naslov sporočila:  ATmega8 in prekinitve Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Član
Član



Pridružen-a: Sre 03 Mar 2004 21:35
Prispevkov: 561
Aktiv.: 2.53
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 31, 2015 5:52 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sirij
Član
Član



Pridružen-a: Pon 21 Jan 2013 17:14
Prispevkov: 48
Aktiv.: 0.35
Kraj: Središče ob Dravi

PrispevekObjavljeno: Sob Jan 31, 2015 8:10 pm    Naslov sporočila:   Odgovori s citatom

(Š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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Član
Član



Pridružen-a: Sre 03 Mar 2004 21:35
Prispevkov: 561
Aktiv.: 2.53
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 31, 2015 9:07 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Ned Feb 01, 2015 6:59 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1234
Aktiv.: 6.09
Kraj: KOPER

PrispevekObjavljeno: Ned Feb 01, 2015 8:41 pm    Naslov sporočila:   Odgovori s citatom

za merjenje hitrosti lahko uporabiš tudi To in T1.
_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sirij
Član
Član



Pridružen-a: Pon 21 Jan 2013 17:14
Prispevkov: 48
Aktiv.: 0.35
Kraj: Središče ob Dravi

PrispevekObjavljeno: Ned Feb 01, 2015 8:46 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group