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   536 / 840
(#) zombee válasza csabeszq hozzászólására (») Máj 14, 2013 /
 
A memóriafoglalást (malloc) kihagytad. Azzal is csak módjával, bár inkább sehogy!
(#) paltoni hozzászólása Máj 19, 2013 /
 
Sziasztok!
Van egy Atmega 8 -asom és olyan problémába ütköztem vele,hogy egyszerű ledet tettem a PB4 es lábra 100 ohm-os ellenállással.Ha bekapcsolom a portot mérhető rajta 5v feszültség ,de a led nagyon halvány .Szerintem nem kap elég áramot.(Több fajta leddel is ugyanez).Mi lehet a probléma?
Láttam,hogy sokan a led katódját kötik az avr-hez.Ezt hogy oldom meg programban?
A hozzászólás módosítva: Máj 19, 2013
(#) TavIR-AVR válasza paltoni hozzászólására (») Máj 19, 2013 /
 
A lábat nem állítottad kimenetre.
(#) zombee válasza paltoni hozzászólására (») Máj 19, 2013 /
 
Mikor mérted az 5V-ot? Amikor a LED rá volt kötve és haloványan világított?
Állítsd kimenetre:
  1. DDRB |= (1<<4);


Katódot is köthetsz rá, de akkor invertáltan vezérled: ha 0-ra állítod a PORT-ot akkor bekapcsol.
(#) Andrasirex hozzászólása Máj 19, 2013 /
 
Sziasztok!
Atmega 8-ban kellene osztanom egy változót 12-vel,de sehogy sem megy.
Hogyan lehetne azt megoldani,hogy az alábbi programban a (buf) változó minden 12. lépésére 1-et írjak ki?
Ha valaki tud segíteni akkor előre is köszönöm.
A hozzászólás módosítva: Máj 19, 2013
(#) kapu48 válasza Andrasirex hozzászólására (») Máj 19, 2013 /
 
  1. // Mivel a (buf) Char tömbnek van deklarálva:
  2. uint64_t counter_tmp;
  3.     char buf[16];
  4.         buf[15] ='\0'; //lezáró 0 a végére
  5. // Létre kel hoznod egy számlálót!
  6. // Legyen, mondjuk:
  7. uint8_t buf_n;
  8.  
  9. // Ahól akarsz számolni:
  10. buf_n++
  11. if (buf_n == 12){
  12.         buf_n = 0
  13. //      Ki írsz 1-et?
  14. }

A hozzászólás módosítva: Máj 19, 2013
(#) paltoni válasza zombee hozzászólására (») Máj 19, 2013 /
 
Opá.. Fordítva állítottam. Pic-eknél pont fordítva van.
Köszönöm a segítséget!
(#) Andrasirex válasza kapu48 hozzászólására (») Máj 19, 2013 /
 
Köszönöm,ez nagyon hasznos info,de sajnos nem tudom felhasználni,mert szájbarágósabban kellene.
Elfelejtettem írni hogy valami kezdőknek való leírás kellene.
A feltöltött projektben a programot nem én írtam,csak módosítanom kell egy saját projekthez.
Azért kell osztani 12-vel ,mert az encoderem felbontása 12 ,nekem meg fordulatonként nem 12-t kellene kiíratni a képernyőre hanem 1 et , ahol tizedesek is jól jönnének.
Egy gépen kellene ez eltolódást mérni,ahol a tengely végére felrakom az encodert és 1mm eltolódás a tengelyen 1 fordulat.
(#) kapu48 válasza Andrasirex hozzászólására (») Máj 19, 2013 /
 
Ez kel:
uint64_t counter_tmp;
uint64_t mm; // mm tárolása
uint8_t mm12; // maradék mm 12-ed része

function: itoa
<stdlib.h>
Convert integer to string (non-standard function)
http://www.cplusplus.com/reference/cstdlib/itoa/

Csak a változó egész értékét konvertálja stringé.
Ezért ketté kel bontanod a:

counter_tmp = counter; //mivel megszakításból a counter változót folyamatosan állítgatjuk így inkább a kiiratás elött lemásoljuk az értékét, mivel jó esélyel meg fog változni kiirás közben is
mm = counter_tmp/12; // mm számolás
mm12 = counter_tmp - mm * 12; // Maradák számítás.
// itoa(counter_tmp,buf,10); //int -> sztring konverzió
itoa(mm,buf,10); //int -> sztring konverzió mm
….
Talán tudod folytatni?
(#) Andrasirex válasza kapu48 hozzászólására (») Máj 19, 2013 /
 
Nem tudom folytatni....
(#) kapu48 válasza Andrasirex hozzászólására (») Máj 19, 2013 / 1
 
Ez így már nem segítségkérés, hanem potyázás!
Ezért csak valami fércmű a ki íratáshoz:
  1. itoa(mm,buf,10); //int -> sztring konverzió mm
  2.          
  3.           lcd_puts(buf);            //mm sztring kirakás LCD-re
  4.            buffer_clear(&buf[0]);    //töröljük a sztring buffert
  5.           itoa(mm12,buf,10); //int -> maradék sztring konverzió mm/12
  6.           lcd_puts(",");            // Tizedes vessző kirakás LCD-re
  7.          
  8.           lcd_puts(buf);            //maradék sztring kirakás LCD-re
  9.           lcd_gotoxy(14,1);       //kurzor mozgatás
  10.           lcd_puts("mm");
  11.           _delay_loop_2(0x1fff);    //várunk jó sokat
  12.           buffer_clear(&buf[0]);    //töröljük a sztring buffert
(#) Andrasirex válasza kapu48 hozzászólására (») Máj 19, 2013 /
 
Már kezdem érteni...
Nem szeretnék potyázni,ez a 2. program amit szerkesztek. Az elsőt is csak módosítottam szükség szerint. Köszönöm az infókat.Ezt már remélem fel tudom használni.
(#) kapu48 válasza Andrasirex hozzászólására (») Máj 19, 2013 /
 
Ha már érted?

Van még lehetőség a:
function div
http://www.cplusplus.com/reference/cstdlib/div/
(#) attti hozzászólása Máj 22, 2013 /
 
Sziasztok!
Megszeretném kérdezni tőletek, hogyan tudom egy kondenzátormikrofon kimenetét felerősíteni, annyira, hogy egy Atmega32-es avr tudjon rajta frekvenciát számolni? Ez egy gitárhangolóba lessz.
Segítségeteket köszönöm!
Üdv. Attila!
(#) zombee válasza attti hozzászólására (») Máj 22, 2013 /
 
Keress előerősítő kapcsolást, a neten találsz.
Ha az erősítő kimeneti jelszintje kevés, arra már nem kell erősítő: egy tranzisztor megteszi.
(#) attti válasza zombee hozzászólására (») Máj 22, 2013 /
 
De az előerősítő után az Atmega32, hogy tudja értelmezni?
(#) TavIR-AVR válasza attti hozzászólására (») Máj 22, 2013 /
 
Hulye tipp:
a, ATMega 32 AD bemenetén az ADMUX regiszterrel 10x vagy 200x erősítést összehozni? és utána FFT (Fast Fourier Transform) megnézni a jellemző frekvenciát? Ez zajos környezetben is működik.
b, A belső komparátor és a komparátor kimeneti INT-t számolod? Komparátor egyik része potival leosztva...


FFT tipp:
http://forum.arduino.cc/index.php/topic,37689.0.html
http://elm-chan.org/works/akilcd/report_e.html
A hozzászólás módosítva: Máj 22, 2013
(#) attti válasza TavIR-AVR hozzászólására (») Máj 22, 2013 /
 
Kérlek egy picit rajzold le, nekem amit elmondtál. Hogy illeszem a mikrofont és melyik portra, lábra?
A hozzászólás módosítva: Máj 22, 2013
(#) zombee válasza attti hozzászólására (») Máj 23, 2013 /
 
Szerintem a kolléga sem gondolja azt hogy a mikrofont közvetlenül kösd az AVR-re.
Először kell az előerősítő, majd jöhet a többi.
(#) attti válasza zombee hozzászólására (») Máj 23, 2013 /
 
Én se gondoltam közvetlen rákötni, van valami olyan megoldásod, hogy a frekvenciának megfelelő egyenáramot adjon ki a kimeneten?
(#) kapu48 válasza attti hozzászólására (») Máj 23, 2013 /
 
(#) TavIR-AVR válasza zombee hozzászólására (») Máj 23, 2013 /
 
Tipp: Kondenzátormikrofon kidob.
Elektret mikrofon berak.
Azonnal megfelelő a jelszint...
(#) blackdog hozzászólása Máj 25, 2013 /
 
Sziasztok!

Elméleti kérdés: Ha én írok egy programot és bizonyos beállításokat engedek futás közben módosítani amiket a belső EEPROM-ban tárolok el RESET hatására ezek a beállítások megmaradnak?
RESET alatt értem a RESET gomb használatát.
(#) TavIR-AVR válasza blackdog hozzászólására (») Máj 25, 2013 /
 
Igen. Amire módosítottad, az marad...
(#) mzozo95 hozzászólása Máj 26, 2013 /
 
Sziasztok!
Egy EPROM-ban 255 nél nagyobb "című" bájtokat hogyan érhetek el? pl 500-as bájt? mert az EPROM 2kb-os, de nekem csak 0-255bájtot sikerül elérnem, mivel a cím bájt 8 bites, vagy tévedek valamiben?

Ez a főprogramom:
  1. int main(void)  // Foprogram
  2. {
  3. unsigned char ret;
  4. #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet
  5.      i2c_init();                             // initialize I2C library
  6.  
  7.      // write 0x75 to EEPROM address 5 (Byte Write)
  8.      i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
  9.      i2c_write(0x05);                        // write address = 5
  10.      i2c_write(0x75);                        // write value 0x75 to EEPROM
  11.      i2c_stop();                             // set stop conditon = release bus
  12.  
  13.  
  14.      // read previously written value back from EEPROM address 5
  15.      i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
  16.  
  17.      i2c_write(0x05);                        // write address = 5
  18.      i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode
  19.  
  20.      ret = i2c_readNak();                    // read one byte from EEPROM
  21.      i2c_stop();
  22.  
  23.         if (ret==0x75){PORTB=255;}
  24.  
  25.  while(1)
  26.  {
  27.  }
A hozzászólás módosítva: Máj 26, 2013
(#) TavIR-AVR válasza mzozo95 hozzászólására (») Máj 26, 2013 / 1
 
Igen. A nagyobb EEPROM-ok 2 byte-s címzéssel bírnak!
(#) Hooligan01 válasza mzozo95 hozzászólására (») Máj 27, 2013 /
 
Én így használom:
  1. uint8_t Read_Byte_24LC256(uint16_t addr)
  2. {
  3.         uint8_t res;
  4.        
  5.         i2c_start_wait(EEprom_Address+I2C_WRITE);       // set device address and read
  6.         i2c_write(addr >> 8);  
  7.         i2c_write(addr);       
  8.         i2c_start(EEprom_Address+I2C_READ);  
  9.         res = i2c_readNak();
  10.         i2c_stop();
  11.        
  12.         return res;  
  13. }
  14.  
  15. void Write_Byte_24LC256(uint16_t addr, uint8_t data)
  16. {
  17.         i2c_start_wait(EEprom_Address+I2C_WRITE);       // set device address and write
  18.         i2c_write(addr >> 8);  
  19.         i2c_write(addr);       
  20.        
  21.         i2c_write(data);
  22.         i2c_stop();    
  23. }
  24.  
  25. uint16_t Read_Word_24LC256(uint16_t addr)
  26. {
  27.         uint16_t res;
  28.        
  29.         i2c_start_wait(EEprom_Address+I2C_WRITE);       // set device address and read
  30.         i2c_write(addr >> 8);  
  31.         i2c_write(addr);       
  32.         i2c_start(EEprom_Address+I2C_READ);  
  33.         res = i2c_readAck()<<8;
  34.         res += i2c_readNak();
  35.         i2c_stop();
  36.        
  37.         return res;    
  38. }
  39.  
  40. void Write_Word_24LC256(uint16_t addr, uint16_t data)
  41. {
  42.         i2c_start_wait(EEprom_Address+I2C_WRITE);       // set device address and write
  43.         i2c_write(addr >> 8);  
  44.         i2c_write(addr);       
  45.        
  46.         i2c_write(data>>8);
  47.         i2c_write(data);
  48.         i2c_stop();            
  49. }
(#) Melphi hozzászólása Máj 28, 2013 /
 
Sziasztok vettem egy USBasp 3.3V/5V Programmer-t, kérdésem az lenne hogy a gép felismeri, de kellene valami szoftver hozzá, nem tudnátok segíteni, hogy mi kellhet?
Köszönöm!
A hozzászólás módosítva: Máj 28, 2013
(#) TakiG válasza Melphi hozzászólására (») Máj 28, 2013 /
 
Szia! Én az eXtreme Burner - AVR -t használom hozzá.
(#) TavIR-AVR válasza Melphi hozzászólására (») Máj 28, 2013 /
 
Mondjuk kuka. Sok szívás mellett....

Legjobb szoftver: AVR-DuDe
A hozzászólás módosítva: Máj 28, 2013
Következő: »»   536 / 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