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
Sziasztok,
keresek segítőkész kollégát aki ezt beprogramozná és a kész ic-t elpostázná nekem. Az oldalon a 4. oldalon (dokumentáció) lvan a program. Vagy ha véletlenül Pest megye Pécel, Bp. 16-17 kerület környéke, akkor személyesen átvenném. Az ellenértékét megbeszéljük. Köszönöm előre is ha valaki elvállalná. A hozzászólás módosítva: Jan 17, 2019
Olvass be a girder-es topicba, mert a girderrel gondok vannak Win8/Win10 alatt. A szoftvernek nincs aláírása, és gondot okoz. A pontos infót én sem tudom, de a témában írtam róla, ez biztos. Bővebben: Link
A hozzászólás módosítva: Jan 17, 2019
Köszi, semmmi gond az aláíratlan szoftverekkel.
Csak nem tudok programozni mikrokontrollert, először is eddig az életbe nem volt rá szükségem és szerintem nem is lesz, nincs programozóm és nem szeretneém tanulgatni sem. Öreg vagyok hozzá. A mostani mini pc-men nincs sorors port, egy TSOP vevőt összedobok 5 perc alatt de ide usb-s kell. Wzért kérdeztem, valaki szívességből, nem ingyen megcsinálná-e nekem.
Több probléma is van:
- az IgorPlug aláíratlan drivere (írtak róla). - girderből a 4.0 felett már megszűnt az ingyenessége, csak tört / időkorlátos van belőle, - igorplugnak nincs x64-es drivere Tipp: LibUSB-vel lehet használni és girder helyett eventghost. Bővebben: Link EventGhosthoz kiegészítések, driverek (x64 is!) és telepítési leírások mellékelve.
Tényleg igazad van, az x86-x64 miatt nem fog menni.
Megnézem amit ajánlottál. Linuxra van valami hasonló, teljes értékű megoldás? Dualbootos a gépem, W10-Manjaro.
Üdv mindenkinek!
Vásároltam egy fejlesztő modult. ATmega2560 ATmega16U2 MEGA 2560 MEGA2560 R3 Microcontroller Board Micro USB 16MHZ Az usb nem látja ismeretlen Win7 alatt. Van erre megoldás? Fotó a panelről És amit kérdeznék az Arduino IDE melyik verziójával lehet használni? Köszönöm a segítséget! Üdvözlettel simonsen!
A win7 eszközkezelőjében, ha nem ismerte fel akkor egy sárga jel jelzi a cuccot, ennek a tulajdonságai közt lessz egy azonosító , ennek a driverét kell keresni a neten.
Bár nem látszik a protokollváltó, de ha kínából rendelted "gondolok itt az olcsóbban , mint a gyári", akkor nagy valószínűséggel az FTDI chip helyett CH340G van benne. Viszont az is lehet, hogy az Atmel saját protokollváltója van benne, ennek a driverét szerintem a honlapján közzé is tette.
Sziasztok!
ATMEGA128-ra próbálok assembly programot írni és megakadtam ott, amikor gombnyomástól szeretném függővé tenni azt, hogy egy regisztert melyik portra (PORTB, PORTD) teszek ki. OUT $18,LAMPA Ezzel az utasítással próbálom megoldani a dolgot, a probléma az, hogy a jelenleg $18-as regiszer helyébe (PORTB) egy gomb állapotától függően mást is be tudjak illeszteni. Kellene magyarul egy "változó" amiben el tudok tárolni egy gombnyomástól függő memóriacímet, és ez a változó jelentené azt az IO portot amire kitenném a LAMPA regiszter értékét. Köszönöm előre is a segítséget! A hozzászólás módosítva: Jan 28, 2019
A port írás olvasás utasításokat gondolom már ismered?
A feltételektől függő elágazásokat pedig itt megtalálod, a Branch if ... utasítások között: Bővebben: Link A hozzászólás módosítva: Jan 28, 2019
Bemásoltam a programnak egy részét. Az elején megnézem a gombokat (NGS), eldöntöm, hogy melyik van lenyomva (K1, vagy K2), ettől függően megyek tovább a K1, vagy K2-es címkére, ahol beállítom azt hogy mit kell kijelezni (első két sor, lényegtelen), és a kérdőjelek helyére kéne azt betennem valahogy, hogy melyik porton kell kijelezni? Ez az egyik probléma. A végén EOR+maszkolással előállítom a kijelzést (lényegtelen) és a kérdőjeles sorban kéne megoldanom, hogy ki is kerüljön a portra az adat, méghozzá arra amit a K1 és K2 címkéknél beállítottam. Ez lenne a másik probléma. Az NGS LAMPA MASK, stb. elnevezett regiszterek. A hozzászólás módosítva: Jan 28, 2019
Az előző link itt van pdf formában: Bővebben: Link
Valahogy így: Bővebben: Link
Nagyon köszönöm a linkeket, de mint látod, nem az utasítások értelmezésével van gondom, hanem az elvvel. Sajnos annyira nem vagyok mestere a témának, hogy kizárólag az utasítások leírásának felhasználásával meg tudnám oldani a problémát. Ha így lenne nem kérnék segítséget.
Szia.
Tudom, nem megoldás a problémádra, de nem gondolkoztál el azon, hogy esetleg C nyelven programozz, esetleg elvégezz egy Arduino 60 napos tanfolyamot? Tudom, az elindulás nehéz, de tudnánk itt segíteni. Rengeteg kezdőknek szóló leírás van. A perifériákat már ismered, bitműveleteket is, a többiben pedig a C segítene. Arduino-val az Atmega328-ról tudnál meg rengeteget, és az Atmega128 rengeteg dologban hasonlít a 328-ra. Ha érted a lényegét, akkor csak annyit kell csinálnod, hogy a digitalWrite(5,HIGH); helyett a megfelelő PORTx|=(1<<y); -t alkalmazod. Nem kellene regiszter szinten gondolkodnod. Plusz kevesebben programoznak assembly-ben, kevesebben tudnak segíteni.
Nagyrészt C-ben programozok és Arduino-val is foglalkozom. A programot aminek a része a fenti probléma C-ben már megírtam. Az Assembly-vel eddig még nem foglalkoztam, most jutottam el oda, hogy szeretném megismerni valamilyen szinten ezért "szenvedek" vele, ez a probléma pedig amit felvetettem kifejezetten érdekelne, de tapasztalat hiányában nem tudom sajnos megoldani, viszont úgy érzem sokat tanulnék vele ha sikerülne valakinek a segítségével. Ha segítség nélkül sikerülne akkor még többet.
A problémára egyébként az a megoldás, hogy két címkét csinálok a két esetre, az egyik címkében a PORTB-re a másik esetben pedig a PORTD-re teszem ki a regiszter tartalmát, a két címkét pedig valahol korábban egy elágazás során "hívom meg". De ezzel sosem tudom meg hogy mi a válasz az eredeti kérdésre A hozzászólás módosítva: Jan 28, 2019
Indirekt címzés? X-nek (vagy Y) add meg az aktuális port címét K1-K2-ben, aztán ST X, LAMPA.
Sajnos nem ellenőriztem vissza a linket, ezért nem azt kaptad amit szerettem volna!
cimszók alatt: Register What Konkrétan a változók definiálására kérdeztél? Ezt a példát találtam rá: Idézet: „Introduction to AVR assembler programming for beginners What is a Port? Ports in the AVR are gates from the central processing unit to internal and external hard- and software components. The CPU communicates with these components, reads from them or writes to them, e.g. to the timers or the parallel ports. The most used port is the flag register, where results of previous operations are written to and branch conditions are read from. There are 64 different ports, which are not physically available in all different AVR types. Depending on the storage space and other internal hardware the different ports are either available and accessable or not. Which of these ports can be used is listed in the data sheets for the processor type. Ports have a fixed address, over which the CPU communicates. The address is independent from the type of AVR. So e.g. the port adress of port B is always 0x18 (0x stands for hexadecimal notation). You don't have to remember these port adresses, they have convenient aliases. These names are defined in the include files (header files) for the different AVR types, that are provided from the producer. The include files have a line defining port B's address as follows: .EQU PORTB, 0x18 So we just have to remember the name of port B, not its location in the I/O space of the chip. The include file 8515def.inc is involved by the assembler directive .INCLUDE "C:\Somewhere\8515def.inc" and the registers of the 8515 are all defined then and easily accessable. Ports usually are organised as 8-bit numbers, but can also hold up to 8 single bits that don't have much to do with each other. If these single bits have a meaning they have their own name associated in the include file, e.g. to enable manipulation of a single bit. Due to that name convention you don't have to remember these bit positions. These names are defined in the data sheets and are given in the include file, too. They are provided here in the port tables. As an example the MCU General Control Register, called MCUCR, consists of a number of single control bits that control the general property of the chip (see the description in MCUCR in detail). It is a port, fully packed with 8 control bits with their own names (ISC00, ISC01, ...). Those who want to send their AVR to a deep sleep need to know from the data sheet how to set the respective bits. Like this: .DEF MyPreferredRegister = R16 LDI MyPreferredRegister, 0b00100000 OUT MCUCR, MyPreferredRegister SLEEP The Out command brings the content of my preferred register, a Sleep-Enable-Bit called SE, to the port MCUCR and sets the AVR immediately to sleep, if there is a SLEEP instruction executed. As all the other bits of MCUCR are also set by the above instructions and the Sleep Mode bit SM was set to zero, a mode called half-sleep will result: no further command execution will be performed but the chip still reacts to timer and other hardware interrupts. These external events interrupt the big sleep of the CPU if they feel they should notify the CPU. Reading a port's content is in most cases possible using the IN command. The following sequence .DEF MyPreferredRegister = R16 IN MyPreferredRegister, MCUCR reads the bits in port MCUCR to the register. As many ports have undefined and unused bits in certain ports, these bits always read back as zeros. More often than reading all 8 bits of a port one must react to a certain status of a port. In that case we don't need to read the whole port and isolate the relevant bit. Certain commands provide an opportunity to execute commands depending on the level of a certain bit (see the JUMP section). Setting or clearing certain bits of a port is also possible without reading and writing the other bits in the port. The two commands are SBI (Set Bit I/o) and CBI (Clear Bit I/o). Execution is like this: .EQU ActiveBit=0 ; The bit that is to be changed SBI PortB, ActiveBit ; The bit will be set to one CBI PortB, Activebit ; The bit will be cleared to zero These two instructions have a limitation: only ports with an adress smaller than 0x20 can be handled, ports above cannot be accessed that way. For the more exotic programmer: the ports can be accessed using SRAM access commands, e.g. ST and LD. Just add 0x20 to the port's adress (the first 32 addresses are the registers!) and access the port that way. Like demonstrated here: .DEF MyPreferredRegister = R16 LDI ZH,HIGH(PORTB+32) LDI ZL,LOW(PORTB+32) LD MyPreferredRegister,Z That only makes sense in certain cases, but it is possible. It is the reason why the first address location of the SRAM is always 0x60. ” Kiemelném a két módszert: .EQU PORTB, 0x18 .DEF MyPreferredRegister = R16 A hozzászólás módosítva: Jan 28, 2019
Üdvözletem!
A bootloadert kiírtottad az Atmega128 ból? Talán több sikerrel járnál Assembly programozásban. A lábak számozása más arduinóban mint egy üres lapkában. Pl: én pinmode a csip fizikai lábszámot értelmeztem de nem működött majd a shield lábszámát írtam be és már működött a programom. Üdvözlettel simonsen! "Müködésképtelen elképzelése mindenkinek lehet"
Szia,
Nem a változók definiálásával van gondom. Megpróbálom akkor máshogy megközelíteni: Hogyan tudok olyan változót létrehozni (pl. PORT), amelyik IO regiszter (PORTB,PORTD) címeket képes tárolni? Hogyan tudok ennek a változónak értéket adni (pl. $18)? Hogyan tudom ténylegesen megjeleníteni a kívánt kimenetet ezen a változón keresztül (pl. OUT PORT,KIMENET)?
A pointer nem változó? Már ketten is leírtuk, ott az angol szöveg végén Z-re is.
kapu48 válaszának végén van a megoldás kulcsa.
A példaként kitalált PORT változó helyett használd pl a "Z" pointert. (vagy nevezd át Z pointert PORT-nak...) A K1 cimke alatt (13.sor) a kérdőjelek helyén adjál értéket a Z pointernek: töltsd bele a kívánt port címét (pl PORTB...$18): ldi ZL, low(PORTB) ; a PORTB címének alsó bájtját a pointer alsó bájtjába tölti ldi ZH, high(PORTB) ; a PORTB címének felső bájtját a pointer felső bájtjába tölti A K2 cimke alatt a másik port címét töltsd be Z pointerbe (pl PORTD...$12), lásd előbb. Amikor a program a Villog címkére ugrik, Z már tartalmazza a kívánt port címét. Itt a kérdőjel helyén indirekt utasítással a Z-ben tárolt címre (vagyis a PORTB-re, vagy a PORTD-re) kiküldheted a regiszter tartalmát. Ha pl a LAMPA nevű regiszter tartalmazza a portra kiküldendő adatot: st Z, LAMPA ; a LAMPA tartalmát a Z-ben tárolt címre küldi ki Megjegyzés: a pointer 16 bites, a port címe 8 bites. Emiatt a ZH-nak is kell értéket adni (itt=0 lesz), különben rossz címre írhatja az adatot. Én ugyan ATMEGA128-at nem használok, meg jó ideje nem programoztam, de remélem tudtam segíteni...
Bocsi!
Azt hittem egyértelmű a dolog! Előtted van a Mega128 adatlapja?
Kb. ennyi!
Ez működik is? OUT címre nem adhatsz regiszter értéket, csak konstans lehet.
Bocs, félreérthető. Címként nem adhatsz meg regisztert OUT-nál. A MyPreferedPort itt az.
Köszönöm mindenkinek a segítséget és elnézést a sok értetlenkedésért. Így, hogy értem már amit nem értettem, az is világos, hogy miért nem értettétek sokan, hogy mit nem értek. Mindössze a pointer regiszterek fogalma és kezelése hiányzott a tudástáramból, de ez sajnos teljesen. Ezért értettem nehezen amit próbáltok magyarázni. Mi a Z, mi az X hogy kerülnek oda hogy (hol) vannak definiálva, pláne a ZL meg ZH...ez teljesen kimaradt.
De a lényeg, hogy működik, jól működik és mindent értek. Köszönöm még egyszer.
Tisztelt densense!
Nem CH340 van rajta ha megnézted a linket. Atmega16U2 De szerencsére találtam rá drivert már látja az eszközt. És a led villogtatás is működik szépen. Üdv Simonsen!
Sziasztok!
Szeretnék bekapcsolni egy relét és egy LED-et 10 óra hosszat, majd kikapcsolni őket 14 óra hosszat. Lényeg, hogy 10 óra időzítés helyett kapok kb 8 óra időzítést. Mitől lehet ez a pontatlanság? Fuse bitek: Low: 0xff High:0xd9
A _delay_ms alkalmatlan erre a feladatra, azt körülbelüli késleltetésekre találták ki. Nem írtad, melyik mikrokontrollert választottad (ezt valamiért mindenki elfelejti, pedig nagy különbségek vannak). Javaslom, hogy a feladatot egy időzítő (timer) megszakítás segítségével old meg. Állítsd be úgy, hogy másodpercenként (ha az nem megy, 1mp egész számmal osztható idejével konfiguráld) adjon megszakítást. A megszakításban növelj egy változót és azt használd az összehasonlítás alapjául. Ha mindent helyesen csinálsz, akkor legfeljebb a kristályod pontatlansága okozhat kisebb eltérést.
Már nem él az eredeti letöltő link, van ez a hasznos segédprogram timer-es és más feladatokra.
App.note is van hosszú időzítésekre: Bővebben: Link |
Bejelentkezés
Hirdetés |