Prerušenie ATmega644p - Bascom

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
marosh555
Stály člen
Stály člen
Príspevky: 243
Dátum registrácie: 15 Júl 2007, 00:00
Bydlisko: Žilina
Vek: 34

Prerušenie ATmega644p - Bascom

Príspevok od používateľa marosh555 » 28 Mar 2012, 16:11

Zdravom Vas, zacinam sa ucit programovat AVR v jazyku Bascom avsak mam problem s jednym programom. Chcel som si na nom vyskusat prerusenie ale nefunguje to tak ako som si predstavoval :). V skratke ma ist o to ze pomocou jedneho tlacitka si prepinam dva programy pre ovladanie LED co mi ako tak funguje. Dalsie tlacitko som pouzil pre funkciu prerusenia a to mi uz nechodi a malo by to fungovat tak ze po prichode vzostupnej hrany na INT0 program skoci na podprogram P a rozsvieti niektore LED na porte B. Vedel by mi niekto pomoct kde robim chybu? Viem ze je tam kopec veci ktore by sa dali spravit jednoduhsie ale ucim sa :) Dakujem Vam a prikladam program

Kód: Vybrať všetko

'Knižnica pre výber MCU
'Nastavenie frekvencie na 8MHz
$regfile = "m644def.dat"
$crystal = 8000000

'Deklarácia portu B ako výstupu
'Deklarácia portu A ako vstupu
'Nastavenie prerušenia INT0 tak aby reagoval na vzostupnú hranu
Config Portb = Output
Config Porta = Input
Config Int0 = Falling

'Pri aktivácii prerušenia sa presuń na program PR
'Povolenie prerušenia INT0
'Povolenie Všetkých prerušení
On Int0 P
Enable Int0
Enable Interrupts

'Deklarácia premennej A ako byte
Dim A As Byte

'Nastavenie premennej A na hodnotu H00
'Nastavenie portu B na hodnotu HFF
'Nastavenie portu A na hodnotu HFF, tzn aktivácia pull-up rezistorov
A = &H00
Portb = &HFF
Porta = &HFF

'Pomenovanie PA0 na TL1
Tl1 Alias Pina.1

'Spustenie Hlavného programu P0, ktorý beží v nekonečnej slučke
P0:
Do

'Po stlačení TL1 sa presuň na program P2
If Tl1 = 0 Then
Gosub P1
End If

'Pri hodnote premennej A = 2, tzn po vykonaní programu P1, a stlačení TL1 sa presuň na program P2
'Počkaj 250ms, kvôli odstráneniu prekmitov na TL1
If Tl1 = 0 And A = 2 Then
Gosub P2
End If

Waitms 250

Loop

'Program 1: Do premennej A zapíš hodnotu 2 a následne pošli na port B hodnotu H00, počkaj 2s a pošli na port B hodnotu HFF a znova čakaj 2s a následne sa vráť do programu P0
P1:
A = 2

Portb = &H00
Wait 2
Portb = &HFF
Wait 2

Return

'Program 2: Do premennej A zapíš hodnotu 1 a následne posielaj na jednotlivé piny portu B logické úrovňe podľa zadania(vytvorenie svetelného hada), pričom po každom
'odoslaní hodnoty počkaj 1s. Nakoniec sa vráť do programu P0
P2:
A = 1

Portb = &B00000001
Wait 1
Portb = &B00000010
Wait 1
Portb = &B00000100
Wait 1
Portb = &B00001000
Wait 1
Portb = &B00010000
Wait 1
Portb = &B00100000
Wait 1
Portb = &B01000000
Wait 1
Portb = &B10000000
Wait 1
Portb = &B01000000
Wait 1
Portb = &B00100000
Wait 1
Portb = &B00010000
Wait 1
Portb = &B00001000
Wait 1
Portb = &B00000100
Wait 1
Portb = &B00000010
Wait 1
Portb = &B00000001
Wait 1
Portb = &HFF

Return

'Program prerušenia
P:
Portb = &H55
Waitms 500

Return

End
0

Používateľov profilový obrázok
jenda23
Ultimate člen
Ultimate člen
Príspevky: 5779
Dátum registrácie: 27 Jún 2008, 00:00
Bydlisko: Česká Třebová
Vek: 33
Kontaktovať používateľa:

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa jenda23 » 28 Mar 2012, 16:39

asi zapomínáš povolit globální přerušení a přerušení INT0

takže inicializace bude vypadat takhle nějak

port pro INT0=input
port pro int0=1

config INT0= falling
on int0 prerus

enable int0
enable interrupts

do
nop
loop

prerus:

waitms 20

toggle port pro LED

return

end



třeba takhle...
0
Lokomotiva je jako žena.Je jich stovky typů a každej z nich je jinej,každá z nich je svým způsobem krásná.Když jí chceš aspoň trochu poznat jsou to stovky hodin času.Nejde s ní být aniž bys jí bezmezně miloval,je nemožný jí znát do poslední skulinky

smotek7
Pokročilý člen
Pokročilý člen
Príspevky: 528
Dátum registrácie: 08 Aug 2011, 00:00
Bydlisko: PN
Vek: 44

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa smotek7 » 28 Mar 2012, 17:27

Tu inicializaciu tam ma.
Nepozeral som to detajlne, ale nema byt ten program prerusenia az za end ?
0
Nemusím vedeť váhu elektrónu ak chcem zaspájkovať tranzistor.

Používateľov profilový obrázok
jenda23
Ultimate člen
Ultimate člen
Príspevky: 5779
Dátum registrácie: 27 Jún 2008, 00:00
Bydlisko: Česká Třebová
Vek: 33
Kontaktovať používateľa:

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa jenda23 » 28 Mar 2012, 17:33

jo pardon má bejt
0
Lokomotiva je jako žena.Je jich stovky typů a každej z nich je jinej,každá z nich je svým způsobem krásná.Když jí chceš aspoň trochu poznat jsou to stovky hodin času.Nejde s ní být aniž bys jí bezmezně miloval,je nemožný jí znát do poslední skulinky

Používateľov profilový obrázok
marosh555
Stály člen
Stály člen
Príspevky: 243
Dátum registrácie: 15 Júl 2007, 00:00
Bydlisko: Žilina
Vek: 34

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa marosh555 » 28 Mar 2012, 20:26

Vsimol som si to u viacerych prikladov ale ci dam end nakoniec alebo pred program prerusenia tak vysledok je ten isty
0

Používateľov profilový obrázok
jenda23
Ultimate člen
Ultimate člen
Príspevky: 5779
Dátum registrácie: 27 Jún 2008, 00:00
Bydlisko: Česká Třebová
Vek: 33
Kontaktovať používateľa:

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa jenda23 » 28 Mar 2012, 20:30

máš na pinu pull up, ve skutečnosti? A nevidim deklarovaný sub programy a máš to celý divně zapasaný proč uvádíš hlavní program do nekonečnej smyčky když do/loop je nekonečná smyčka? A nikde nevidim ukončenou smyčku P0...
0
Lokomotiva je jako žena.Je jich stovky typů a každej z nich je jinej,každá z nich je svým způsobem krásná.Když jí chceš aspoň trochu poznat jsou to stovky hodin času.Nejde s ní být aniž bys jí bezmezně miloval,je nemožný jí znát do poslední skulinky

Používateľov profilový obrázok
marosh555
Stály člen
Stály člen
Príspevky: 243
Dátum registrácie: 15 Júl 2007, 00:00
Bydlisko: Žilina
Vek: 34

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa marosh555 » 28 Mar 2012, 20:38

pull-up tam je urcite a ako som pisal na tych programoch sa postupne ucim, v podstate tento program dookola upravujem a skusam nove prikazy a podobne takze nad tym ako je to napisane a preco je to tak sa nepozastavujte, pisal som hned v uvode ze viem o tom ze sa to da urcite spravit lepsie, prehladnejsie ale to nieje podstatou problemu. Ide mi len o to prerusenie, ten program nebude nikdy na nic konkretne pouzity :). Kazdopadne Vam ale dakujem za postrehy a cas :)
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa popopepe » 28 Mar 2012, 20:50

No, řekl bych, že tam ten interní pull-up nemáš.

Tady je správná posloupnost, pokud to nechceš řešit přímo pomocí registrů...

'INPUTS
test_button alias PINB.3
config test_button = input
portb.3 = 1 'turn on the pullup

nejdřív alias
potom input
a nakonec na něm nastavit jedničku, čímž se zapne ten pull-up. Jinak to moc nefunguje...

U OUTPUT je to jedno, tam žádný pull up není.
pozor na rozdíl PINX a PORTX.
0

Používateľov profilový obrázok
marosh555
Stály člen
Stály člen
Príspevky: 243
Dátum registrácie: 15 Júl 2007, 00:00
Bydlisko: Žilina
Vek: 34

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa marosh555 » 28 Mar 2012, 21:02

Pull-up tam urcite je, teda log.1 ktoru si dokazem odmerat co som aj spravil no moze byt naozaj problem v tej postupnosti a vtedy ked tam ma byt tam nieje. Zajtra v praci skusim to ako si napisal a dam vediet, ak by ale este niekoho neico napadlo tak sem s tym :) Dakujem
0

popopepe
Stály člen
Stály člen
Príspevky: 404
Dátum registrácie: 22 Jún 2009, 00:00

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa popopepe » 28 Mar 2012, 21:17

Otázka je, co tam vlastně naměříš :-)
Pokud si nejsi jistý, tak tam prdni externí odpor 10k k plusu, a je to :-)
0

Používateľov profilový obrázok
marosh555
Stály člen
Stály člen
Príspevky: 243
Dátum registrácie: 15 Júl 2007, 00:00
Bydlisko: Žilina
Vek: 34

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa marosh555 » 29 Mar 2012, 07:10

No podla mna by tam mala byt log.1, aspon doteraz som bol v tom ze to je pull-up a ak hovorim spravne tak ta tam skutocne je. Ten priklad vyssie som akurat skusal no vysledok je rovnaky. Vytvoril som si aj kratsi a jednoduhsi program ktory tiez nefunguje ale je aspon prehladnejsi a skor sa v nom vyznate ta pomozete mi najst v nom chybu

PS: Problem je vyrieseny, ja hlupak som si nevsimol ze na PA0 nieje INT0 ale PCINT0 takze cely problem bol len v tom ze som posielal prerusenie na iny port ako som mal. Dakujem Vam aj tak vsetkym za Vas cas a ochotu

Kód: Vybrať všetko

$regfile = "m644def.dat"
$crystal = 8000000

Tl1 Alias Pina.0
Tl2 Alias Pina.1

Config Tl1 = Input
Config Tl2 = Input
Config Portb = Output
Config Int0 = Falling

Porta.0 = 1
Porta.1 = 1
Portb = &HFF

Enable Interrupts
On Int0 P1
Enable Int0

Do
Portb = &H00
Wait 2
Portb = &HFF
Wait 2
Loop

End

P1:
Portb = &H55
Wait 5
Portb = &H00
Wait 5

Return
0

smotek7
Pokročilý člen
Pokročilý člen
Príspevky: 528
Dátum registrácie: 08 Aug 2011, 00:00
Bydlisko: PN
Vek: 44

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa smotek7 » 29 Mar 2012, 09:51

Hardverovo to mas ok ?
kam pripajas to tlacitko ? na 16 alebo 40
(PCINT26/RXD1/INT0) PD2 alebo PA0 (ADC0/PCINT0)
0
Nemusím vedeť váhu elektrónu ak chcem zaspájkovať tranzistor.

Používateľov profilový obrázok
marosh555
Stály člen
Stály člen
Príspevky: 243
Dátum registrácie: 15 Júl 2007, 00:00
Bydlisko: Žilina
Vek: 34

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa marosh555 » 29 Mar 2012, 10:27

Ano HW je ok ale problem uz je vyrieseny, vid vyssie
0

Používateľov profilový obrázok
zdeno33
Okoloidúci
Okoloidúci
Príspevky: 32
Dátum registrácie: 05 Apr 2012, 17:57
Bydlisko: Varin
Vek: 68
Kontaktovať používateľa:

Re: Prerušenie ATmega644p - Bascom

Príspevok od používateľa zdeno33 » 23 Apr 2012, 17:16

byva dobrym zvykem napisat, co ten program dela jak se jmenuje

$regfile = "m644def.dat"
$crystal = 8000000
dale je nutne definovat prostredi
$hwstack=40
$swstack=16
$framesize=32

Tl1 Alias Pina.0
Tl2 Alias Pina.1

Config Tl1 = Input
Config Tl2 = Input
Config Portb = Output

konfigurace preruseni je celkem klicova, proto je nutne to davat dohromady
Config Int0 = Falling
On Int0 P1 Nosave
Enable Int0

Config Debounce = 5 'delay cas na tlacitka

Porta.0 = 1
Porta.1 = 1
Portb = &HFF
Enable Interrupts 'povoleni globalniho preruseni MUSI byt az jako posledni instrukce v inicializaci
'-----------------------------------------------------
Do
'tlacitka maji svoji knihovnu a je to funkce
Debounce Pinb.0 , 0 , Stop1 , Sub 'priklad, podivej se do HELP

Portb = &H00
Wait 2 'wait neopouzivat, lepsi je waitms nebo waitus
Portb = &HFF
Wait 2
Loop

End

P1:
'tohle preruseni je uplne spatne a to se dela jinak.
Portb = &H55
Wait 5
Portb = &H00
Wait 5

Return
0
nikdy neříkej, že to nejde,
určite se najde blbec, který to dokáže.

Napísať odpoveď