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   818 / 818
(#) rascal válasza Sipy hozzászólására (») Aug 11, 2020 /
 
Hát nem tudom van-e szabadon hozzáférhető hangfelismerő program amit átvehetsz, vagy magad akarod kifejleszteni, mert az elég összetett dolog ahogy én tudom. Egy Attinybe kétlem, hogy belefér egy ilyen program.
(#) Sipy válasza rascal hozzászólására (») Aug 14, 2020 /
 
Szerintem sem. Atmega8 alatt már megoldotta valaki azt olvastam. Az nem lenne gond ha még egy avr kellene bele, az int lábakat szabadon hagytam direkt ilyesmi fejlesztésekhez. Na meg vannak kifejezetten erre a célra való áramkörök, olyan is ami sd kártyára menti a mintákat. Kínából 5000 Ft körül láttam de azt meg nem tudom hogy hogyan kell használni még. Egyáltalán azt sem hogy honnan tudhatom ha felismert egy mintát, bár lehet hogy van led rajta.
(#) david10 hozzászólása Aug 16, 2020 /
 
Sziasztok,
Használt-e már valaki STM32F103-al ENC28J60 típusú ethernet vezérlőt?
Létezik-e hozza olyan könyvtár (készen megírva) amelyik tud HTTP GET kérést elküldeni?
A választ előre is köszönöm.
(#) rascal válasza david10 hozzászólására (») Aug 17, 2020 /
 
Szia, szerintem nem ide akartad ezt írni, hanem ide: ARM - Miértek hogyanok.
(#) kapu48 válasza david10 hozzászólására (») Aug 18, 2020 /
 
A netten van sok minden, csak tudni kel keresni!:
EtherCard stm32
(#) kapu48 válasza david10 hozzászólására (») Aug 18, 2020 /
 
(#) david10 válasza rascal hozzászólására (») Aug 19, 2020 /
 
Ezt sajnos elnéztem, az ARM-es csoportba szerettem volna írni, csodálkoztam is hogy a "Figyelő" miért nem mutatta hogy új hozzászólás érkezett.
Köszönöm a válászokat, közben úgy néz ki hogy az Arduino fejlesztői környezetében sikerülni fog megírni a programot, most szorít az idő, ha sikerült az Arduinos programmal üzembe helyezni a készüléket, akkor utána fogok ismét kísérletezni az STM C++ nyelvében megírni a programot.
(#) GPeti1977 hozzászólása Aug 28, 2020 /
 
Új Atmega88 PA kontrollert szerettem volna programozni Elnec Beeprog programozóval párhuzamos módban, de nem működött, régebben ugyanezzel az ezközökkel viszont igen. Történt valami változás vagy csak én bénázok?
(#) Sipy hozzászólása Szept 1, 2020 /
 
Sziasztok! A házi vízműhöz szeretnék egy avr-es nyomáskapcsolót készíteni mert a gyári mechanikus sohasem bírja sokáig. Itthon drágák a nyomás érzékelők, Kínában pedig nem bírom eldönteni hogy melyiknek digitális a kimenete, mert ugye akkor már kijelzőt is tennék hozzá. Van valakinek tapasztalata hogy melyik olcsó érzékelő jó a feladatra? 3.5 bar nyomás már bőven elég ha kibírja.
(#) pont válasza Sipy hozzászólására (») Szept 1, 2020 /
 
Szia! Mivel már a legkisebb Attiny-k közt is van ADC-s, egyszerűbb analóg szenzort beépíteni, mostanában nem rendeltem, de a leírás alapján pl. : Bővebben: Link (Általában a házi vízművek nagyobb 5-6 bar-on is dolgozhatnak)
A hozzászólás módosítva: Szept 1, 2020
(#) Sipy válasza pont hozzászólására (») Szept 1, 2020 /
 
Végülis azt könnyebb leolvasni, csak nekem kell így kalibrálni. De akkor ez lesz belőle szerintem. Köszi szépen!
(#) pont válasza Sipy hozzászólására (») Szept 1, 2020 /
 
A szenzornak a leolvasáshoz semmi köze, az küld 0-5 v-ot ezt az avr adc-je átalakítja 0-1024 értékig, ebből számolhatsz/arányosíthatsz nyomást, és aztán digitálisan hétszegmensesen, vagy lcd-n kijelzed....
(#) Andralin hozzászólása Szept 15, 2020 /
 
Sziasztok!
Most találtam egy fantasztikus leírást, ami szépen bemutatja, mit is lehet kihozni egy ATmega88-ból! Ez egyszerűen döbbenetes, gondoltam megosztom veletek is.

Az előbb szembe jött egy cikk arról, hogy lehet fekete-fehér kompozit videó jelet létrehozni AVR-el, ami nem egy nagy ördöngősség. Kíváncsiságból rákerestem, hogy lehet-e ugyanígy színes képet is csinálni.
Jópár oldalt találtam, ahol el volt magyarázva, hogy a színes kompozit videójel bonyolultsága (fáziseltolás és egyéb nyalánkságok) miatt lehetetlen ilyen jelet létrehozni egy AVR-el, mindenképp kell hozzá külső cél IC.
Aztán szembejött a következő link:

Phasor

Tökéletesen, professzinálisan összehangolt időzítésekkel szoftverből hozott létre a srác színes PAL kompozit videó jelet, mindössze két darab külső tranzisztor és egy pár passzív alkatrész használatával! Mindezek felett még egy hanggenerátorra a futottta 15.625 kHz-es mintavételezési frekvenciával.

Egy olyan demót is létrehozott, amit szó szerint tátott szájjal bámultam végig.
A mozgó képet élőben, realtime rendereli le, minden egyes képkockát a lejátszás pillanatában számol ki, videó IC, VRAM, minden egyéb nélkül. És mindezt belepréselte 8 kbyte memóriába! Ez a srác egy hatalmas zseni!
A hozzászólás módosítva: Szept 15, 2020
(#) szili83 hozzászólása Szept 17, 2020 /
 
Gondolkodok, hogy az arduino mellé érdemes lenne beszerezni ESP32-t.
Van előnye, vagy érdemesebb az arduionál maradni? Tapasztalatok érdekelnének, mert maga a hw sokkal jobbnak látszik az arduinonál.
(#) csatti2 válasza szili83 hozzászólására (») Szept 17, 2020 / 1
 
Hibás a kérdés, mert a kettő nem összehasonlítható. Az arduino az egy keretrendszer, az ESP32 pedig egy mikrokontroller. Az ESP32-t is lehet arduino segítségével programozni, tehát nem vagy-vagy a válasz.
Ha arduino alatt az arduino UNO-t érted, akkor persze már jobban értelmezhető mire is vagy kíváncsi és a válasz ebben az esetben pedig attól függ, mire is akarod használni. Bár az ESP32 jóval modernebb mint az ATMega328p (vannak olyan arduino lapkák, amelyek sokkal komolyabb mikrokontrollert tartalmaznak), de ez bonyolultabb architektúrával is jár. Magasabb a fogyasztása is, illetve ha saját áramkörben gondolkodsz, akkor macerásabb is azon belül integrálni (most nem arra gondolok, hogy tűs csatlakozón bedugod). Fogyasztás alatt pedig azt értem, hogy az ATMega328p-val készíthetsz olyan szenzort, ami egy gombelemről elműködhet éveket, ESP32-t pedig el sem tudod indítani vele.
Sorolhatnám még a különbségeket de szerintem felesleges, határozd meg a feladatot és aszerint válassz eszközt.
(#) zamatőr hozzászólása Szept 18, 2020 /
 
Sziasztok!
Megépítettem egy kézi műszert. Meglepően pontos és jól működik de a beégetett program ellenőrzésre "hibát" ír- (képeken) és újrairni csak az AVR doctor használata után tudom . A fuse bitek EF CF. Van egy frekvencia kimenete elméletileg 1MHz de nálam 297kHz. A tömörített mappában lévő hex -et használom.
Szeretném megépíteni smd alkatrészekkel amilyen picire tudom (a lábkiosztást átrajzolva) de híbás program írásnál nem tudnám "javítani " az IC-t a doktorral.
Valamit rosszúl csinálok és vagy rossz ötlet (ennyit tud és kész)?
Bővebben: Link

Köszönöm.
A hozzászólás módosítva: Szept 18, 2020
(#) Sipy hozzászólása Szept 24, 2020 /
 
Benéztem valamit. Hc-sr04 távolságmérő helyett us-025-öt rendeltem hármat. Egyik sem működik, gondolom másképp kell használni. Van valakinek infó róla? Google nem segített sajnos
(#) cua válasza Sipy hozzászólására (») Szept 24, 2020 /
 
Az us-025 az nem sima replacement a sr04-hez? Hirtelen nem talaltam doksit de tobb helyen is ugy aruljak.
(#) Sipy válasza cua hozzászólására (») Szept 25, 2020 /
 
Én is azt szeretném megtudni
(#) Sick-Bastard hozzászólása Okt 14, 2020 /
 
Üdv!

Probléma: flash-ben tárolt adat (szöveg) kiolvasása. Van egy kód, ami megy, de a másik csak egyszer fut le. Pedig az kéne a string-ek kiolvasásához.

  1. const unsigned char flash_string[] PROGMEM = "This is my String stored in Flashrn";
  2.  
  3. void USART0_TXD(unsigned char data)
  4. {
  5.         while (!( UCSR0A & (1<<UDRE0)));
  6.         UDR0 = data;
  7. }
  8.  
  9. // ez csak 1x fut jól le utána nem
  10. void USART0_TX_Flash_String_Only(const unsigned char* string)
  11. {
  12.         for(unsigned char i = 0, data = 0x01; data != 0; i++)
  13.         {
  14.                 data = pgm_read_byte(&string[i]);
  15.                 USART0_TXD(data);
  16.         }
  17. }
  18.  
  19. // ez jó, de ha az előző lefut akkor már ez sem megy
  20. void USART0_Seq_TXFD(const unsigned char* da, unsigned char length)
  21. {
  22.         unsigned char data = 0;
  23.         for(unsigned char i = 0; i < length; i++)
  24.         {
  25.                 data = pgm_read_byte(&da[i]);
  26.                 USART0_TXD(data);
  27.         }
  28. }
  29.  
  30. // a kapott eredmény a // után
  31. int main(void)
  32. {
  33.         ...
  34.         USART0_Seq_TXFD(&flash_string[2], 33);        //        is is my String stored in Flash
  35.         USART0_Seq_TXFD(&flash_string[0], 35);        //        This is my String stored in Flash
  36.         USART0_TX_Flash_String_Only(&flash_string[0]);    //        This is my String stored in Flash
  37.         USART0_Seq_TXFD(&flash_string[0], 35);        //       
  38.         USART0_TX_Flash_String_Only(&flash_string[0]);    //
  39.         USART0_Seq_TXFD(&flash_string[10], 15);    //
  40.         ...
  41. }


Megint egy pointer hiba lesz a kulcs. Valamiért a hibás kódban a pointer "elcsúszik", de miért?
(#) csatti2 válasza Sick-Bastard hozzászólására (») Csü, 0:23 /
 
Hmm, nem lehet, hogy az a baj, hogy a 0-t is kiírod az első példa végén a soros portra és azt nem szereti a fogadó oldal?
(#) Istvanpisti válasza Sick-Bastard hozzászólására (») Csü, 10:26 /
 
Idézet:
„"This is my String stored in Flashrn"”
Van-e ennek a stringnek a végén "nulla" karakter? Sajnos ez a szerkesztő nem engedi betenni a "visszaper 0" értéket, vagy legalábbis nekem nem sikerül, ezért képként küldöm, mire gondolok.
A
  1. void USART0_TX_Flash_String_Only(const unsigned char* string)
függvényben addig fut a for ciklus, ameddig nem jön 0 karakter.
A hozzászólás módosítva: Csü, 10:28

string.jpg
    
(#) Sick-Bastard válasza Istvanpisti hozzászólására (») Csü, 15:20 /
 
csatti2, Istvanpisti:

Nem ez a baj. Istvanpisti rávilágított, hogy kimaradt a "visszaper 0". Kipróbáltam azzal, de a hiba továbbra is fennáll.

Az UART-on keresztül kapott adatok:
Idézet:
„----...----...----...----...----...----...----...----...----...----...
UART Ready

MCU DateTime: 2020.10.11.64 19:33:47:000

MCU speed 8000000

is is my String stored in Flash // USART0_Seq_TXFD
This is my String stored in Flash // USART0_Seq_TXFD
T0h1i2s3 4i5s6 7m8y9 :S;t<r=i>n?g@ AsBtCoDrEeFdG HiInJ KFLlMaNsOhP // USART0_TX_Flash_String_Only
Q // USART0_Seq_TXFD vagy USART0_TX_Flash_String_Only
REREVID 06 // Ez már az ENC28J60 chip Inicializáló rutin kezdete
...stb.”

A kód nem áll meg, nincs végtelen ciklus, csak a szöveg újból nem hívható meg. Egyik kóddal sem.
(#) Sick-Bastard válasza Sick-Bastard hozzászólására (») Csü, 17:41 /
 
Végeztem egy kis módosítást, hibakeresés céljából.

  1. void USART0_Seq_TXFD(const unsigned char* da, unsigned char length)
  2. {
  3.         unsigned char data = 1;
  4.         if(length > 0)
  5.         {
  6.                 for(unsigned char i = 0; i < length; i++)
  7.                 {
  8.                         data = pgm_read_byte(&da[i]);
  9.                         USART0_TXD(data);
  10.                 }
  11.                 USART0_TX_String("length loop\r\n");
  12.         }
  13.         else
  14.         {
  15.                 for(unsigned char i = 0; data != 0; i++)
  16.                 {
  17.                         data = pgm_read_byte(&da[i]);
  18.                         USART0_TXD(data);
  19.                 }
  20.                 USART0_TX_String("while != 0\r\n");
  21.         }
  22. }
  23.  
  24. #define USART0_TX_Flash_String_Only(text)        USART0_Seq_TXFD(text, 0)


  1. int main(void)
  2. {
  3. ...
  4.         USART0_Seq_TXFD(&flash_string[2], 33);
  5.         USART0_Seq_TXFD(&flash_string[0], 35);
  6.        
  7.         USART0_TX_Flash_String_Only(flash_string);
  8.        
  9.         USART0_Seq_TXFD(&flash_string[0], 35);
  10.        
  11.         USART0_TX_Flash_String_Only(flash_string);
  12.        
  13.         USART0_Seq_TXFD(&flash_string[10], 15);
  14.         USART0_TX_Flash_String_Only(&flash_string[0]);
  15. ...
  16. }


Idézet:
„----...----...----...----...----...----...----...----...----...----...
UART Ready

MCU DateTime: 2020.10.11.64 19:33:47:000

MCU speed 8000000

is is my String stored in Flash
length loop
This is my String stored in Flash
length loop
This is my String stored in Flash
EREVID 06”


Tehát már az első
  1. USART0_TX_String("while != 0\r\n");

rész sem fut le.
(#) Istvanpisti válasza Sick-Bastard hozzászólására (») Csü, 20:42 /
 
  1. for(unsigned char i = 0; data != 0; i++)
  2. {
  3.    data = pgm_read_byte(&da[i]);
  4.    USART0_TXD(data);
  5. }
  6. USART0_TX_String("while != 0\r\n");

Ugye itt nem jut el a program a
Idézet:
„USART0_TX_String("while != ");”
sorig, valószínűleg mert ha data==0, akkor is elküldöd a
  1. USARTX0_TXD(data);
sorral.
Nem for ciklussal kellene megoldani, hanem while ciklussal, mert akkor a küldés előtt tesztelnéd a "d" értékét, nem utána.
pl.
  1. i=0;
  2. data= pgm_read_byte(&da[i]);
  3. while(d!=0)
  4. {
  5.     USARTX0_TXD(data)
  6.     i++;
  7.     data= pgm_read_byte(&da[i]);
  8. }

vagy ki lehet próbálni, hogy a for ciklusodban csak akkor küldi ki az adatot, ha d!=0.
  1. for(unsigned char i = 0; data != 0; i++)
  2.                 {
  3.                         data = pgm_read_byte(&da[i]);
  4.                         if(d!=0) USART0_TXD(data);
  5.                 }
  6.                 USART0_TX_String("while != 0\r\n");
(#) Istvanpisti válasza Sick-Bastard hozzászólására (») Csü, 20:46 /
 
mellékelek két olvasni valót a témában...
(#) Sick-Bastard válasza Istvanpisti hozzászólására (») Csü, 20:54 /
 
Nyertél!

Pont most értettem meg én is. Valóban a 0 elküldése a gond. Ez lett a megoldásom:

  1. void USART0_TX_Flash_String_Only(const unsigned char* text)
  2. {
  3.         while(pgm_read_byte(text)>0)
  4.         {
  5.                 USART0_TXD_Only(pgm_read_byte(text++));
  6.         }
  7.        
  8. }


A vicc az egészben, hogy ez volt a kiindulási alapom:
  1. void USART0_TX_String_Only(char *string)
  2. {
  3.         while(*string>0)
  4.         {
  5.                 USART0_TXD(*string++);
  6.         }
  7. }


Ami ugye ram-ból olvassa ki az adatot. Viszont a pgm_read_byte() és a * vagy & használata jól megzavart. Köszönöm a segítséget!
Következő: »»   818 / 818
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