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   388 / 840
(#) mrgrassy válasza zombee hozzászólására (») Dec 10, 2011 /
 
amikor le akarom forditani hiányol valamijen .elf fájlt amit nem talál


------ Build started: Project: közlamp, Configuration: Release AVR ------
Build started.
Project "közlamp.avrgccproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "C:\Users\mrgrassy\Documents\AVRStudio\közlamp\közlamp\közlamp.avrgccproj" (target "Build" depends on it):
Task "RunAvrGCC"
C:\Program Files\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe all
make: *** No rule to make target `k?Âzlamp.o', needed by `k?Âzlamp.elf'. Stop.
Done executing task "RunAvrGCC" -- FAILED.
Done building target "CoreBuild" in project "közlamp.avrgccproj" -- FAILED.
Done building project "közlamp.avrgccproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========
(#) dc001 válasza mrgrassy hozzászólására (») Dec 10, 2011 /
 
Idézet:
„*** No rule to make target `k?Âzlamp.o', needed by `k?Âzlamp.elf'. Stop. Done executing task "RunAvrGCC" -- FAILED. Done building target "CoreBuild" in project "közlamp.avrgccproj" -- FAILED. Done building project”


Nincs megadva a .c file, amiből az .o készülne, de kellene a binárishoz (.elf). Próbáld meg ékezetek nélküli file neveket használni:
közlamp => kozlamp
k?Âzlamp => kozlamp
(#) sikolymester válasza Darka hozzászólására (») Dec 10, 2011 /
 
Mivel mérted ezeket?
(#) mrgrassy válasza dc001 hozzászólására (») Dec 10, 2011 /
 
köszi és .elf fájlt honnan találok vagy hogy csinálok ?
(#) sikolymester válasza tecsa hozzászólására (») Dec 10, 2011 /
 
Kezdetnek egy nyomógombbal üzemeltetett villogót építenék a helyedben. Szigorúan nulláról. Egyrészt csak így ismerkedhetsz meg az AVR-rel ténylegesen, másfelől jó lesz C gyakorlásnak is.

Ha valami konkrétumban elakadsz, akkor szerintem sokan örömmel segítenek. Ellenben más helyett megcsinálni a munkát senki sem szereti.

Értsd: amit kérsz az az, hogy nézzük meg helyetted a forráskódot, és értelmezzük azt, majd mondjuk meg mit kellene hova beírni. Szerintem ez nem fórumra való.

Ellenben, ha azt mondod, hogy a x-ik sorban nem érted ezt:
  1. if(R_counter==0) PORTB &= ~(1<<PINB0);

akkor arra válaszolunk.

Nem kell csüggedni, próbáld meg te is megírni azt amit linkeltél, persze ebből merítve ihletet. Hidd el jobb érzés lesz a végén, amikor elkészül.

A FET-tel vezérelt több led pedig teljesen jó ötlet.
(#) mrgrassy válasza dc001 hozzászólására (») Dec 10, 2011 /
 
ékezetek nélküli hiba:


------ Build started: Project: AVRGCC2, Configuration: Debug AVR ------
Build started.
Project "AVRGCC2.avrgccproj" (default targets):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreBuild" in file "C:\Program Files\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "C:\Users\mrgrassy\Documents\AVRStudio\AVRGCC2\AVRGCC2\AVRGCC2.avrgccproj" (target "Build" depends on it):
Task "RunAvrGCC"
C:\Program Files\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe all
make: *** [AVRGCC2.o] Error 1
Done executing task "RunAvrGCC" -- FAILED.
Done building target "CoreBuild" in project "AVRGCC2.avrgccproj" -- FAILED.
Done building project "AVRGCC2.avrgccproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========
(#) sikolymester válasza mrgrassy hozzászólására (») Dec 10, 2011 /
 
Az AVRToolchain rossz sajna.
Tedd fel a WINAVR-t és azzal fordítsd.

A project optionsban tudod átállítani a Studio4-ben.
Studio5- tel nem tudom mi a helyzet 8bit téren, de nekem a STudio4.19 megtalálta az avrtoolchaint és következetesen azzal szeretne fordítani 8bites avr -ekre, de nem képes rá (köszi atmel!).
A hozzászólás módosítva: Jan 24, 2016
(#) mrgrassy válasza sikolymester hozzászólására (») Dec 10, 2011 /
 
köszi meg nézem
(#) mrgrassy válasza sikolymester hozzászólására (») Dec 10, 2011 /
 
Sikerült köszi
(#) zombee válasza sikolymester hozzászólására (») Dec 10, 2011 /
 
WINAVR-es fordítás alatt ékezetes betű, illetve szóköz nem lehet az elérési útban...
(#) mrgrassy válasza zombee hozzászólására (») Dec 10, 2011 /
 
már csak a felprogramozásnál van probléma :S

hiba :
Unable to enter programing mode. Please verify that the programmer is correctly attached to the target and that target and that target power has been switched on. Also verify that the correct device and interface settings have been specified.

Programming session setup failed: TCF command: Device:startSession failed: Code:1 ,Service: ,Message from peer:Failed to enter programming mode. ispEnterProgMode: Error status received: Got 0xc0, expected 0x00

pedig csatlakozik és attiny van beállítva :S
(#) mrgrassy válasza mrgrassy hozzászólására (») Dec 10, 2011 /
 
Ennél jobban ment a PIC programozása ésdekes modon elsőre ment.


már simulátorban tökéletesen lefut de a dragonnal problémázik :S
(#) tecsa válasza sikolymester hozzászólására (») Dec 10, 2011 /
 
Próbálkozom próbálkozom!

Suliban atmega128-at programozunk, de sok a vakfolt.
Igyekszem akkor utána menni a dolognak, köszi a jó tanácsot.
Esetleg valami oldal, vagy cikk amit fel tudok használni a gyakorláshoz?
Előre is köszi: Tecsa!

ui.: Amúgy lenne bőven kérdésem, hogy melyik sor micsoda, de erre a fórum nem alkalmas, ilyenre inkább msn-t vagy hasonlót tudok elképzelni. Ott is szívesen fogadok segítséget.
(#) zombee válasza mrgrassy hozzászólására (») Dec 10, 2011 /
 
Továbbra is azt mondom, hogy a LED-ek, vagy bármi más leterheli a programozólábakat.
A programozó max. 1-2 mA áramot tud leadni ezeken, ha valami többet vesz fel akkor a jel nem jut át az AVR-be!
Sokszor én is így jártam. Nálad(mivel csak Dragon van) a megoldás hogy a programozás idejére kikötöd
a LED-eket, vagy azt ami éppen leterheli a MOSI, MISO, SCK lábakat. Bár MISO elvileg nem számít, de kösd ki.
Ezekre a lábakra csak a programozó legyen rákötve, és úgy próbáld!
(#) mrgrassy válasza zombee hozzászólására (») Dec 10, 2011 /
 
Köszi holnap megpróbálom aztán majd kiderül.
(#) dc001 válasza mrgrassy hozzászólására (») Dec 10, 2011 /
 
Idézet:
„köszi és .elf fájlt honnan találok vagy hogy csinálok ?”


A fordító készít a .c file(ok)ból .o object file-t, majd ebből a linker a bináris .elf file-t. Ha rendben megy a fordítás akkor mind a .o mind a .elf elkészül a forrás .c-ből.
(#) mrgrassy válasza dc001 hozzászólására (») Dec 10, 2011 /
 
Köszi már sikerült a fordítás de azért köszönöm a magyarázatot.

És még valami ha valaki tudja, hogy pontosan hogyan megy a kommunikáció az AVR-és a PC között USB-n.
és lenne szives elmagyarázni nekem vagy adni valami magyar nyelvű oldalt azt meg köszönném.

Ezen kívül érdekelne a hardware-s usb-t hogyan kell kezelni AVR-ben (atmega8u2-ben)
(#) sikolymester válasza zombee hozzászólására (») Dec 10, 2011 /
 
Ezt megcáfolnám, ugyan úgy rémlik, mintha egyszer lett volna gond valamikor, de most kipróbáltam a következőt:

  1. c:\ékezet szóköz>make
  2.  
  3. -------- begin --------
  4. avr-gcc (WinAVR 20100110) 4.3.3
  5. Copyright (C) 2008 Free Software Foundation, Inc.
  6. This is free software; see the source for copying conditions.  There is NO
  7. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8.  
  9.  
  10. Compiling C: main.c
  11. avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -
  12. funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-a
  13. dhlns=./main.lst  -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
  14.  
  15. ...
  16.  
  17. Size after:
  18. AVR Memory Usage
  19. ----------------
  20. Device: atmega32
  21.  
  22. Program:    9178 bytes (28.0% Full)
  23. (.text + .data + .bootloader)
  24.  
  25. Data:        438 bytes (21.4% Full)
  26. (.data + .bss + .noinit)


Az egészet most nem szúrtam be, de lényeg hogy lefordította.
Ugyanakkor én is javaslom a linuxról porttól eszközöknél a szóközök és ékezetek mellőzését windowson.
(#) sikolymester válasza tecsa hozzászólására (») Dec 10, 2011 / 1
 
Elsősorban: Avr tutorials



német avr tutorial

Avrlibc

A lényeg, hogy mindig includeold ezt:

  1. #include <avr\io.h>


Onnan gyakorlatilag standard C az egész.
(#) mrgrassy válasza zombee hozzászólására (») Dec 10, 2011 /
 
sikerült kisebb nagyobb sikerrel
sikerült fel programozni de túl gyors ez már nem akkora probléma
(#) Tomi_Bp válasza sikolymester hozzászólására (») Dec 11, 2011 /
 
Köszönöm az eddigi segítséget is!
Az extern parancsot próbáltam úgy alkalmazni, ahogy javasoltad, hogy a FAT32.c-ben deklarált változóra hivatkozom a MAIN.c-ben, de úgy agyon danger-özött a fordító, így kénytelen voltam inkább a MAIN-ben deklarálni és a FAT32-ben használtam az extern -t, így tökéletesen működik. (KÖSZÖNÖM!)

Az a kérdésem még mindig fenn áll, hogy ha van egy tömböm, akkor azt mindenképp át kell alakítanom, hogy az értékét tudjam növelni, vagy van rá valami egyszerű megoldás?
Tehát van ennek valami egyszerű módja, hogy
  1. tömb[]++ //ez így sajnos nem működik

, vagy mindenképp előbb az általad javasolt itoa és atoi függvényt kell alkalmazni az átalakításra, majd visszaalakításra?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main ()
  5. {
  6. int i;
  7. char tomb[5];
  8. tomb[0] = 0
  9. tomb[1] = 0
  10. tomb[2] = 0
  11. tomb[3] = 1
  12.  
  13. i = atoi(tomb);
  14.  
  15. i++;
  16.  
  17. itoa (i,tomb,10);
  18.  
  19. /*
  20. tomb[0] = 0
  21. tomb[1] = 0
  22. tomb[2] = 0
  23. tomb[3] = 2
  24. */
  25.  
  26. return 0;
  27. }
(#) sikolymester válasza Tomi_Bp hozzászólására (») Dec 11, 2011 /
 
Na várjunk csak, a tömb amiben szeretnéd növelni az értéket az most milyen formában tartalmazza a számot, amit növelni szeretnél? Mert innen az derül ki, hogy kvázi 32bit nagyságú integerként.

  1. char tomb[5];
  2. tomb[0] = 0
  3. tomb[1] = 0
  4. tomb[2] = 0
  5. tomb[3] = 1


Nekem korábbról olyasmi dereng, hogy egy számot kapsz az UARTon ASCII-ként, majd azt akarod növelni eggyel.

Szóval én kicsit összezavarodtam. Kérlek önts nekem tiszta vizet a pohárba.
(#) trudnai válasza Tomi_Bp hozzászólására (») Dec 11, 2011 /
 
Ez így nem lesz jó! Az atoi az ASCII-vol Integer-be alakít, te pedig egy számot teszel bele a tömbbe ha jól látom. Pl:

char tomb[5] = "1234";
int i = atoi(tomb);

...kellene, magyarán oda ugye szöveget vársz.

Vissza alakítás jó, csak figyelj arra, hogy a számos ne legyen 9999-nel nagyobb különben buffert tulcsordulasod lesz.
(#) Tomi_Bp válasza trudnai hozzászólására (») Dec 11, 2011 /
 
Egy fájl kezdeti tartalma a "0001", ami gyakorlatilag egy bekapcsolás/működés számlálóként opciónál. Ennek az értékét szeretném növelni minden reset-elés/bekacsolás után egyel.
(#) Tomi_Bp válasza trudnai hozzászólására (») Dec 11, 2011 /
 
És akkor az oda (tomb[] -ből i -re ) alakítás hogy lenne jó?
(#) Tomi_Bp válasza Tomi_Bp hozzászólására (») Dec 11, 2011 /
 
A jelenlegi eredeti kódrészlet, ami nem működik, amúgy az ez:
  1. error = readFile_counter(READ, "startcnt.db0");
  2.  
  3. LcdFStr(FONT_1X,(unsigned char*)PSTR("i:"));
  4. for(j=0;j<6; j++)LcdChr(FONT_1X, start_counter[j]);
  5.     LcdUpdate();
  6.  
  7. //start_counter[]++;
  8. int alakitas;
  9. alakitas = atoi(start_counter);
  10. alakitas++;
  11. itoa (alakitas,start_counter,10);
  12.  
  13. for(j=0;j<4; j++)  dataString[j] = start_counter[j];
  14. dataString[j++] = '\r';
  15. dataString[j] = '\n';
  16. LcdFStr(FONT_1X,(unsigned char*)PSTR("write startcnt.db0 file"));
  17.     LcdUpdate();
  18. error = writeFile("startcnt.db0");
(#) Tomi_Bp válasza Tomi_Bp hozzászólására (») Dec 11, 2011 /
 
Elkezdtem tákolni.
Abbol kiindulva, hogy mondjuk az 1234, az 4+3*10+2*100+1*1000, megalkottam a
  1. int alakitas;
  2. alakitas = (start_counter[0]*1000)+(start_counter[1]*100)+(start_counter[2]*10)+start_counter[3];
  3. alakitas++;
  4. itoa (alakitas,start_counter,10);

sorokat. Továbbra is várom a szebb verziót (és valami gebasz van ezzel is, mert nem úgy működik a progi, ahogy szeretném...)
(#) Tomi_Bp hozzászólása Dec 11, 2011 /
 
Volna egy újabb problémám a másik mellé:
  1. start_counter[0] = 0;
  2. start_counter[1] = 0;
  3. start_counter[2] = 0;
  4. start_counter[3] = 2;
  5. for(j=0;j<4; j++)  dataString[j] = start_counter[j];
  6. dataString[j++] = '\r';//10
  7. dataString[j] = '\n';//13
  8. error = writeFile("startcnt.db2");

Erre a kódra a mellékelt fájl-t hozza létre.
Azt szeretném, ha nem a 00 , 02, 0D és 0A hexa és kis fekete kocka karaktereket mentené el, mert most a fájl tartalma
00 00 00 02 0D 0A
én pedig azt szeretném, ha az lenne ~ugyan erre~ a programra, hogy
48 48 48 50 0D 0A.
Hogy lehet a decimálist ASCII-ra alakítani?
(#) tecsa hozzászólása Dec 12, 2011 /
 
Sziasztok!
Egy kis kérdésem lenne, Thunder-bird atmega128 avr fejlesztő panelon tanulok programozni(mellékelek képet). Amit használni kéne tudnom azok a következők: LCD, tasztatúra, 7szegmenses kijelző, RGB led, gombok, ledek.
A feladatom:
Menü kiírása (4 soros) [ezzel semmi gond]
Tasztatúra használatával navigálni a menüben. [itt kezdődnek a gondok.]
  1. void menu(int a)
  2. {  
  3. switch(a)
  4. {
  5.  
  6. case 1:sajatfv(); break;
  7.  
  8. case 2: swich(a)
  9.  
  10.                                          {
  11.                                             case 1: break;
  12.                                             case 2: break;    
  13.                                            
  14.                                           }
  15.  
  16. case 3:break;
  17.  
  18. case 4:break;
  19.  
  20.  
  21. case 11: break;
  22. }
  23. }


Az "a" változó a tasztatúrát lekérdező függvényből való visszatérő érték.

A gondom a következő, az 1es gomb lenyomása után kijelzőt kéne törölni és mondjuk a az rgb led fényerejét állítani az 1-es és 3-as gombokkal. Nem tudom megoldani, hogy mi kerüljön az egyes esetek alá, hogy különbség legyen a főmenü és az almenük között. Próbáltam saját függvénnyel, az egyes case-eken belül több case-t létrehozni, valahogy sosem ment rendesen.

Előre is köszönöm a segítséget, esetleg ha valaki ráérne egy fél órát ezzel foglalkozni msn-en akkor kérem jelezze itt nekem. Előre is köszönöm.
(#) trudnai válasza Tomi_Bp hozzászólására (») Dec 12, 2011 /
 
Idézet:
„Egy fájl kezdeti tartalma a "0001", ami gyakorlatilag egy bekapcsolás/működés számlálóként opciónál. Ennek az értékét szeretném növelni minden reset-elés/bekacsolás után egyel.”


Ha jol ertem, akkor egy ASCII-ban elkodolt szamot ertesz ezalat az idezojeles "0001" alatt? Tehat, hogy egy notepaddal tudnad ezt a szamot modositani -- ugy is mondhatnam ember szamara olvashato modon tarolod a szamokat? Avagy binarisan, nativ tarolnad -- gep szamara ertheto modon? (mert az esetben nem kell atalakitani, feltetelezve a kodolas native, tehat az endian [little-endian/big-endian avagy LSB/MSB] stimmel -- keress ra googlival ezekre a szavakra, ill, szamabrazolasra).

Idézet:
„És akkor az oda (tomb[] -ből i -re ) alakítás hogy lenne jó?”


Ugy, ahogy irtam (mar ha ASCII-ben tarolod el)...
A gond az atoi-s peldaddal az, hogy a tombot binaris szamokkal inicializalod, nem karakterekkel, igy a tomb[0] erteke '\0' lesz, azaz ASCII NULL karakter, ami a string lezaro karaktere a C-ben. Emiatt nincs is atalakitanivaloja az atoi fuggvenynek... Azonkivul az utolso elemre (4. pozicio) nem teszel lezaro NULL-t, ami buffer (string) tulolvasashoz vezethet. Ezert mutattam neked, hogy jobban jarnal, ha stringkent inicializalod fel akkor jobban jarnal. Masik modszer:

  1. char tomb[5];
  2.     tomb[0] = '0';
  3.     tomb[1] = '0';
  4.     tomb[2] = '0';
  5.     tomb[3] = '1';
  6.     tomb[4] = '\0';


Magyaran karakterenkent irod be a karaktereket, nem hasznalod ki a C szintaktika adta lehetosegeket -- amit az en peldamban lathatsz. Lenyeg, hogy karaktereket teszel be oda es nem szamot... (figyeld meg az aposztrofok hasznalatat es a lezaro NULL karaktert a 4. pozicioban!). Azutan mukodnie kell az atoi() atalakitasnak.
Következő: »»   388 / 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