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   805 / 806
(#) zaza99 válasza pont hozzászólására (») Máj 25, 2019 /
 
Igen, mutatja is az eszközkezelő.
(#) szabi95 hozzászólása Jún 2, 2019 /
 
Ü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?
(#) Sick-Bastard válasza szabi95 hozzászólására (») Jún 3, 2019 /
 
Ü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.

  1. i2c_start(RTC_ADDRESS+I2C_WRITE);
  2. i2c_write(Second_Counter+Read_immediately);
  3. i2c_rep_start(RTC_ADDRESS+I2C_READ)   //i2C ReStart (Read)
  4. sec=i2c_readAck();


SB
(#) Sick-Bastard válasza szabi95 hozzászólására (») Jún 3, 2019 /
 
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.

  1. if(i2c_start(RTC_ADDRESS+I2C_WRITE) == 0)
  2. {
  3.         if(i2c_write(Second_Counter+Read_immediately) == 0)
  4.         {
  5.                 // folytat
  6.         }
  7.         else
  8.         {
  9.                 // error
  10.         }
  11. }
  12. else
  13. {
  14.         // error
  15. }
A hozzászólás módosítva: Jún 3, 2019
(#) szabi95 válasza Sick-Bastard hozzászólására (») 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
(#) Sick-Bastard válasza szabi95 hozzászólására (») 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. [b]Therefore, this method of reading allows no insertion of the stop condition
before the repeated start condition.[/b] Set 0h to the transmission format register.”


Próbáld így, a i2c_stop() helyett egy i2c_rep_start()-al:
  1. i2c_start(RTC_ADDRESS+I2C_WRITE);
  2. i2c_write(Second_Counter);
  3. //i2c_stop();
  4. //i2c_start(RTC_ADDRESS+I2C_READ);
  5. i2c_rep_start(RTC_ADDRESS+I2C_READ);
  6. //i2c_readAck();//fix ?bug
  7. sec=i2c_readAck();
  8. min=i2c_readAck();
  9. hour=i2c_readAck();
  10. dayofweek=i2c_readAck();
  11. day=i2c_readAck();
  12. month=i2c_readAck();
  13. year=i2c_readNak();
  14. i2c_stop();
(#) zombee hozzászólása Jún 10, 2019 /
 
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:
  1. -Wl,--section-start,.data=0x802200,--defsym=__heap_end=0x80ffff


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
(#) zombee válasza zombee hozzászólására (») 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?
(#) csatti2 válasza zombee hozzászólására (») Jún 10, 2019 /
 
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.
  1. Példa1:
  2.  
  3. MEMORY
  4. {
  5.   FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K
  6.   RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  7.   MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  8.   CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
  9. }
  10.  
  11. /* CCM-RAM section
  12.   *
  13.   * IMPORTANT NOTE!
  14.   * If initialized variables will be placed in this section,
  15.   * the startup code needs to be modified to copy the init-values. 
  16.   */
  17.   .ccmbss :
  18.   {
  19.     . = ALIGN(4);
  20.     _sccmbss = .;       /* create a global symbol at ccmbss start */
  21.     *(.ccmbss)
  22.     *(.ccmbss*)
  23.     . = ALIGN(4);
  24.     _eccmbss = .;       /* create a global symbol at ccmbss end */
  25.     __CCMHeapLimit = .;
  26.   } >CCMRAM
  27.  
  28.   .ccmram :
  29.   {
  30.     . = ALIGN(4);
  31.     _sccmram = .;       /* create a global symbol at ccmram start */
  32.     *(.ccmram)
  33.     *(.ccmram*)
  34.    
  35.     . = ALIGN(4);
  36.     _eccmram = .;       /* create a global symbol at ccmram end */
  37.   } >CCMRAM AT> FLASH
  38.  
  39. Program:
  40. #define CCMRAM                            __attribute__((section(".ccmram")))
  41. #define CCMBSS                            __attribute__((section(".ccmbss")))
  42.  
  43. static uint8_t ucHeap[ configTOTAL_HEAP_SIZE_CCM ] CCMBSS;
  44.  
  45. Példa 2:
  46.  
  47. Linker script:
  48.  
  49. MEMORY
  50. {
  51.     ROM     (rx)  : ORIGIN = 0x08040000, LENGTH = 256K
  52.     RAM     (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
  53.     EXTRAM  (rwx) : ORIGIN = 0x68000000, LENGTH = 1024K
  54. }
  55.  
  56. .extram (NOLOAD):
  57.         {
  58.     *(.extram*)
  59.     . = ALIGN(__EEPROM_SIZE);
  60.     __ee_start__ = .;
  61.     *(.eepromshared*)
  62.     *(.eepromdata*)
  63.     __ee_end__ = .;
  64.     . = ALIGN(__EEPROM_SIZE);
  65.     __extram_end__ = .;
  66.         } > EXTRAM
  67.  
  68.  
  69. Program:
  70. #define EXTRAM                            __attribute__((section(".extram")))
  71.  
  72. uint8_t EXTRAM lcdScreenBuffer[LCD_DATASIZE];
  73. uint8_t EXTRAM lcdImageBuffer[LCD_DATASIZE];


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
(#) rolandgw válasza zombee hozzászólására (») 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:
(#) zombee válasza csatti2 hozzászólására (») Jún 11, 2019 /
 
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.
(#) killbill válasza zombee hozzászólására (») Jún 11, 2019 /
 
Miért kell 50 kilobyte RAM 25 kilobyte-nyi adat (MFM jel) tárolásához?
(#) zombee válasza killbill hozzászólására (») Jún 11, 2019 /
 
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
(#) Steven19 hozzászólása Jún 12, 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.
(#) Kovidivi válasza Steven19 hozzászólására (») Jún 12, 2019 /
 
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!
(#) vargham válasza Steven19 hozzászólására (») Jún 12, 2019 /
 
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.
(#) Kovidivi válasza vargham hozzászólására (») Jún 12, 2019 /
 
É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.
(#) Steven19 válasza vargham hozzászólására (») Jún 12, 2019 /
 
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.
(#) wbt válasza Steven19 hozzászólására (») Jún 15, 2019 /
 
Meg lehet kérdezni, mit címzel 4 byte-on? Már hogy a WS-eknél nincs is cím.
(#) Steven19 válasza wbt hozzászólására (») Jún 16, 2019 /
 
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?
(#) Kovidivi válasza Steven19 hozzászólására (») Jún 16, 2019 /
 
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
(#) kapu48 válasza Steven19 hozzászólására (») 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ó.
(#) Massawa hozzászólása Jún 17, 2019 /
 
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.).

inmux.jpg
    
(#) kalmi.kalmi válasza Massawa hozzászólására (») Jún 17, 2019 /
 
Szerintem ahogyan kitaláltad, az úgy jó .
(#) Massawa válasza kalmi.kalmi hozzászólására (») Jún 17, 2019 /
 
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
(#) kapu48 válasza Massawa hozzászólására (») 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?
(#) Massawa válasza kapu48 hozzászólására (») Jún 17, 2019 /
 
Van az is, csak most ezt a feladatot egy kisebbel (arduinoval) kell megoldani. Nekem sem tetszik ezért kérdeztem.
(#) Massawa válasza Massawa hozzászólására (») Jún 17, 2019 /
 
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.
(#) fecus válasza Massawa hozzászólására (») Jún 17, 2019 /
 
Pl ez 28 bit és 400Ft:
MCP23S17T-E/SS
(#) Massawa válasza fecus hozzászólására (») Jún 17, 2019 /
 
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!
Következő: »»   805 / 806
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu