Fórum témák
» Több friss téma |
Fórum » Bascom-AVR
Azt tudom, hogy timer-t kell beállítani. Az elgondolásom, hogy egy változó értéke 1 mp-enként 1-re billenne. Azt felhasználnám belső számlálóban ill. kiíratnám.
De azt sem tudom, hogy jól gondolom-e ?
Nem igazán érthető mit szeretnél. Mi fogja az 1 -ről elváltoztatni a változót, hogy újra 1-re kelljen állítani? Lehet ha azt mondanád mihez kell, jobban tudnánk ötletelni.
Sejtettem, hogy nem érthető.
Készítettem egy visszaszámláló áramkört atmega8-al. 3 multiplexelt 7 szegmenses kijelzőt hajt meg. Ha megnyomom a gombot akkor visszaszámol 3:00-tól és kikapcsolja a relét. Megy is, de egy oszcihoz kötött egy-másodperces időalapot szeretném hozzá rendelni a programhoz. Most x=x+1 :if x=102 then ....de ez így nem jó ! Megy de nem pontos, és hiába variálok a ciklusokban össze vissza jár. 10perc alatt +- 10mp a hiba.
Mondjuk így sem értem mi szerepe lenne egy változónak, de ha arra figyelsz, úgy lesz megírva a program, hogy minden ciklus azonos ideig tartson, a fő do loop -ban, akkor csak egy késleltetéssel ki kell egészíteni egy mp-re. Ez lehet wait, vagy üres ciklus, egy üres for next-el elég pontosan lehet időzíteni, csinálsz egy próbát, és vissza kell arányosítani, tehát ha pl. egy 1000 -es ciklus 10%-ot téved, akkor át kell írni 900-ra és jó lesz.
Igen, így ügyeskednék. De már abban sem vagyok biztos, hogy az online stopper jól mér.
Én úgy szoktam hogy :
Waitms 1000 Így vár 1000 ms-ot (1 másodperc). Persze az 1000 helyett lehet használni változót is.
Új kérdés : a bascom tud gyököt vonni valahogy? Pitagoras tételt akarom alkalmazni.
Köszönöm a gyors választ otthon kipróbálom.
Üdv!
Egy program fejlesztésénél elakadtam a megszakításokkal. Atmega328 (Arduino nano) D12 lábának változását PCINT el figyelem. A főprogram végzi a dolgát. Ha a megszakítás bekövetkezik és elvégezte feladatát, vissza kellene ugrani a program elejére, nem pedig a megszakítás hívásának helyére. Próbáltam kigotozni belőle de nem lett jó, és gondolom nem is ez a korrekt megoldás. Van esetleg valakinek ötlete?
Indítsd el a Watchdog-ot, az majd resetel.
A megszakítás-kezelés utolsó utasítása legyen egy Reset utasítás.
A megszakítás így működik, oda ugrik vissza ahonnan elugrott a megszakítás kezelő rutinba. Ezzel nem tudsz semmit csinálni, és ez így van jól. Amit az előttem szólók írtak, az tulajdonképpen megoldja a problémádat, mert reseteli a processzort, tehát garantáltan elölről indul a program, de ennek egyrészt vannak mellékhatásai, másrészt ha te a szakmailag korrekt megoldást keresed, akkor ez biztos nem az... Ezt úgy szokták, hogy a megszakításban beállítasz egy változót, amit a főprogramban vizsgálsz, és az alapján oda ugrasz ahova kell.
Jelenleg így üzemel. A megszakítás végén elmenti a belső eepromba a szükséges változókat, wdt 16ms re állítva elindít és utána egy végtelen ciklus. 16ms után resetel, betölti az eepromból a változók értékét. Sajnos így folyamatosan "koptatja" az eepromot.
Olyan Reset utasítást nem találtam ami az avrt resetelné, arra használom most a wdt t. (Feltéve ha erre gondoltál).
Ha kicsit bővebben leírnád mi a cél, többet tudnánk segíteni.
Jelenleg elég inkorrekt a megoldásom, főleg eeprom terén. A főprogram nagyon hosszú, kb 3 másodperc alatt ér körbe. Ha az elején esik be a megszakítás, ez nagyon hosszú reakció idő.
A program még több darabra van bontva az egyes részek tesztelése miatt, ezért nem tettem be forrást. A főprogram WS2812 legeket vezérel (többféle effekt egymás után). Az arduino egy rádió vevővel van összekötve, a dekódolás kívül történik, 4 adatbit és "jött adat" jel kerül csak be az Atmegába. Alapból a fényeffektek mennek de a távirányítóval vezérlek motorokat is. Fontos, hogy a gomb megnyomásakor a motor azonnal menjen. Amíg nyomom a gombot jön "jött adat" jel, addig megy a motor. A fény ilyenkor nem érdekes. Ha a gombot elengedem vissza kell ugrami a program elejére mert 2 adatvonal binárisan van kezelve és 0-3 értéke lehet. Ettől függően változik a további működés.
Amikor elengeded a gombot, a szükséges változókat és/vagy kimeneteket átírod és mehet minden tovább. Vagy nem?
Többféle effekt van amit kombinálni is kell. Először a várakozások helyett "Jött adat" jel figyelést tettem ciklusban. Ez működött ha viszonylag hosszú ideig volt "jött adat jel". Sajnos így előfordult, hogy mire ránéztem a bemenetre más nem volt meg és elmaradt a motor indítás vagy más fontos művelet. Ezért került a képbe a megszakítás.
A gomb elengedésekor több dolog is következhet (ha változik a 4 adatvonal akkor is elmegy a jel egy pillanatra). Előfordulhat, hogy a főprogram elején beesik egy megszakítás és indul az 1. motor. Ha megszűnik a jel, már egy másik fényeffektre van szükség. A program ilyenkor visszatér a megszakítás hívás helyére, befejezi a főprogramot (a hibás fénnyel) kiolvassa az effektszám változót és utána kezdi a jó effektet. Ideális esetben a gomb elengedése után azonnal a jót kezdené.
Volna esetleg valakinek linkje, ahol egy tankönyvszerűt találhatnék BASCOM -ról?
tutorial-bascom-avr.pdf
A hozzászólás módosítva: Nov 2, 2021
Köszönöm szépen a linkeket.
Vagy például ez is jó
Ma egész nap keresgéltem és megtaláltam ennek az eredetijét.
Ha jól tippelem, teljes terjedelmében. Mert hát ez csak egy rész és forrás megjelölése nélkül.
Én is azt kerestem. Jöhetne a linkje is!?
Akár üzenetként a nevemre kattintva A hozzászólás módosítva: Nov 2, 2021
|
Bejelentkezés
Hirdetés |