Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
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
Lapozás: OK   801 / 837
(#) 444Tibi hozzászólása Jan 17, 2019 /
 
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
(#) Kovidivi válasza 444Tibi hozzászólására (») 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
(#) 444Tibi válasza Kovidivi hozzászólására (») Jan 18, 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.
(#) TavIR-AVR válasza 444Tibi hozzászólására (») Jan 20, 2019 /
 
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.

IgorPlug.zip
    
(#) 444Tibi válasza TavIR-AVR hozzászólására (») Jan 21, 2019 /
 
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.
(#) simonsen hozzászólása Jan 25, 2019 /
 
Ü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!
(#) pont válasza simonsen hozzászólására (») Jan 26, 2019 /
 
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.
(#) densense válasza simonsen hozzászólására (») Jan 28, 2019 /
 
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.
(#) aviator17 hozzászólása Jan 28, 2019 /
 
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
(#) kapu48 válasza aviator17 hozzászólására (») 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
(#) aviator17 válasza kapu48 hozzászólására (») Jan 28, 2019 /
 
  1. LOOP:
  2. LDS NGS, PING
  3.         CPI NGS, 1
  4.         BREQ K1
  5.         CPI NGS, 4
  6.         BREQ K2
  7. JMP LOOP
  8.  
  9.  
  10. K1:
  11.         LDI LAMPA,0
  12.         LDI MASK,1
  13.         ????
  14.         JMP VILLOG
  15.  
  16. K2:
  17.         LDI LAMPA,2
  18.         LDI MASK,6
  19.         ????
  20.         JMP VILLOG
  21.  
  22. VILLOG:
  23.  
  24.         EOR LAMPA,MASK
  25.         OUT ????,LAMPA
  26.         JMP LOOP


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
(#) kapu48 válasza aviator17 hozzászólására (») Jan 28, 2019 /
 
Az előző link itt van pdf formában: Bővebben: Link
(#) kapu48 válasza aviator17 hozzászólására (») Jan 28, 2019 /
 
Valahogy így: Bővebben: Link
(#) aviator17 válasza kapu48 hozzászólására (») Jan 28, 2019 /
 
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.
(#) Kovidivi válasza aviator17 hozzászólására (») Jan 28, 2019 /
 
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.
(#) aviator17 válasza Kovidivi hozzászólására (») Jan 28, 2019 /
 
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
(#) rolandgw válasza aviator17 hozzászólására (») 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.
(#) kapu48 válasza aviator17 hozzászólására (») Jan 28, 2019 /
 
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
(#) simonsen válasza aviator17 hozzászólására (») 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"
(#) aviator17 válasza kapu48 hozzászólására (») Jan 28, 2019 /
 
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)?
(#) rolandgw válasza aviator17 hozzászólására (») Jan 28, 2019 /
 
A pointer nem változó? Már ketten is leírtuk, ott az angol szöveg végén Z-re is.
(#) borsozo válasza aviator17 hozzászólására (») Jan 29, 2019 /
 
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...
(#) kapu48 válasza aviator17 hozzászólására (») Jan 29, 2019 /
 
Bocsi!
Azt hittem egyértelmű a dolog!
Előtted van a Mega128 adatlapja?
  1. Constansok létrehozása:
  2. .EQU myPORTB, B PORT adatregiszter címet írod
  3. .EQU myPORTD, D PORT adatregiszter címet írod
  4. Változók létrehozása:
  5. .DEF MyPreferredPort = myPORTB
  6. .DEF MyValue = 0
  7.  
  8. LOOP:
  9. LDS NGS, PING
  10.         CPI NGS, 1
  11.         BREQ K1
  12.         CPI NGS, 4
  13.         BREQ K2
  14. JMP LOOP
  15.  
  16.  
  17. K1:
  18.         LDI LAMPA,0
  19.         LDI MASK,1
  20.        MyPreferredPort = myPORTB
  21.         JMP VILLOG
  22.  
  23. K2:
  24.         LDI LAMPA,2
  25.         LDI MASK,6
  26.         MyPreferredPort = myPORTD
  27.         JMP VILLOG
  28.  
  29. VILLOG:
  30.  
  31.         EOR LAMPA,MASK
  32.         OUT MyPreferredPort,LAMPA
  33.         JMP LOOP

Kb. ennyi!
(#) rolandgw válasza kapu48 hozzászólására (») Jan 29, 2019 /
 
Ez működik is? OUT címre nem adhatsz regiszter értéket, csak konstans lehet.
(#) rolandgw válasza rolandgw hozzászólására (») Jan 29, 2019 /
 
Bocs, félreérthető. Címként nem adhatsz meg regisztert OUT-nál. A MyPreferedPort itt az.
(#) aviator17 válasza borsozo hozzászólására (») Jan 29, 2019 /
 
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.
(#) simonsen válasza densense hozzászólására (») Jan 30, 2019 /
 
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!
(#) Max26 hozzászólása Feb 3, 2019 /
 
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
  1. #define F_CPU 3686400UL
  2.  
  3.  
  4. #include <avr/io.h>
  5. #include <util/delay.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9. #define BEKAPCSOLAS_IDEJE       10//óra
  10. #define TELJES_NAP 24//óra
  11. #define KIKAPCSOLAS_IDEJE (TELJES_NAP-BEKAPCSOLAS_IDEJE)
  12.  
  13. int main(void)
  14. {      
  15.         unsigned int k,i;
  16.  
  17.         DDRB=0xff;
  18.         PORTB=0x00;//RELÉ ki
  19.  
  20.         DDRC=0xff;
  21.         PORTC=0x00;//LED ki
  22.  
  23.         for(i=0;i<4;i++)
  24.         {
  25.                 PORTC^=(1<<PC5);
  26.                 _delay_ms(1000);
  27.         }
  28.  
  29.  
  30.     while (1)
  31.     {
  32.                 //---------bekapcsolás----------------
  33.                 PORTB=0xff;//RELÉ be
  34.                 PORTC=0xff;//LED be
  35.                 k=360*BEKAPCSOLAS_IDEJE;//3600->10óra
  36.  
  37.                 for (i=0; i<k; i++)
  38.                 {
  39.                         _delay_ms(10000);
  40.             }
  41.  
  42.                 //----------kikapcsolás--------------
  43.                 PORTB=0x00;//RELÉ ki
  44.                 PORTC=0x00;//LED ki
  45.                 k=360*KIKAPCSOLAS_IDEJE;//5040->14óra
  46.  
  47.                 for (i=0; i<k; i++)
  48.                 {
  49.                         _delay_ms(5000);
  50.                         PORTC=0xff;//LED be
  51.                         _delay_ms(5000);
  52.                         PORTC=0x00;//LED ki
  53.             }
  54.         }
  55.         return 0;
  56. }
(#) csatti2 válasza Max26 hozzászólására (») Feb 3, 2019 /
 
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.
(#) rolandgw válasza Max26 hozzászólására (») Feb 3, 2019 /
 
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

Calc.PNG
    
Következő: »»   801 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem