hmm tak jak pisałem bawię się w bascomie dopiero miesiąc
czyli gdzie i jak to wsadzić ?
próbowałem jużtakie opcje i nic
Gicr = &B11100000
lub
Set Mcusr.6
lub
Mcucsr = &B01000000
i też nic to nie dało przerwanie nie chodzi
sterownik na procku...
-
- Specjalista poziom 2 (min. 300)
- Posty w temacie: 10
- Posty: 346
- Rejestracja: 07 cze 2004, 13:11
- Lokalizacja: Bielsko-Biała
- Kontakt:
Problem tkwi chyba w samym Bascomie. Według opisu (datasheed) wektor dla przerwania INT2 powinien znajdować się pod adresem 0x012.
…
.equ I2Caddr =$011 ; Irq. vector address for Inter Intergrated Circuit interface
.equ INT2addr=$012 ;External Interrupt2 Vector Address << !!!!!!!!!!!!!
.equ OC0addr =$013 ;Output Compare0 Interrupt Vector Address
…
Natomiast po dekompilacji program wygląda tak:
…
+00000012: 9518 RETI Interrupt return << tu powinien być adres dla INT2
+00000013: C125 RJMP +0x0125 Relative jump << a jest tu !!!!!!
+00000014: 9518 RETI Interrupt return
…
Po wprowadzeniu do programu takiej poprawki:
...
On Int0 Krokx Nosave 'procedura obsługi 0 przrwania
On Int1 Kroky Nosave 'procedura obsługi 1 przrwania
On Int2 Krokz Nosave 'procedura obsługi 2 przrwania
On I2c Krokz Nosave << dodana linia
...
Efekt:
...
+00000011: 9518 RETI Interrupt return
+00000012: C126 RJMP +0x0126 Relative jump
+00000013: C125 RJMP +0x0125 Relative jump
+00000014: 9518 RETI Interrupt return
...
Po tej zmianie podczas symulacji przerwanie INT2 działa poprawnie. Dziwne???
…
.equ I2Caddr =$011 ; Irq. vector address for Inter Intergrated Circuit interface
.equ INT2addr=$012 ;External Interrupt2 Vector Address << !!!!!!!!!!!!!
.equ OC0addr =$013 ;Output Compare0 Interrupt Vector Address
…
Natomiast po dekompilacji program wygląda tak:
…
+00000012: 9518 RETI Interrupt return << tu powinien być adres dla INT2
+00000013: C125 RJMP +0x0125 Relative jump << a jest tu !!!!!!
+00000014: 9518 RETI Interrupt return
…
Po wprowadzeniu do programu takiej poprawki:
...
On Int0 Krokx Nosave 'procedura obsługi 0 przrwania
On Int1 Kroky Nosave 'procedura obsługi 1 przrwania
On Int2 Krokz Nosave 'procedura obsługi 2 przrwania
On I2c Krokz Nosave << dodana linia
...
Efekt:
...
+00000011: 9518 RETI Interrupt return
+00000012: C126 RJMP +0x0126 Relative jump
+00000013: C125 RJMP +0x0125 Relative jump
+00000014: 9518 RETI Interrupt return
...
Po tej zmianie podczas symulacji przerwanie INT2 działa poprawnie. Dziwne???
-
- Czytelnik forum poziom 1 (min. 10)
- Posty w temacie: 7
- Posty: 17
- Rejestracja: 22 lip 2004, 16:29
- Lokalizacja: KrakĂłw
-
- Nowy użytkownik, używaj wyszukiwarki
- Posty w temacie: 1
- Posty: 8
- Rejestracja: 11 sie 2006, 18:12
- Lokalizacja: Ruda Śląska
Zastanawiające
Mam pytanie: Chciałem dokładnie taki sam układ zrobić, również programowany w Bascomie, korzystajćac z przerwań, ale naunął mi się jeden problem, który widzę, że u Ciebie też nie został unieknięty... Mianowicie: podprogram obsługi przerwania trwa pewien czas... i co jeżeli w tym czasie zostanie wygenerowany impuls z komputera... (pewnie w odpowiedzi dostanę informację, że prodprogram trwa bardzo krótko i napewno się skończy, zanim przyjdzie inny impuls ) Ale nasuwa się kolejne, inne pytanie, co jeżeli na porcie pojawią się dwa impulsy do sterowania dwoma osiami - przecież dwa podprogramy nie mogą być w jednym momencie realizowane, tym bardziej, że w środku podprogramów jesr disable interputs.... ??
Jeżleli odpowiedź jedt trywialna, to proszę i tak na to odpowiedzieć, gdyż nie jestem elektronikiem a mechanikiem i przyznaję się do mojej niewiedzy z pewnych zakresów...
Jeżleli odpowiedź jedt trywialna, to proszę i tak na to odpowiedzieć, gdyż nie jestem elektronikiem a mechanikiem i przyznaję się do mojej niewiedzy z pewnych zakresów...
-
- Lider FORUM (min. 2000)
- Posty w temacie: 1
- Posty: 4017
- Rejestracja: 15 lis 2006, 22:01
- Lokalizacja: Tarnobrzeg
olo_ak oczywiście ma rację, powiem więcej - w jednym czasie pojawią się sygnały sterujące wszystkimi trzema osiami!
Problem jak zwykle można rozwiązać, w tym przypadku niewielkim kosztem.
Wszystkie procesory posiadające sprzętowe przerwania, mają odpowiednie rejestry sterujące nimi. Jest to rejestr maski przerwań oraz rejestr priorytetu.
Usuwamy z listingu "disable interrups", ustawiamy właściwy poziom priorytetów dla wejść (przerywających - generujących przerwanie) STEP poszczególnych osi i... to wszystko, jeśli chodzi o sterownik.
Pozostaje sprawa "właściwego" poinformowania programu sterującego. Należy wyliczyć czas obsługi przerwania jednej osi i pomnożyć go przez ilość osi. Obliczona wartość będzie stanowiła minimalny okres, w którym PC może wysłać sygnał sterujący, jednoczesny do wszystkich osi.
To jest koszt, o którym pisałem na początku - sterownik będzie działał (dla x, y, z) 3 razy wolniej niż zbudowany z odrębnych układów.
Problem jak zwykle można rozwiązać, w tym przypadku niewielkim kosztem.
Wszystkie procesory posiadające sprzętowe przerwania, mają odpowiednie rejestry sterujące nimi. Jest to rejestr maski przerwań oraz rejestr priorytetu.
Usuwamy z listingu "disable interrups", ustawiamy właściwy poziom priorytetów dla wejść (przerywających - generujących przerwanie) STEP poszczególnych osi i... to wszystko, jeśli chodzi o sterownik.
Pozostaje sprawa "właściwego" poinformowania programu sterującego. Należy wyliczyć czas obsługi przerwania jednej osi i pomnożyć go przez ilość osi. Obliczona wartość będzie stanowiła minimalny okres, w którym PC może wysłać sygnał sterujący, jednoczesny do wszystkich osi.
To jest koszt, o którym pisałem na początku - sterownik będzie działał (dla x, y, z) 3 razy wolniej niż zbudowany z odrębnych układów.