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 / 805
(#) 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 Hé, 11:30 /
 
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: Hé, 11:32
(#) zombee válasza zombee hozzászólására (») Hé, 21:56 /
 
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 (») Hé, 22:39 /
 
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: Hé, 22:42
(#) rolandgw válasza zombee hozzászólására (») Hé, 22:49 /
 
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 (») Kedd, 0:23 /
 
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 (») Kedd, 0:33 /
 
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 (») Kedd, 1:13 /
 
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: Kedd, 1:16
(#) Steven19 hozzászólása Sze, 8:03 /
 
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 (») Sze, 8:34 /
 
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 (») Sze, 8:36 /
 
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 (») Sze, 11:39 /
 
É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 (») Sze, 16:26 /
 
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 (») 17:15 /
 
Meg lehet kérdezni, mit címzel 4 byte-on? Már hogy a WS-eknél nincs is cím.
Következő: »»   805 / 805
Bejelentkezés

Belépés

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