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   800 / 837
(#) BODHEAD válasza vargham hozzászólására (») Dec 17, 2018 /
 
Szia!Megvettem a programozót:usb-s AVR programozó de nem sikerül programozni.A txd és rxd lábakat be kell kötni?
(#) vargham válasza BODHEAD hozzászólására (») Dec 17, 2018 /
 
Programozó PONTOS típusa? Esetleg link az adatlapjára?
(#) BODHEAD válasza vargham hozzászólására (») Dec 19, 2018 /
 
(#) morgo válasza BODHEAD hozzászólására (») Dec 20, 2018 /
 
Ez ISP programozó, tehát annak megfelelően kell csatlakoztatni. Csak írd be a gugliba az "avr isp" varázsszavakat, kiegészítve az avr típusával. Nem olvastam vissza, melyik avr-t akarod programozni, ezért nem is tudok konkrét kivezetéseket mondani.
(#) BODHEAD válasza morgo hozzászólására (») Dec 20, 2018 /
 
atmega 8
ugy csináltam de azt irja ki flash hiba
(#) vargham válasza BODHEAD hozzászólására (») Dec 20, 2018 /
 
Mivel akarod használni? AVRDude? Milyen paramnéterekkel hívod?
Sokkal gyorsabban sikerülne segítséget adni, ha a kérdés feltevésekor MINDEN körülményt leírnál. Cél MCU típusa, programozó típusa, operációs rendszer, programozó szoftver, kapcsolási rajz, fotó az összeállításról, pontos hibaüzenet, stb.
(#) BODHEAD válasza vargham hozzászólására (») Dec 20, 2018 /
 
Helló!
Ezzel a programozóval szeretnék felprogramozni egy atmega8-ast. Windows 10-et használok ,Khazama AVR programmer a szoftver. A hiba "csak" annyi hogy amikor rákötöm a programozóra az ic-t akkor le tudom a programmal kérni az azonosítóját, törölni tudom az ic-t és olvasni is tudom, de amikor írnék akkor kiirja hogy flash writing error és így nem sikerül a programozás. És a forráskódot ,kapcsolási rajzot és minden egyebet innen szereztem.
(#) vargham válasza BODHEAD hozzászólására (») Dec 20, 2018 /
 
Atmel Studio-val próbáltad programozni?
(#) BODHEAD válasza vargham hozzászólására (») Dec 22, 2018 /
 
szia. avval sem csinál semmit
(#) Seton hozzászólása Dec 25, 2018 /
 
Boldog Karácsonyt!
Ismer valaki esetleg olyan egyvezetékes egyirányú protokollt, amivel sorba lehet kötni kettő vagy több mikrokontrollert? Több ATtiny13-at szeretnék sorba illeszteni, ahol mindegyik AVR a következő kontrollernek továbbít egy adatcsomagot (~10 bit) maximum 1 kHz/csomag frekvenciával. Az adatküldést egy mester indítja, és ő is gyűjti össze. Kitalálhatok én is valami okosságot, de minek feltalálni újra a kereket? Máskülönben a tiny AVR mérete (1 kB) miatt túl fellengzős nem lehet a kód, assemblyre nem szállnék rá. Google most nem volt annyira barátom.
A hozzászólás módosítva: Dec 25, 2018
(#) Kovidivi válasza Seton hozzászólására (») Dec 25, 2018 /
 
Használhatod az USI perifériáját soros portként (UART). Bővebben: Link.
A sorban levő AVR-eknek az TX-RX lábát kell összekötni, TX-transmit-adó, RX-receive-vevő.
Egyvezetékes, egyirányút írtál, ekkor az utolsó AVR-nek a masterhez kell kapcsolódnia.
A hozzászólás módosítva: Dec 25, 2018
(#) Seton válasza Kovidivi hozzászólására (») Dec 25, 2018 /
 
Lehet megérte volna rádobni azt a plusz ezrest egy fejlettebb AVR-ért, amikor megvettem a tucat ATtiny13-at. Ennek ugyanis nem csak a memóriája apró, de az ajánlott periféria sem része. Bár találtam korábban szoftveres UART megoldást, de az assembly betét nem győzött meg a kód egyszerű kezelhetőségéről.
(#) Kovidivi válasza Seton hozzászólására (») Dec 25, 2018 /
 
Azt nem tudtam, hogy az Attiny13-nak nincs USI perifériája... Nem tudom, mennyi a fő kódod, de lehet 1k-ba beleférne egy tömör, egyéni, egyszerűsített USART.
Én ezt találtam: 6.hozzászólásban van egy rövidke kód.
A hozzászólás módosítva: Dec 25, 2018
(#) pont válasza Seton hozzászólására (») Dec 27, 2018 /
 
Bascom-mal a szoftware-s UART pl. ennyi:

Open "comc.1:19200,8,n,1" For Output As #1

Print #1 , "serial output"

Close #1
(#) Seton válasza Kovidivi hozzászólására (») Dec 27, 2018 /
 
A bascomos példához hasonlóan ez is csak küldésre alkalmatos. Csicseregni könnyű, azt fogadni és dekódolni már kevésbé. Ezek szerint vagy a 1-Wire protokollt fogom szétszedni, vagy a hozzá hasonló DHT22-nél alkalmazott kommunikációt. Ezeket egyszerűbbnek látom leprogramozni mindkét oldalon.
(#) borsozo válasza Seton hozzászólására (») Dec 31, 2018 /
 
Valószínűleg nem mondok újat a tapasztalataimmal. I2C kétirányú kommunikációt programoztam le ATMEGA8-ra. Részben még hibakezelést is beletettem.
Ha nem időkritikus a program (ha a kommunikáció alatt semmi mással nem foglalkozik), akkor viszonylag egyszerű.
Ha időkritikus, akkor a megszakítási rendszer felhasználásával kell lekezelni minden interakciót. Ekkor a válaszra várakozás alatt mással is tud foglalkozni. Ez már nem olyan egyszerű. Nekem a lépésenkénti tesztelése okozta a legnagyobb problémát. (ha nincs válasz: a hiba az adó illetve a vevő kódjában is lehet)
Nehezítő körülmény: assembly-ben programozok...
(#) killbill válasza Seton hozzászólására (») Dec 31, 2018 /
 
Az aszinkron UART-ot (soros vonal) nem nehéz venni, ha van egy timer-ed, ami tud megszakítást kérni. Amikor megvan a start bit lefutó éle, akkor a timert felhúzod másfél bit időre. Amikor bejön a timer megszakítás, akkor leolvassa a bemenet állapotát, beshifteli egy változóba, egy másik változóban meg számolja a biteket, és ha még van, akkor a timer-t felhúzza egy bitnyi időre. Az utosó bit mintavételezése után a timert leállítja, és jelzi, hogy bejött a byte. A startbitet lehet érzékelni valami pin change megszakítással, ha van ilyen a szóban forgó uC-n.
A hozzászólás módosítva: Dec 31, 2018
(#) szili83 hozzászólása Jan 13, 2019 /
 
Olyan problémám lenne, hogy egy nyomógombbal akarom elindítani, majd esetleg egy hosszú nyomással leállítani a motort, ami a következő program szerint fut:


  1. #include <Stepper.h>
  2.  #define STEPS 100
  3.  #define IN1  8
  4.  #define IN2  9
  5.  #define IN3  10
  6.  #define IN4  11
  7.  
  8.  Stepper small_stepper(STEPS, 8, 10, 9, 11);
  9.  
  10.   int  Steps2Take = 0;
  11.   long temps = 0;
  12.   int Compteur;
  13.   int Rotate_n_temp;
  14.   int Rotate_n;
  15.   int PSW = 5;
  16.   int PSW_S = 0;
  17.  
  18. void setup()
  19.  {                
  20.   pinMode(13, OUTPUT);
  21.   pinMode(IN1, OUTPUT);
  22.   pinMode(IN2, OUTPUT);
  23.   pinMode(IN3, OUTPUT);
  24.   pinMode(IN4, OUTPUT);
  25.  
  26.   pinMode(PSW, INPUT);  // Push Switch
  27.   }
  28.  
  29. void loop()
  30.   {
  31.    
  32.     if (digitalRead(PSW) == HIGH)
  33.   {
  34.  
  35.   Push_b_on:
  36.  
  37.   Rotate_n=2;
  38.   Rotate_n_temp = Rotate_n-1;  
  39.   digitalWrite(13, HIGH);  
  40.   delay(100);  
  41.   small_stepper.setSpeed(300);
  42.  
  43. if (Compteur<=Rotate_n_temp){
  44.  
  45.   Steps2Take  = -4096;
  46.   temps = millis();
  47.   small_stepper.step(Steps2Take);
  48.   temps =  millis()- temps ;
  49.   digitalWrite(IN1, LOW);
  50.   delay(2);
  51.   digitalWrite(IN2, LOW);
  52.   delay(2);
  53.   digitalWrite(IN3, LOW);
  54.   delay(2);
  55.   digitalWrite(IN4, LOW);
  56.   delay(2);
  57.   delay(2000);  //pause
  58.    
  59.   Steps2Take  = 4096;
  60.   temps = millis();
  61.   small_stepper.step(Steps2Take);
  62.   temps =  millis()- temps ;
  63.   Serial.println(temps);
  64.   digitalWrite(IN1, LOW);
  65.   delay(2);
  66.   digitalWrite(IN2, LOW);
  67.   delay(2);
  68.   digitalWrite(IN3, LOW);
  69.   delay(2);
  70.   digitalWrite(IN4, LOW);
  71.   delay(2);
  72.  
  73.   delay(2000);  //pause
  74.  
  75. // Glignotement de la LED
  76.   digitalWrite(13, LOW);  
  77.   delay(100);              
  78.   digitalWrite(13, HIGH);  
  79.   delay(100);
  80.   Compteur++; //Ajoute 1 au Compteur  
  81.  }
  82. else{
  83.   digitalWrite(IN1, LOW);
  84.   delay(2);
  85.   digitalWrite(IN2, LOW);
  86.   delay(2);
  87.   digitalWrite(IN3, LOW);
  88.   delay(2);
  89.   digitalWrite(IN4, LOW);
  90.   delay(2);
  91.  
  92.    Compteur=0;
  93.   goto Push_b_on;
  94.  }
  95.   }
  96.  
  97.   else
  98.   {
  99.   digitalWrite(13, HIGH);  
  100.   delay(50);  
  101.   digitalWrite(13, LOW);  
  102.   delay(100);              
  103.   digitalWrite(13, HIGH);  
  104.   delay(50);
  105.   digitalWrite(13, LOW);  
  106.   delay(100);  
  107.   }
  108.  }


Mivel soros futású a program, így a goto paranccsal nem ugrik vissza az elejére, azaz ha akkor nincs benyomva a gomb, akkor nem megy a motor.

Hogyan lehetne megoldani, hogy a gomb egyszeri rövid nyomására elinduljon, és addig ne álljon le, amíg a gombot nem nyomom hosszan? (Leállítás kb 2sec nyomásra)
(#) csatti2 válasza szili83 hozzászólására (») Jan 14, 2019 /
 
Megszakítással lehet megoldani. Itt egy kis mintakód ATMega328p-re. A timeRef-hez te használhatod a millis-t (ha már Arduino-t használsz).
  1. #define BUTTON_PRESET1                  0
  2. #define BUTTON_PRESET2                  1
  3. #define BUTTON_PRESET3                  2
  4. #define BUTTON_ONOFF                    4
  5.  
  6.  
  7. #define TIME_LONGPRESS                  2000
  8. #define TIME_CLICK                              20
  9.  
  10. struct button_t {
  11.         bool activated;
  12.         bool released;
  13.         bool used;
  14.         uint32_t timeRef;
  15. };
  16.  
  17. volatile button_t _buttons[5];
  18.  
  19. // Pin change interrupt 2
  20. ISR(PCINT2_vect)
  21. {
  22.         volatile static uint8_t prev_switches = 0;
  23.        
  24.         uint8_t switches = ~PIND & 0x17;        //Switch signals are inverted, masked the switch pins
  25.         uint8_t activated = (switches ^ prev_switches) & switches;
  26.         uint8_t released = (switches ^ prev_switches) & ~switches;
  27.         for (int i = 0; i < 5; i++) {
  28.                 if (activated & _BV(i)) {
  29.                         _buttons[i].activated = true;
  30.                         _buttons[i].released = false;
  31.                         _buttons[i].used = false;
  32.                         _buttons[i].timeRef = timeReference;
  33.                 }
  34.                 if (released & _BV(i)) {
  35.                         _buttons[i].activated = false;
  36.                         _buttons[i].released = !_buttons[i].used && (timeReference - _buttons[i].timeRef > TIME_CLICK);
  37.                 }
  38.         }
  39.         prev_switches = switches;
  40. }
  41.  
  42. bool IsButtonActive(int button)
  43. {
  44.         return _buttons[button].activated;
  45. }
  46.  
  47. bool IsButtonClicked(int button)
  48. {
  49.         if (_buttons[button].used) return false;
  50.         if (_buttons[button].released && (timeReference-_buttons[button].timeRef > TIME_CLICK)) {
  51.                 _buttons[button].used = true;
  52.                 return true;
  53.         }
  54.         return false;
  55. }
  56.  
  57. bool IsButtonPressed(int button, uint32_t fwait)
  58. {
  59.         if (_buttons[button].used) return false;
  60.         if (_buttons[button].activated && (timeReference - _buttons[button].timeRef > fwait)) {
  61.                 _buttons[button].used = true;
  62.                 return true;
  63.         }
  64.         return false;
  65. }
  66.  
  67. void SetupButtons()
  68. {
  69.         // Setup pin change interrupts
  70.         PCICR = _BV(PCIE2);                                     // Enable pin change interrupt 2
  71.         PCMSK2 = _BV(PCINT16)|_BV(PCINT17)|_BV(PCINT18)|_BV(PCINT20);   // Select pins for interrupt 2
  72. }
(#) aviator17 hozzászólása Jan 14, 2019 /
 
Sziasztok!

Az ATMEL manual-ban a soros kommunikáció inicializálásánál van egy ilyen sor (aztán később több is):

UCSRC = (1<<USBS)|(3<<UCSZ0);

Tudom, hogy ez egy olyan dolog, hogy itt van, csak használni kell, de én kezdőként szeretném érteni hogy hogyan működik, mi van mögötte, viszont ezt akárhogy is számolom nem akar kijönni a jó érték.
Megpróbálnám levezetni, abban kérnék segítséget, hogy hol rontom el.

Először is mivel a shiftelés két operandusú művelet, ezért mind az USBS-nek mind az UCSZ0-nak kell, hogy legyen egy default értéke, amit a manual-beli UCSRC default bitjei alapján 0-nak és 11-nek vettem.

Tehát ha 2 stopbittel és 8 adatbittel operálunk a leírás alapján akkor 1<<USBS esetén az 1-et shiftelem balra 0-val tehát marad 1, a 3-at (ami 11-nek felel meg) shiftelem balra 11-el (azaz 3-al), tehát 11000 lesz belőle, amit ha össze "VAGY"-olok egymással akkor az UCSRC regiszter értéke 00011000 lesz, ami a bitek alapján azt jelentené, hogy 5 adatbit, 2 stopbit, paritásbit szempontból pedig egy érvénytelen kombináció.

Tehát az lenne a kérdés, hogy hol a hiba, és hogy kéne ezt pontosan értelmezni?

Köszönöm!
(#) csatti2 válasza aviator17 hozzászólására (») Jan 14, 2019 /
 
Szerintem te kevered a maszkot a bit pozícióval. Mivel nem adtad meg melyik mikrokontrollert használod ezért én a 328P-re adom meg.
Adatlap példa:
  1. UCSR0C = (1<<USBS0)|(3<<UCSZ00);


iom328p.h
  1. #define UCSR0C _SFR_MEM8(0xC2)
  2. #define UCPOL0 0
  3. #define UCSZ00 1
  4. #define UCPHA0 1
  5. #define UCSZ01 2
  6. #define UDORD0 2
  7. #define USBS0 3
  8. #define UPM00 4
  9. #define UPM01 5
  10. #define UMSEL00 6
  11. #define UMSEL01 7


Ebből kijön, hogy az 1-et 3-al tolja el, a 3-at pedig csak 1-el, majd ezt vagyolja. Ezzel pedig kijön a 8bit 2 stop bittel.
(#) kapu48 válasza aviator17 hozzászólására (») Jan 14, 2019 /
 
Az UCSRC egy 8 bites regiszter, aminek az egyes bitjei beállítanak meghatározott állapotokat.
Az USBS és UCSZ0, a megnevezet bitek regiszterben elhelyezkedő számait képviselik 0-7.
Az UCSZ0 elnevezés 0 része érzékelteti, hogy több bitből ál a kapcsoló.
Tehát UCSRC =1-et eltolsz USBS-vel OR 3<<UCSZ0
(#) aviator17 válasza csatti2 hozzászólására (») Jan 14, 2019 /
 
Köszönöm!

Így már valóban stimmel a dolog. Ha nem tévedek nagyot akkor ennek az értelme az, hogy egyértelműen lehessen mutatni a kódban, hogy az UCSR0C regiszterben az egyes biteknek milyen értéket akarunk adni, jelen esetben az USBS legyen 1, az UCSZ0 pedig 3 azaz 011 ami a 8 adatbitnek felel meg. Ezt jól látom?

Ezek szerint a header file-ban úgy vannak a define-ok meghatározva, hogy az az érték amit egy adott bitnek szánok annyival tolódjon el, hogy pont a helyére kerüljön a regiszterben? Ez lenne a maszk amit említettél?

Bár gondoltam arra is közben, hogy jóval egyszerűbb lenne inicializálni, hogy UCSR0C=0b00001110.
(#) Kovidivi válasza aviator17 hozzászólására (») Jan 14, 2019 /
 
Csak a későbbiekben nem tudom könnyen módosítani ezt: " UCSR0C=0b00001110. " Míg ha ott szerepel, hogy a prescaler-hez (timernél) ez meg ez tartozik, egyből tudod, hogy a többit nem kell bántani. Én, ha lehetséges, az összetartozó dolgokat soronként tagolom.
(#) csatti2 válasza aviator17 hozzászólására (») Jan 15, 2019 /
 
A maszk 00001110 (vagy másképp írva 111 << 1) az UCSZ0 regiszter bitekhez. Az UCSZ00 pedig a pozíciója az első bitjének (mennyivel kell eltolni a regiszterben, hogy a megfelelő biteket írd). A maszk hasznos lehet a programozási hibák hatásának csökkentésére. Ha pl. az I/O-k konfigurálásánál átküldöd a maszkon (&&) is akkor elkerülheted, hogy egy hibásan megadott konfigurációval a rossz lábat állítsd például kimenetnek tönkretéve ezzel a mikrokontrollert.

Igazság szerint ezt sokkal jobban megoldották az ATXMega sorozatnál.
pl. ATXMega128A1U
  1. /* TC1.CTRLA  bit masks and bit positions */
  2. #define TC1_CLKSEL_gm  0x0F  /* Clock Selection group mask. */
  3. #define TC1_CLKSEL_gp  0  /* Clock Selection group position. */
  4. #define TC1_CLKSEL0_bm  (1<<0)  /* Clock Selection bit 0 mask. */
  5. #define TC1_CLKSEL0_bp  0  /* Clock Selection bit 0 position. */
  6. #define TC1_CLKSEL1_bm  (1<<1)  /* Clock Selection bit 1 mask. */
  7. #define TC1_CLKSEL1_bp  1  /* Clock Selection bit 1 position. */
  8. #define TC1_CLKSEL2_bm  (1<<2)  /* Clock Selection bit 2 mask. */
  9. #define TC1_CLKSEL2_bp  2  /* Clock Selection bit 2 position. */
  10. #define TC1_CLKSEL3_bm  (1<<3)  /* Clock Selection bit 3 mask. */
  11. #define TC1_CLKSEL3_bp  3  /* Clock Selection bit 3 position. */


A gm-el jelöli a bitcsoport maszkját. A gp-vel a pozícióját a regiszteren belül. Majd bm az egyedi bitek maszkja és bp pedig a pozíciója.
(#) aviator17 válasza csatti2 hozzászólására (») Jan 15, 2019 /
 
Remek, kicsit még utánanéztem egy-két helyen, minden világos.
Köszönöm mindenkinek a segítséget.
(#) Laslie válasza Laslie hozzászólására (») Jan 15, 2019 /
 
Meg van mi okozta a hibát. Miután sikerült még két avr-t "megölnöm".
A teszt áramkör breadboard-on van összerakva, amihez a tápellátást labortápról oldottam meg. A hiba azután jött elő, miután a tápot úgy kapcsoltam be, hogy már rá volt csatlakoztatva az áramkör. Mikor csatlakozás nélkül előbb táp bekapcsolás, majd csatlakoztatás volt a sorrend nem is volt semmi gond.
Azóta 3xAAA elemről kapja a tápot az áramkör. Nincs is semmi gondom.
(#) mr.Cara hozzászólása Jan 17, 2019 /
 
Sziasztok ! Kicsit off kérdésem lenne.. Van ez a 328 alapú kis "műszer Bővebben: Link. Ügyesen lesodortam, és betört a kijelzője. Megjött az új kijelző. A fólia csatikat mivel lehet leforralni és az újat vissza hogy ne sérüljön ? Pákát kibírja?
(#) csatti2 válasza mr.Cara hozzászólására (») Jan 17, 2019 /
 
Kibírja, de alacsony hőmérsékleten és gyorsan forrassz. Használj csipeszt, amivel óvatosan emeld el a kiforrasztott szakaszt, nehogy letépd a pad-eket. Az új kijelző csatlakozóját futtasd be óvatosan vékony réteg ónnal (az eredeti valószínűleg ólommentes) a tényleges beforrasztás előtt és használj külön folyasztószert. Ha ezeket betartod akkor nem nagy kunszt beforrasztani. Bekapcsolás előtt nézd át nagyítóval vagy mikroszkóppal, hogy nem maradt-e valahol ónhíd.

Ez viszont tényleg nagyon off, úgyhogy itt hagyjuk is abba.
(#) mr.Cara válasza csatti2 hozzászólására (») Jan 17, 2019 /
 
Köszönöm !
Következő: »»   800 / 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