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
Üdv!
Vettem egy RS5C372A real time clock-ot. Azt nem tudom hogy adatot írni sikerül-e bele, de olvasásnál mindig ugyan azt az értéket olvassa (0x04) az atmega akkor is ha kiszedem az ic-t a próbapanelből(de az SDA és SCL felhúzó ellenállásai bent maradnak). Han nem úgy próbálom olvasni ahogy a mellékletben van, hanem ahogy a TWI protokollban illik, akkor még ez a 0x04 érték se jön vissza(szerintem valahol végtelen ciklusba kerül, mert nem fut a többi dolog se(azokat kiszedtem a mellékletből)). Mit néztem be? Esetleg döglött az IC?
Üdv!
Nem vagyok benne biztos, csak egy tipp, de nem kellene egy I2C ReStart az i2c_write() és az i2c_read_Ack() közé? Mert ha jól értem a kódot, akkor csak I2C Write parancsot adtál ki, aztán Read parancs nélkül próbálsz adatokat fogadni. MCP7940-nél legalábbis így kell a Random olvasást végrehajtani.
SB
A 0x04 értékre a válasz:
Mivel i2c_write(Second_Counter+Read_immediately) -> i2c_write(0x00+0x04) ergo a TWDR értéke 0x04 lesz. Majd jönnek a rosszkor meghívott i2c_readAck(), így lényegében mindig a TWDR-t olvasod vissza ami 0x04 értéket tartalmaz. I2C tipp (tapasztalat alapján) Ha lehet a legalább i2c_start(), i2c_write() funkciókat helyezd be egy if()-be, hogy le tudd tesztelni a kapcsolatod.
A hozzászólás módosítva: Jún 3, 2019
Sikerült működésre bírni, viszont a regiszter cím beállítása után az első olvasáskor mindig 32d vagy 28d értéket olvas. Nem vágom hogy mi a hiba, de egy plusz read utasítás után már jön a másodperc értéke és utána a többi is:
i2c_start(RTC_ADDRESS+I2C_WRITE); i2c_write(Second_Counter); i2c_stop(); i2c_start(RTC_ADDRESS+I2C_READ); i2c_readAck();//fix ?bug sec=i2c_readAck(); min=i2c_readAck(); hour=i2c_readAck(); dayofweek=i2c_readAck(); day=i2c_readAck(); month=i2c_readAck(); year=i2c_readNak(); i2c_stop(); Köszi a segítséget! A hozzászólás módosítva: Jún 3, 2019
Idézet: „ Adatlap 31. oldal 1.2-5 Data transmission read format of the RS5C372A/B The RS5C372A/B allow the following three readout methods of data from an internal register. 1) The first method to reading data from the internal register is to specify an internal address by setting the internal address pointer and the transmission format register described 1.2-4, generate the repeated start condition (see section 1.2-3) to change the data transmission direction to perform reading. The internal address pointer is set to Fh when the stop condition is met. Therefore, this method of reading allows no insertion of the stop condition before the repeated start condition. Set 0h to the transmission format register.” Próbáld így, a i2c_stop() helyett egy i2c_rep_start()-al:
Sziasztok!
ATMega1281-hez szeretnék külső SRAM-ot csatlakoztatni. A hardveres rész és az XRAM beállítás már megy, de a fordítónak kellene valahogy beadni hogy ne 8K memóriával operáljon... A "linker options" részben beadtam neki ezt:
Persze semmi reakció, 16K lefoglalt memóriára továbbra is azt írja hogy 200%, persze semmi hibaüzenet vagy figyelmeztetés... A hozzászólás módosítva: Jún 10, 2019
Közben megnéztem a lefordított ASM kódot (.lss fájl), és láss csodát: a 16K méretű globális tömböt pont úgy címzi, ahogy kell: a 0. bájtra 0x2200 címet ad ami a külső SRAM területe. De a fordító még mindig 200%-os adatterület kihasználtságot mutat. Lehet vele kezdeni valamit?
Normálisan a linker scriptben lehet memória területeket létrehozni. Ezután létrehozhatsz szekciókat, amik ezekre a területekre mutatnak. Sajna csak ARM-ra van példám, de szerintem az AVR is hasonlóan működik majd.
Az első példában a CCM memóriára kellett külön hivatkozni (ez egy plusz beépített SRAM terület, ami nem összefüggő a hagyományos SRAM-al, annál viszont gyorsabb de nem lehet DMA-hoz használni). A második példában külső SRAM-ot használtam. A hozzászólás módosítva: Jún 10, 2019
Ezt a részt az avr-size bin util írja ki a post-bild-nél. A Studio-ban is biztosan megtalálod, Linux-on fordítok, ezek az opciók:
Köszönöm. A szekciókat AVR Studio 4 is ismeri. A "Project Options" részben kell megadni,
ahogy a linker script-et is. A (globális) változók deklarálásnál attribútum megadással lehet a változót valamely szekcióba belekényszeríteni. Ha lejjebb viszem a "data start" részt (azaz csökkentem a stack méretét 8K-ról 4K-ra), szekciókkal meghatározhatom melyik tömb kerül a belső, és melyik a külső adatterületre. A miértek elkerülése végett: floppy emulátor lesz, ahol a külső SRAM arra kell hogy egy 1.44MB-os floppy egy egész sáv (track) információját képes legyen tárolni, természetesen MFM formátumban és mindkét oldalt. Ez körülbelül 50000 bájt amiben a hasznos adaton felül benne van a szektorok közti védősáv (gap), CRC, szektorazonosítók, szinkronizációs bájtok, stb. Az SD-kártyáról olvasott hasznos adatot a gyorsabb, belső SRAM területen bontom szét MFM formátumba, onnan másolom át a kicsit lassabb külső SRAM területre. A fejpozícionálásra használt idő elegendő a beolvasáshoz, MFM kódoláshoz, írás esetén visszakonvertálás+íráshoz. És azért ATMega1281, mert az USART a mezei mega128-asban nem tudja az MSPIM módot.
Miért kell 50 kilobyte RAM 25 kilobyte-nyi adat (MFM jel) tárolásához?
Mert mindkét oldal információját tartalmaznia kell. Egy szektor az overhead miatt átlagosan 694 bájt,
ebből egy sávban van 2x18, ez 25K-ra jön ki. Az MFM formátumba konvertálás duplázza a méretet. A hozzászólás módosítva: Jún 11, 2019
Sziasztok. Napokban vettem a hestore áruházból WS2812B 1m led szalagot, 1m-en 60db led van és ATmega328P mikrovezérlővel működtetem. A kérdés az hogy hány db ledet illetve hány méteres led szalagot tudnék működtetni maximum ezzel az összeállátással? Tulajdonképpen a cél lépcső élmegvilágítás lenne. Válaszotokat előre is köszönöm.
Sokat, szerintem 50m sem probléma, van, aki óriási kivetítőt épített vele. Csak a tápod lesz kicsit problémás, mert 5V-on rengeteg Amper fog kelleni, és sok helyen kell betáplálnod!
Ha a vezérlést kérdezed: Bármennyit.
Ha az áramfelvételt: Amennyit a tápod bír. Ha hosszabb a szalag, akkor érdemes mindkét végére bekötni a tápot. Ha sok-sok méter, akkor pedig néhány méterenként.
Én max. 0.5m távolságonként táplálnám be, vagy lépcsőfokonként, lehetőleg a szalag középen. 20mA/LED, 3 szín az 60mA, 1m-en 60LED az 3.6A. A szalag vezetősávja elég pici keresztmetszettel bír, esik rajta feszültség. Ha csak minimális áramon lesz hajtva a LED-szalag, akkor lehet nyugodtan ritkábban is betáplálni.
Igen a kérdés az lett volna hogy szoftveresen hányat tudnék kezelni. Ha 4bájton címzem akkor 32768db-ot lehetne, az olyan 564m~ lenne.
Meg lehet kérdezni, mit címzel 4 byte-on? Már hogy a WS-eknél nincs is cím.
Ha azt akarom hogy csak az 56. Led világítson és a színe rózsaszín legyen akkor csak van egy címe nem?
Nincs címe. Olvasd el hogyan működik a WSxxxx LED.
Amit beküldesz az első LED-nek, azt továbbküldi az utána levőnek, és így megy tovább. Feltöltöd az összes LED-et adattal, majd engedélyezed az adatot, ekkor váltanak állapotot. A hozzászólás módosítva: Jún 16, 2019
A legjobban Ő írja le a működést meg a kódolást a README.md-ben:
Bővebben: Link Természetesen ehhez olyan HW kel, aminek az SPI órajele megfelelően beállítható.
Keresek valamilyen chipet amivel az alábbi feladat egyszerübben megoldhato lenne.
1. van kb 64 bemeneti jelem ( TTL vagy opto). 2. ezeket be kellene irni egy átmeneti flip-flopba ( tristate kimenet) 3. Majd byteonként beolvasni. A 74LS373-l menne, de hátha van valami jobb megoldás. A bemenetek bármikor változhatnak, de aránylag lassan. Az áramkörben a CLK-val beolvasom a bemenetet ( mindet egyszerre), majd byteonként a közbülsö FF-böl kiolvasnam egyenként az AVR-be. Kösz az ötletekért ( mielött nekifogok a NYAK tervezéshez.).
Szerintem ahogyan kitaláltad, az úgy jó .
Valami dagadtabb IC nincs? vagy esetleg valamilyen használhato kész modul mondjuk elég lenne 32 bemenetre is
A hozzászólás módosítva: Jún 17, 2019
Pfuj! IC temető! Ilyet 40 éve csináltunk az olcsó ruszki TTL-esekből.
Ez nem is AVR-es téma, mért ide jöttél vele? Az AVR128 – AVR2560 -osokról nem hallottál még?
Van az is, csak most ezt a feladatot egy kisebbel (arduinoval) kell megoldani. Nekem sem tetszik ezért kérdeztem.
Még gondoltam egy másik öskövültre is ( ráadásul van egy olyan kártyám 24 bemenettel) amin Intel 8255-s van, de az már valoban szégyen lenne egy müködö Arduino cucchoz. Szoval továbbra is keresek valamit, amivel a 64 (többnyire mechanikus kapcsolo) bemenetet be tudom olvasni. Sem a bemeneteken nem lehet változtatni, sem a kész Arduino cuccon amibe most BT-vel viszik be az adatot (Byte + cim) és az arduino osztja szét a 64 portra I2C sinen keresztül.
Az felmerült, hogy egy nagyobb AVR-el olvasnám, és alakitanám át az arduinonak.
Pl ez 28 bit és 400Ft:
MCP23S17T-E/SS
Kösz, majdnem jo, de odavezetett a johoz: PCF8575 lesz a nyerö, annak már megvan az I2C interface. Lehet, hogy vannak kész modulok is!
|
Bejelentkezés
Hirdetés |