Fórum témák
» Több friss téma |
WinAVR / GCC alapszabályok: 1. Ha ISR-ben használsz globális változót, az legyen "volatile" 2. Soha ne érjen véget a main() függvény 3. UART/USART hibák 99,9% a rossz órajel miatt van 4. Kerüld el a -O0 optimalizációs beállítást minden áron 5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás 6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et Bővebben: AVR-libc FAQ
Egyébként ez egy gsm modemmel való kommunikációra van. Annyira rájöttem hogy valószínűleg összeakad amikor küld és fogad egyszerre, mert ha a szoftveres flow controlt bekapcsolom, akkor 2-3szor működik, de utána már megint nem, míg újra nem indítom a modemet.
Humm... ezzel foglalkoztam én is 1-2 hete. Viszont nem emlékszem a target board feszültségének mérésére egy általam látott kapcsoláson sem. Tudnál példát mutatni rá?
Hali
AVR-rel és assembly programozással kapcsoaltban lenne kérdésem, szerintem ide illik legjobban a kérdés :S 8051-es mikrokontrollerről van szó. 2 programot akarnék megírni. Tehát az egyik egy olyan programamely a nyomógombsor alsó 3 gombjához hozzárendeli a bináris szám helyiértékeit, és a gombok lenyomásának lehetséges kombinációinál a megfelelő LED világít. A LED-sor címe az XDATA memória 0C001H címe és a megfelelő LED 0 vezérlésre világít, továbbá a nyomógombsor címe pedig az XDATA: 0C000H és a nyomógomb lenyomásakor ad 0 értéket. 8db LED és 8db nyomógomb van. (ha a gomb le van nyomva, akkor 0-át jelez, a LED pedig akkor világít ha 0-án van) A LEDsor és nyomógombok címei, és működése ugyanúgy érvényesek a következő programban is, de itt azt akarnám elérni, hogy a középső gomb lenyomásakor a P1 prthoz csatlakoztatott nyomógombsor beállított értékét írja ki a V1 változóba, felengedéskor pedig a V2 változóba. A gomb felengedése után pedig a LED-soron binárisan jelenjen meg a V1-V2 különbság abszolút értéke. Már rengeteget agyaltam rajta, de nem tudom megírni. Ha tudtok kérlek segítsetek! Előre is köszi a választ.
Sziasztok!
Készítettem egy LED-es futófényt( potméter tekerésére gyorsul), de sajnos az ADC mérés nem tud mindig lépést tartani a potméter tekerésével emiatt sokszor lefagy és ilyenkor mindig muszáj vagyok hardveresen resetelni az AVR-t( a reset lábat földre húzni).Azt szeretném kérdezni, hogy létezik-e olyan megoldás ami ezt szoftveresen megtenné?Azt hiszem, hogy a watchdog timer pont erre való vagy nem? Mert van olyan fuse, hogy watchdog on azt kellene bepipálni? Mert eddig nem nagyon mertem a fuse-kal kisérletezni. köszi mindenkinek.
Hogy erted, hogy nem tud lepest tartani? Az adc ben van sample hold. Tehat ha te olyan gyorsan tekergeted, hogy az adc muvelet elejen mashol allt mint a vegen, akkorsem lenne gond. De elarulok egy titkot: Nincsenek stabil feszultsegek. A logikadbol kiindulva minden adc muveletnek kifagyassal kellene vegzodnie.
Forraskodot kerunk. Kodolasi hiba okozza a fagyast.
ADC bemeneten levo gyors valtozastol nem fagy ki. Ez programozasi hiba lesz.
Hat, ezek eleg egyszeru feladatok, ugyhogy valoszinuleg neked nem is a 8051-el van problemad, hanem az ASM programozassal. Hogy esetleg fejlodj is, a kozvetlen megoldas odaadasa helyett inkabb azt javaslom, hogy az altalad leirt feladatot probald meg pszeudokodkent leirni es ha abban hiba van, akkor szolok. Aztan mehet a kovetkezo lepes.
Úgy értem, hogy ha elkezdem a potmétert tekerni a futófény csak később fog változni(kivéve ha nagyon lassan tekerem).
Íme a kód:
Mi a jó fenét keres a main-ban az adc meg a szünet függvénye? Függvényt írsz függvénybe? Ezeket a main-en kívülre kellene rakni és nem a főprogramba.
Azt hiszem értem a problémád.
A gond itt rejlik:
Tartasz egy jó nagy delayt. Amíg ezen a kettőn nem lép túl a program, addig nem olvassa be az új adc értéket. Ergo: nem is fog reagálni a potméter tekergetésre. De ez azt hiszem magától értetődik. Megoldás: Az adc -zést interrupttal csináld, és akkor maradhat ez a két delayes while ciklusod. A függvényeket meg tényleg ne a mainben deklaráld. Kész csoda, hogy nem dobott hibát a fordító.
Nem szamit. A C nyelv nem ismeri a begyazott fuggvenyt es fuggvenyek kozotti hierarchiat, igy nem okoz problemat, ugyan annak minosul, mintha az int main() { ele irta volna a tobbi fuggvenyt.
Üdv.!
Hogyan lehet float-ot elküldeni sorosan? Vagy string-et csinálni belőle, és azt küldeni?
Nem kell ehhez interruptoznod, csak meshova tenned a beolvasast:
Így nyerheted ki a float "nyers" értékét, pointerrel, ahol az "F" a float változó. Ez bináris érték,
nem küldheted ki String-ként", de ha lassú az átvitel akkor a leghatékonyabban így küldheted át. Ugyanis csak 4 bájtot foglal. Az adat visszaállítása hasonló, ott is pointerezni kell...
Ha egyszerűen szeretnéd megoldani, akkor használhatod a fedélzeti eszközöket.
sprintf AVR-ben Persze ez megnöveli alaposan a lefordult programod, de biztos, hogy működik. Érdemes mindig körülnézni az avrlibc oldalon, ha valami triviálisnak tűnő probléma van. Jó eséllyel megtalálható ott.
Ez így fordult le: Device: atmega16 Program: 3272 bytes (20.0% Full) (.text + .data + .bootloader) Data: 4 bytes (0.4% Full) (.data + .bss + .noinit)
Köszönöm, de arra szeretném használni, hogy fejlesztés alatt számítógépre küldje a részeredményeket, és ezzel a módszerrel, amit írtál, valamiért csak egy N betű jelenik meg a sorosportfigyelő programban. A float-ot nem lehet valahogy stringgé konvertálni, amit aztán elküldene?
Akkor erre van szükséged:
Using Standard IO streams in AVR GCC
Köszönöm, nem tudom, mit rontok el, mert nem megy, a szám helyett egy B betű érkezik meg.
Az a helyzet, hogy én nem az avrstudiot használom, hanem a winavr programmers notepad-ját, és a linkelt oldalon meg ott is állítani kell valamit ha jól látom. De ha ilyen bonyolult, akkor inkább megkérdezem, hogy ha int-et küldenék (kerekíteném a float-ot, mert csak arra kell az egész, hogy fejlesztési fázisban lássak néhány részeredményt, így nem kell teljesen pontosnak lennie), az nem lenne-e egyszerűbb?
Azért nem megy, mert egy két linker paramétert át kell állítani a Makefileban. A Makefilet gondolom nem nullárol írtad, hanem esetleg a WINAVR-hez kapható mfile programot használtad. Ha utóbbi igaz, akkor itt láthatod, hogy mit kellene állítanod: Bővebben: Link
A kerekítéses dolog természetesen egyszerűbb lenne, meg gyorsabb is, illetve kisebb hex-et eredményezne. Én azon is elgondolkodnék, hogy nem tudod-e kiváltani a floatokat egészekre. Pl : 1,23 helyett 123-t használsz, de a programod írásánál tudsz róla, hogy a tizedes vessző igazából az 1 után van. Hogy érthetőbb legyen. Teszem azt távolságokkal dolgozol. És SI rendszerben dolgozol, ezért métert használsz. A legkisebb értéked pedig 0,01m. Ekkor jobban jársz, ha átváltasz cm-re hiszen, akkor nem kellenek tizedesek. Persze lehet olyan az alkalmazásod, ahol ez nem lehetséges. Az egész azért fontos, mert a 8 bites AVR-ek nem rendelkeznek utasításokkal, amik kezelnek lebegőpontos értékeket, ezért minden művelet velük nagyságrendekkel több időbe telik.
Annyit állítottam rajta, hogy a printf() options-nál beállítottam a floating pointot, ahogy a képen van, de nem működik, csak a B betű jön.
Igen, csak egy N betű, mert bináris érték, nem String. Egy terminál pedig String-et vár, '\n\r'-el a végén.
Ahogy sikolymester kolléga írja, a konverzió nem túl hatékony, de legalább működik...
Hello! soros portból jövő adatokat tárolok egy bufferben, és onnan szeretném kihalászni azt ami kell nekem.
Meg lehet ezt oldani strstr függvénnyel?
Jelenleg ott tartok, hogy keresgéltem, és egyenlőre annyit sikerült összeollóznom, hogy pl. ha a float az "12,12457" akkor annyit elküld, hogy "12". A program így néz ki:
Siker! Közben találtam egy oldalt, ahol ugyanaz a megoldás van, amit sikolymester is írt, de valamiért csak azon az oldalon talált működik(az amelyik egy lejjebb lévő hozzászólásban van). Viszont nagyon jól! Most már szépen megjelenik a float úgy ahogy van. Köszönöm mindenkinek aki segített!
Köszönöm szépen!
Kipróbáltam, most már működik ahogyan a potit tekerem, úgy nő a futófény gyorsasága. Viszont ha túl letekerem a futófény megáll egy helyben és se ki se be; még ha a potmétert felfelé tekerem akkor sem.Ezért mindig kénytelen vagyok ressetelni(hardveresen).
Nem jo a 'szunet' fuggvenyed sem!
Ha ezt csinalod:
...akkor mivel 'j<=n' a feltetel, ezert ha n = 255, akkor a feltetel mindig igaz lesz, azaz vegtelen ciklusba kerul... Ugyanis ha j is 255, akkor ugye 'j = n' -nel, utana j-t noveled ugyan, de mivel byte (unsigned char) meretu, azert tul csordul es 0 lesz az erteke. Ekkor pedig 'j < n' feltetel teljesul... Tehat vagy ez kell:
... vagy amit szoktam javasolni, hogy egyszerubben leirva meg jobb a helzet (nincs felesleges valtozo sem!):
Hali
ELég tanácstalan vagyok, mert nem tudom melyik AVR fejlesztő rendszert válasszam. Két AVR rendszert ismerek, az egyik az AVR Dragon a másik a Thunderbird. A Thunderbird-del az a bajom, hogy - már amennyire én tudom - beépítétett mikrokontroller van, magyarán a fejlesztő panelt kell felhasználnom ha más kapcsolásban akarom használni a mikrokontrollert. A másik, az AVR Dragon amiről viszont semmit nem tudok :S Én személy szerint 8051-es mikrokontrollereket szeretnék programozni, de az AVR Dragon nem értem hogy működik. Én olyat várnék tőle, hogy ebbe már lehet külön-külön mikrokontrollert tenni amit aztán kivehetek és más kapcsolásba tehetek. Ha bővebben tudtok ezekről, vagy rosszul tudom a jellemzőiket, kérlek javítsatok ki, mert nem tudok dönteni, hogy melyik felelne meg nekem :S Csak egy olyan rendszer kellene ami beleégeti a egy 8051-es mikrokontrollerbe a .hex állományt. Ha tudtok pls segítsetek!
A Dragon "csak" programozó. Ezeket tudja: ISP, HVPP/HVSP, JTAG Debugger, debugWire.
Fejlesztőeszköznek a legjobb ha építesz valamit, vagy breadbardon játszadozol. Esetleg veszel egy hasonlót ami a képen van, egyébként ezt is én építettem. |
Bejelentkezés
Hirdetés |