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   616 / 840
(#) Alpha6230 hozzászólása Aug 27, 2014 /
 
Sziasztok!
Szeretnék segítséget kérni, melyik debuggert érdemesebb megvenni?
Atmel-ICE Atmel-ICE
Vagy
JTAG-ICE3 JTAG-ICE3
Sajna az AVR-DRAGON-omat elküldtem a másvilágra, teljesen user-error volt, nagyon mérges voltam magamra. A munkámhoz viszont szükségem lenne valami debugger-re. Sima 8 bites Mega AVR-eket használok. Akinek van pozitív vagy negatív infoja a fenti két típusról, kérem ne tartsa magában.
(#) szikorapéter hozzászólása Aug 29, 2014 /
 
Üdv. Olyan kérdésem volna hogy ezen az oldalon található kód jó az ATmega328-hoz is? Még annyi volna a kérdésem hogy az Arduino UNO-ba bele lehet-e rakni az ATmega88-20PU chipet? A válaszokat előre is köszönöm.
(#) TavIR-AVR válasza szikorapéter hozzászólására (») Aug 29, 2014 /
 
A kód jó, csak át kell írni Mega328-ra.
UNO-ban (amúgy Arduinoban) NEM használható a Mega88.
Mega8/168/328 a támogatott 28 lábú IC.
(#) szikorapéter válasza TavIR-AVR hozzászólására (») Aug 29, 2014 /
 
Miket változtassak meg a kódban? A lábakatírjam át? Fejsd ki kérlek bővebben.
(#) TavIR-AVR válasza szikorapéter hozzászólására (») Aug 29, 2014 /
 
Mega8 chip 1 generációval korábbi.
Megszakítások, memóriahivatkozások, timerek eltérőek.
Ha valakinek van üres 2-3 órája át tudja bogarászni/tesztelni a kódot. Ennyire nem vagyok penge benne, hogy csuklóból menjen. Nekem egynapi munka/teszt lenne....
(#) szikorapéter válasza TavIR-AVR hozzászólására (») Aug 29, 2014 /
 
Ha az UNO panelról leveszem azokat a lábakat amin keresztül a chipet programozza,akkor felprogramozható róla a Mega88-as is?
(#) TavIR-AVR válasza szikorapéter hozzászólására (») Aug 29, 2014 /
 
NEM. A keretrendszer _nem_ támogatja!
+ bootloader sincs benne....
A hozzászólás módosítva: Aug 29, 2014
(#) szikorapéter válasza TavIR-AVR hozzászólására (») Aug 29, 2014 /
 
Akkor keresek egy másik hasonló projectet. Átírni még nem tudom ahhoz még nem értek.
(#) doup hozzászólása Aug 30, 2014 /
 
Sziasztok

Teljesen kezdő vagyok a témában. Vásároltam a linken látható ATmega328 ATmega328 kütyüt. Felraktam az avr studio 6.2 windows 8.1 alá. Amikor ráduktam az atmega-t a driver fel is ment az eszközkezelőben nincs is hiba. Viszont az board-on egy led "L" felírat van felette folyamatosan pirosan villog gondolom valamilyen hibát tükröz. Illetve az avr studio sem éri el. Valaki tudna segíteni mi lehet a baj? Az avr studio hibaüzenete "Could not establish communication with the tool."
(#) pluto válasza doup hozzászólására (») Aug 30, 2014 /
 
Szia!

Most anélkül, hogy mélyebben bele merülnénk a témába javasolnám, hogy töltsd le ezt. Ha úgy gondolod, hogy kezdőként mindenféleképpen a Studio-val kell egy Arduino-val szórakoznod, akkor telepítsd az "Arduino IDE for Atmel Studio 6.1 & 6.2" bővítményt.
(#) Szabi1 hozzászólása Aug 30, 2014 /
 
Sziasztok! Segítségre lenne szükségem. ATMEGA8-al akarok hőmérőt készíteni, lesz egy Karakteres LCD hozzákötve, és nem találtam a neten csak olyan libraryt, ami karaktereket ír ki float számokat nem.
Elkezdtem csinálni egy algoritmust, de szeretném ha valaki megnézné, hogy helyes-e?
  1. void lcd_putnum(float number)
  2. {
  3.     unsigned int auxiliar,i;
  4.       if (number < 0) // ha negativ a number
  5.         {
  6.             lcd_putch('-'); // negativ elojel kiirasa
  7.             number = -1 * number;
  8.         }
  9.  
  10.     //2 tizedes pontossagura konvertalas
  11.     number*=100; // a szamot megszorozzuk 100-al
  12.     auxiliar=number; // egesz resz atadasa auxiliar valtozonak
  13.      i=0;
  14.     while (number!=0) // csinald amig number nemegyenlo 0val
  15.     {
  16.         i++;// szamlalo novelese 1 el
  17.         auxiliar=number%10; //number maradekos osztasa 10 el, maradek mentese auxiliarba
  18.         auxiliar/=10;// a szamot elosztjuk 10el
  19.         if(i==3) lcd_putch('.');// ha a
  20.         else     lcd_putch('0'+auxiliar);
  21.     }
  22. }
(#) IMi válasza doup hozzászólására (») Aug 30, 2014 /
 
Szia!
EZ a villogás nem hiba üzenet, hanem egy "gyárilag" felprogramozott kód működése (arduinoban a blink example). Ami neked van az egy Arduino Nano klón, javaslom a témájában kérdezősködj. A programozáshoz az Arduino IDE való.
A hozzászólás módosítva: Aug 30, 2014
(#) holex válasza Szabi1 hozzászólására (») Aug 31, 2014 /
 
Én nem bonyolítanám ennyire túl.
Egész számokat biztos tud kiírni a library-d. A szám egészrészét az uint8_t egesz=floor(number); sorral megkapod, a tört részét meg úgy, hogy kivonod a számodból az egészrészt, amit kapsz megszorzod 100-al és egész típusra konvertálod.
(#) holex válasza holex hozzászólására (») Aug 31, 2014 /
 
Sőt, valószínűleg a floor függvény sem kell, ha egy floatot intté konvertálsz, akkor alapból csonkolást csinál, azaz csak az egészrészét hagyja meg a floatnak.
(#) Szabi1 válasza holex hozzászólására (») Aug 31, 2014 /
 
Találtam is egy függvényt
  1. void itoa(int n, char s[]) //egész átalakítása karakterre
  2. {
  3.     int i, sign;
  4.  
  5.     if ((sign = n) < 0)  /* sign mentése */
  6.         n = -n;          /* legyen n pozitiv */
  7.     i = 0;
  8.     do {       /* szamjegyek bontasa viszafele */
  9.         s[i++] = n % 10 + '0';   /* kov szamjegy szerzese */
  10.     } while ((n /= 10) > 0);     /* torles */
  11.     if (sign < 0)
  12.         s[i++] = '-'; //ha az elojel negativ kiir
  13.     s[i] = '\0';
  14.     reverse(s);
  15. }
Valaki tudna nekem képleteket NTC-nek az ADC olvasására? Tulajdonképpen azt tudom hogy egy bizonyos hőmérsékleten egy bizonyos ellenállása van, de ez az érték NTC típusként változó? Továbbá azt szeretném tudni, hogy lineálisan változik az ellenállása? Tehát azt szeretném, hogy egy adott program felégetése után Ra helyett mondjuk egy trimmert raknék be amivel be tudnám egy másik hőmérő által kalibrálni, de történhet az is hogy csak a bekalibrált hőre jót mutat, másra nem? Szobatermosztát lesz belőle, tehát minuszokat nincs miért mérjen, egy tizedes pontossággal jó volna.
A hozzászólás módosítva: Aug 31, 2014

Untitled.jpg
    
(#) Ivan93 válasza Szabi1 hozzászólására (») Szept 1, 2014 /
 
Szia!
Tavasszal lemértem egy ntc hőmérséklet-ellenállás görbéjét 40-20°C között.
A soros ellenállást Fizikus vonalkövetőrobotos írása alapján választottam, a hőmérővel és az adc-n olvasott értékeket excelben lerajzoltam. Nem mértem sűrűn, de egészen egyenes lett a grafikon, így szerintem lineáris az összefüggés.
(Az én ntc-m ~4.7kOhm szobahőmérsékleten, -15°c körül kb. 20kOhm, öngyújtó felett pár száz ohm ellenállású. A soros ellenállás 4k7.)
Remélem valamennyit tudtam segíteni.
Iván

ntc.xls
    
(#) rolandgw hozzászólása Szept 2, 2014 /
 
Sziasztok,win környezetben van lehetőség az AVR toolchain használatára a Studio 6 nélkül ?
A CodeBlocks-al próbálkoztam,de az avr csomagban nincs make.A winavr-el gondolom működne,viszont az már 2010-es.
(#) Droot hozzászólása Szept 3, 2014 /
 
Sziasztok!

Portd regiszternek szeretnék értéket adni, de úgy hogy a pd1, 5 és 6 értéke maradjon annyi, amennyi volt (1, 0), az új érték pedig hexában van és a pd1, 5, 6 bitek helyén 0 van.
Hogyan lehetne megoldani?
(#) kapu48 válasza Droot hozzászólására (») Szept 3, 2014 /
 
Először (PD AND b0110 0010) törlöd az állítani kívánt Biteket.

Utána (PD OR bx00x xx0x) beállítod az új értéket.
(#) Droot válasza kapu48 hozzászólására (») Szept 3, 2014 /
 
PORTD = (PORTD & 0b0110 0010) | 0bx00x xx0x;

Így, igaz?
(#) csabeszq válasza kapu48 hozzászólására (») Szept 3, 2014 /
 
A Commodore 64 alatt 4-5 assembly utasítással ment az egész. Rafkós gyerkeket voltak a Commodore-nál, mert lassú gépen kevés regiszterrel nem lehetett sokat tetvészkedni.

Elsőre borzasztóan néz ki az egész, de azért érthető.

  1. PORTD = ( ( (UJPORTD & (_BV(1) | _BV(5) | _BV(6) ) )  ^ PORTD) & ((_BV(1) | _BV(5) | _BV(6) ) ) ^ PORTD


AVR assembly alatt így nézne ki:

  1.   ldi r24, 121;    // új érték
  2.  
  3.   in  r25, PORTD;  // PORTD betöltése
  4.   and r24, 0x62;   // AND 1-es, 5-ös, 6-os bit meghagyása, a többi nullázása
  5.   xor r24, r25;    // XOR a port értékével
  6.   and r24, 0x62;   // AND 1-es, 5-ös, 6-os bit meghagyása
  7.   xor r24, r25;    // XOR a port értékével
  8.   out PORTD, r24;  // PORTD felülírása


A trükk abban áll, hogy két XOR kiüti egymást, viszont ahol AND volt, ott csak egy XOR lesz.
- ahol 2 XOR van, ott az új érték lesz
- ahol 1 XOR van, ott pedig a port értéke

Kíváncsi vagyok, hogy a feltaláló meddig tökölhetett, míg kieszelte ezt a megoldást.
Csak viccből írtam, nem kell mindenképpen ezt használni.

Commodore-on:

  1. LDA #$80; legfelső bit megváltoztatása
  2.   EOR $FC;  a nulláslap $FC memória cellájában
  3.   AND #$80;
  4.   EOR $FC;
  5.   STA $FC;  tárolni
A hozzászólás módosítva: Szept 3, 2014
(#) Droot válasza csabeszq hozzászólására (») Szept 3, 2014 /
 
Ezt a hibát dobja:
../main.c:80: error: expected ')' before ';' token
../main.c:100: error: expected ';' before '}' token

Erre:
Idézet:
„PORTC = ( ( (segments_portc[3] & (_BV(0) | _BV(1) | _BV(2) ) ) ^ PORTC) & ((_BV(0) | _BV(1) | _BV(4) ) ) ^ PORTC;
A hozzászólás módosítva: Szept 3, 2014
(#) Szabi1 válasza rolandgw hozzászólására (») Szept 3, 2014 /
 
Szia! Mi a suliba codeblocks-al tanultunk console appokat irni, én ehez vagyok szokva, AVR kódot is ebben írok, a szinek miatt, de winavr-el szoktam kompilálni, mert LPT prortos az égetőm, és egy régi laptopot használok amin örülök ha felprogramozza. Emiatt a Codeblocks-al való kompilálást és égetést nem próbéltam, de tudom hogy van ilyesmi a projekt menube. Windows appokat meg Visual C++ ban irok.
(#) csabeszq válasza Droot hozzászólására (») Szept 4, 2014 /
 
Csak viccből írtam, az első AND felesleges.

PORTC = ((segments_portc[3] ^ PORTC) & (_BV(0) | _BV(1) | _BV(4) )) ^ PORTC;

AVR alatt teljesen felesleges hasznáni, mert a

PORTC = (PORTC & ~(_BV(0) | _BV(1) | _BV(4) ) ) | ( segments_portc[3] & (_BV(0) | _BV(1) | _BV(4) ) );

ugyanazt adja méretben. A zárójeleket számold meg.
(#) Droot válasza csabeszq hozzászólására (») Szept 4, 2014 /
 
Nem akar működni. Csatolom a kapcsolást és a kódot.

  1. #include <inttypes.h>
  2. #include <avr/io.h>
  3. #include <avr/pgmspace.h>
  4. #include <avr/interrupt.h>
  5. #include <avr/eeprom.h>
  6. #include <util/delay.h>
  7. #include <stdio.h>
  8.  
  9. volatile unsigned char segments_portc [10] = {0x2c, 0x20, 0xc, 0x28, 0x20, 0x28, 0x2c, 0x20, 0x2c, 0x28};
  10. volatile unsigned char segments_portd [10] = {0x98, 0x80, 0x89, 0x89, 0x91, 0x19, 0x19, 0x88, 0x99, 0x99};
  11.  
  12. #define DIGIT1_ON PORTD |= (1<<PD1);
  13. #define DIGIT2_ON PORTD |= (1<<PD5);
  14. #define DIGIT3_ON PORTD |= (1<<PD6);
  15.  
  16. PORTD |= 0x00 & 0b01100010;
  17.  
  18. int main(void)
  19. {
  20.  
  21.         /* portok inicializálása */
  22.         DDRD = 0xDF; //PORT D mind kimenet, kivéve PD2
  23.         DDRC = 0xFF; //PORT C mind kimenet
  24.         while(1)
  25.         {
  26. DIGIT1_ON
  27. PORTC = ((segments_portc[3] ^ PORTC) & (_BV(0) | _BV(1) | _BV(4) )) ^ PORTC;
  28. PORTD = ((segments_portd[3] ^ PORTD) & (_BV(1) | _BV(2) | _BV(5) | _BV(6) )) ^ PORTD;
  29.  
  30. _delay_ms(40);
  31. DIGIT_OFF
  32.         }
  33.         return 0;
  34. }


Így a kijelzőn a 2. digiten csak a G szegmens világít és nagyon halványan.
Később Timerrel fogom megcsinálni a multiplexelést, egyenlőre azt szeretném hogy végtelenciklusban máködjön rendesen.

kapcsolas.png
    
(#) kapu48 válasza Droot hozzászólására (») Szept 4, 2014 /
 
Igazán nem értem az egész gondolatmenetet?

Mi értelme van a 2 XOR-nak, az 1 OR helyet?
Az AVR mindkettőt tudja gépi kód szinten! (Ez nem COMODORE!)

Másik mi értelme van ennek a műveletnek: 0b00000000 = 0x00 & 0b01100010;

31.DIGIT_OFF Hol van definiálva?
A hozzászólás módosítva: Szept 4, 2014
(#) rolandgw válasza kapu48 hozzászólására (») Szept 4, 2014 /
 
Azt hittem csak én nem értem miért nem elég ide egy mezei or művelet !?
(#) killbill válasza kapu48 hozzászólására (») Szept 5, 2014 /
 
Idézet:
„Mi értelme van a 2 XOR-nak, az 1 OR helyet?
Az AVR mindkettőt tudja gépi kód szinten! (Ez nem COMODORE!)

Commodore (két m), es a 6510 is tudja mindkettot (ORA, EOR). De en is kivancsi vagyok, hogy miert van igy elbonyolitva.
(#) kameleon2 válasza Szabi1 hozzászólására (») Szept 5, 2014 /
 
Szia! Javaslom a kalibrációt. Még gyári PLC A/D átalakítójánál is jól jött. 0 fok jeges víz, 100 fok - forrásban lévő víz. Persze van méregdrága hőmérséklet kalibrátor is, de gondolom az nem minden hobbista műhely alapfelszerelése... Én eddig minden mikrokontrollernél és szonda típusnál kalibráltam - az a korrekt megoldás. Ehhez persze nem árt szintén valamilyen segédprogram, ami kiírja a ténylegesen mért értékeket. Az én méréseim szerint elég lineáris a skála. Nálam például egy A/D által mért érték 1/3-ad foknak felelt meg egy PT 100-nál. Nyilván NTC-je válogatja, neked mi lesz a mérés eredménye.
(#) gabi20 hozzászólása Szept 5, 2014 /
 
Sziasztok csak egy rövid kérdésem lenne. Megszakításoknál az interrupt flag bit a megszakítás rutin elején, vagy a végén törlődik? Konkrétan INT0 külső megszakításról van szó, de gondolom az összesre érvényes. Köszönöm szépen
Következő: »»   616 / 840
Bejelentkezés

Belépés

Hirdetés
XDT.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