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   690 / 837
(#) holex hozzászólása Szept 10, 2015 /
 
Sziasztok. Amikor az LCD kijelző kontrasztját szoftverből lehet állítani, azt hogyan oldják meg? Én csak a trimmeres megoldást ismerem....
(#) Sick-Bastard válasza holex hozzászólására (») Szept 10, 2015 /
 
A trimmert cseréld ki egy Digitális Potmeter-re és kösd a vezérlőhöz.
A hozzászólás módosítva: Szept 10, 2015
(#) pont válasza holex hozzászólására (») Szept 10, 2015 /
 
Még nem csináltam ilyet, de szerintem semmi akadálya, hogy egy tranzisztoron keresztül pwm jellel szabályozd.
(#) pont válasza Sick-Bastard hozzászólására (») Szept 10, 2015 /
 
Szerinted mekkora áramot tud szabályozni egy digitális poti?
(#) holex válasza Sick-Bastard hozzászólására (») Szept 10, 2015 /
 
Köszi! Azt hittem valami egyszerűbb megoldás van (pl PWM+RC szűrő).
(#) attika válasza Sick-Bastard hozzászólására (») Szept 10, 2015 /
 
avrdude: warning: cannot set sck period. please check for usbasp firmware update
.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9307
avrdude: Expected signature for ATMEGA32 is 1E 95 02
Double check chip, or use -F to override this check.

ezt az üzenetet kaptam az első sorra.
ez most jó vagy rossz?
(#) Bakman válasza pont hozzászólására (») Szept 10, 2015 /
 
Mennyit fogyaszt a kontraszt láb?
(#) pont válasza Bakman hozzászólására (») Szept 10, 2015 / 1
 
Itt Bővebben: Link 200µA írnak, de majd holnap megmérek egyet, mert még ilyen gondom nem volt.
(#) attika válasza attika hozzászólására (») Szept 11, 2015 / 1
 
Na sikerült felprogramozni egy másik usbasp-vel az usbasp-t
Most ha ráteszem az AVR32-őt akkor azt írja ki,hogy usbasp ISB clock,nem tudom törölni a chippet.
Gondolom le van zárva és azért,igaz? Feloldani a lezárást csak egy ilyennel tudom,vagy van rá más megoldás is?
(#) holex hozzászólása Szept 11, 2015 /
 
Közben utánanéztem a dolognak és az a digitális poti erősen ágyúval verébre kategória... Egy ellenállásból és egy kondiból kell csinálni egy aluláteresztő szűrőt és kész, 20 ft-ból megvan, kevesebb helyet foglal és SPI-vel sem kell szórakozni. Még kalkulátor is van fent a neten, ami segít kiválasztani az optimális R és C értêkeket.
(#) Sick-Bastard válasza pont hozzászólására (») Szept 11, 2015 /
 
Nem sokat. A mellékelt digitális poti 1mA-re képes, de elég lehet a kontraszthoz, ha meg nem akkor jöhet hozzá egy tranzisztor.
(#) Sick-Bastard válasza attika hozzászólására (») Szept 11, 2015 /
 
ISB clock? vagy lock? Elnézést, de ilyenhez még nem volt szerencsém, szerencsémre.

Amit most írok, azt nem próbáltam ki.
Az adatlapja szerint:
Idézet:
„The ATmega32 provides six Lock bits which can be left unprogrammed (“1”) or can be programmed
(“0”) to obtain the additional features listed in Table 103. The Lock bits can only be
erased to “1” with the Chip Erase command.”


Tehát az avrdudeba ezzel próbálkozz:
  1. avrdude -c usbasp -p m32 -e


Ha ezt beírod és működik, akkor az AVRben lévő program elvész! De utána elvileg már fel lehet tölteni az új kódot.

A biztonság kedvéért végezd el előtte a mentést(ha engedi):
  1. avrdude -c usbasp -p m32 -U flash:r:F:\m32_flash.hex:i -U eeprom:r:F:\m32_eeprom.hex:i

A F:\ meghajtót csak példának írtam oda.

Közben az is felmerült benne, hogy lehet ez nem Lock Bits általi tiltás, hanem Fuse Bits-ben van letiltva az ISP. Akkor viszont nincs más, csak amit mellékeltél, a HVPP.

Az AVR be van forrasztva a NYÁKba vagy foglalatban van?
Ha foglalatban van és ez a programozás csak egyszeri alkalomnak szánod, akkor lehet gyorsabb lenne egy új vezérlőt beszerezni.
A hozzászólás módosítva: Szept 11, 2015
(#) attika válasza Sick-Bastard hozzászólására (») Szept 11, 2015 /
 
Eddig kézben volt a chip de már visszaforrasztottam a helyére,se így se úgy nem működik.
Az oldal leírása szerint ahol írnak a töltőről ott azt mondják,hogy Fuse Bits-ben van tiltva a chip.
Azt kipróbáltam amit ott írnak,hogy elméletileg,ha átírom akkor oldania kéne a biteket,de sajnos nem.
ISB Clock-ot írt ki,ha lock az egyértelmú lett volna ezzel az igen kevés angolommal is
Még egyet szeretnék kérni,megépítem azt amit linkeltem,de az smd változatát szeretném mert ahhoz van minden mellékelve rendesen sprint layouttal tervezett nyák,stb.
De van egy kis különbség a furatszerelt és az smd terv között.
Az smd nyákon van egy FTDI chip meg egy usb csatlakozó.
Az FTDI chippel tisztában vagyok,hogy mire szokták használni,de a kérdésem a következő lenne,hogy fontos-e bele az illetve az usb B csati,vagy az csak ahhoz kell neki,hogy a terminál együtt működjön?
Erre sajnos nem találtam magyarázatot az oldalon.Az eredeti furatszerelt változat egy usb soros port átalakítón küldi az adatokat a gépnek és egy proggrammal lehet megjeleníteni,hogy mit csinál a HVPP. Mellékelek egy képet a rajzról,hogy mire is gondolok pontosan.
(#) Sick-Bastard válasza attika hozzászólására (») Szept 11, 2015 /
 
Az FTDI chip akkor kell ha nincs a gépeden COM port. Az USB csati csak az FTDI-nek kell. Ez a FuseBit Doctor UART-on kapja az utasításokat.

A visszaforrasztás problémássá teheti, vagy akár lehetetlenné, a HVPP-os programozást. Újra ki kell azt szedni.
(#) attika válasza Sick-Bastard hozzászólására (») Szept 11, 2015 /
 
Már azóta kiszedtem megint.Azt tudom,hogy az FTDI az USB-hez kell és,hogy UART-on kommunikál a FuseBit Dr,csak arra lettem volna kíváncsi,hogy azokat akkor simán kihagyhatom és anélkül is kell működnie a Dr-nak? Nekem nem kell,hogy gépen lássam,hogy mit csinál mert elméletileg arra van a két db led benne,hogy információval lásson el,hogy sikerült-e vagy sem az újraélesztés.
Még egy kérdésem lenne,hogy nem minden esetben kell állítgatni a Fuse biteket?
Azért kérdezem ezt mert most,hogy felprogramoztam az USBASP-t ott csak egy hex fájl volt és nem kért semmi mást és működik is rendesen.
Ezek a bitek csak ilyen finomhangolás miatt kellenek??
Felprogramoztam az USBASP chipjére a fuse doktor szoftverét úgy,hogy még be van forrasztva a helyére (ugyan az a AVR van benne mint ami a Dr-hez kell) és minden hibajelzés nélkül felprogramozta,és ott is csak egy hex fájl volt. Ez így működhet,vagy ott is kellene állítgatni a FuseBiteket?
A hozzászólás módosítva: Szept 11, 2015
(#) Sick-Bastard válasza attika hozzászólására (») Szept 11, 2015 /
 
Jah már értem. Igen Az FTDI nem tűnik nekem sem kötelezőnek.

Ki tudnád nekem olvasni a FuseBit Dr-t futtató AVR fuse bitjeit ezzel az avrdude paranccsal?
avrdude -c usbasp -p m8
Arra tippelek, hogy még azon is kell egy Fuse Bit módosítást végezni, ha még nem tetted meg.
(#) Sick-Bastard hozzászólása Szept 11, 2015 /
 
A következő gondom akadt:
Az atmega1284p-hez írok egy bootloadert(tudom ebből is van egy rakat készen), de a page írásnál elakadtam.
A gondot nehezíti, hogy bizonyos parancsokat assmebly-ben kell kiadni és eddig csak a sei, cli és nop-val volt dolgom.

Ezeket definiáltam:
  1. #define spm()           asm volatile("spm")
  2. #define lpm()           asm volatile("lpm")
  3. #define elpm()          asm volatile("elpm")
  4. #define nop()           asm volatile("nop")
  5.  
  6. #define RAMPZ           _SFR_IO8(0x3B)
  7. #define R30                     _SFR_MEM8(0x1E)
  8. #define R31                     _SFR_MEM8(0x1F)
  9. #define R0                      _SFR_MEM8(0x00)
  10. #define R1                      _SFR_MEM8(0x01)

Ezek meg a funkciók:
  1. void SPM_Page_Erase(u8b addr[3])
  2. {
  3.         u8b addr_l = addr[0];
  4.         u8b addr_h = addr[1];
  5.         u8b addr_x = addr[2];
  6.         u8b R[4]        = {0,0,0,0};
  7.        
  8.                 ASCII_X("R30:   0x",addr_l,16," ");
  9.                 ASCII_X("R31:   0x",addr_h,16," ");
  10.                 ASCII_X("RZ:    0x",addr_x,16,"\r\n");
  11.        
  12.         //24.8.1 Performing Page Erase by SPM
  13.         //To execute Page Erase, set up the address in the Z-pointer,
  14.         RAMPZ = addr_x;
  15.         R31 = addr_h;
  16.         R30 = addr_l;
  17.         //write “X0000011” to SPMCSR and
  18.         SPMCSR = 0x03// 0b00000011
  19.         //execute SPM within four clock cycles after writing SPMCSR.
  20.         spm();
  21.         SPM_Wait();
  22.        
  23.                 R[3] = R31;
  24.                 R[2] = R30;
  25.                 R[0] = R0;
  26.                 R[1] = R1;
  27.                
  28.                 asm volatile("CLR r0");
  29.                 asm volatile("CLR r1");
  30.                 asm volatile("CLR r30");
  31.                 asm volatile("CLR r31");
  32.                
  33.                 ASCII_X("R0:    0x",R[0],16,"   ");
  34.                 ASCII_X("R1:    0x",R[1],16,"   ");
  35.                 ASCII_X("R30:   0x",R[2],16,"   ");
  36.                 ASCII_X("R31:   0x",R[3],16,"   ");
  37.                 ASCII_X("RZ:    0x",RAMPZ,16,"\r\n");
  38. }
  39.  
  40. void SPM_Page_Load(u8b addr[3], u8b page[])
  41. {
  42.         //24.8.2 Filling the Temporary Buffer (Page Loading)
  43.         u8b addr_l = addr[0];
  44.         u8b addr_h = addr[1];
  45.         u8b addr_x = addr[2];
  46.         u8b R[4]        = {0,0,0,0};
  47.        
  48.                 ASCII_X("R30:   0x",addr_l,16," ");
  49.                 ASCII_X("R31:   0x",addr_h,16," ");
  50.                 ASCII_X("RZ:    0x",addr_x,16,"\r\n");
  51.  
  52.         for(u16b i = 0; i <= (PAGE_SIZE-1);)
  53.         {
  54.                 addr_l = i;
  55.                 //data in R1:R0,
  56.                 R0 = page[i++]; // data low byte
  57.                 R1 = page[i++]; // data high byte
  58.                
  59.                 //To write an instruction word, set up the address in the Z-pointer and
  60.                 RAMPZ = addr_x;
  61.                 R31 = addr_h;
  62.                 R30 = addr_l;
  63.                
  64.                 //write “00000001” to SPMCSR and
  65.                 SPMCSR = 0x01;
  66.                
  67.                 //execute SPM within four clock cycles after writing SPMCSR.
  68.                 spm();
  69.                 SPM_Wait();
  70.                 R[3] = R31;
  71.                 R[2] = R30;
  72.                 R[0] = R0;
  73.                 R[1] = R1;
  74.                
  75.                 asm volatile("CLR r0");
  76.                 asm volatile("CLR r1");
  77.                 asm volatile("CLR r30");
  78.                 asm volatile("CLR r31");
  79.                
  80.                 ASCII_X("R0:    0x",R[0],16,"   ");
  81.                 ASCII_X("R1:    0x",R[1],16,"   ");
  82.                 ASCII_X("R30:   0x",R[2],16,"   ");
  83.                 ASCII_X("R31:   0x",R[3],16,"   ");
  84.                 ASCII_X("RZ:    0x",RAMPZ,16,"\r\n");
  85.         }
  86. }
  87.  
  88. void SPM_Page_Write(u8b addr[3])
  89. {
  90.         u8b addr_l = addr[0];
  91.         u8b addr_h = addr[1];
  92.         u8b addr_x = addr[2];
  93.         u8b R[4]        = {0,0,0,0};
  94.        
  95.                 ASCII_X("R30:   0x",addr_l,16," ");
  96.                 ASCII_X("R31:   0x",addr_h,16," ");
  97.                 ASCII_X("RZ:    0x",addr_x,16,"\r\n");
  98.        
  99.         //24.8.3 Performing a Page Write
  100.        
  101.         //To execute Page Write, set up the address in the Z-pointer,
  102.         RAMPZ = addr_x;
  103.         R31 = addr_h;
  104.         R30 = addr_l;
  105.        
  106.         //write “X0000101” to SPMCSR and
  107.         SPMCSR = 0x05;
  108.        
  109.         //execute SPM within four clock cycles after writing SPMCSR.
  110.         spm();
  111.         SPM_Wait();
  112.  
  113.                 R[3] = R31;
  114.                 R[2] = R30;
  115.                 R[0] = R0;
  116.                 R[1] = R1;
  117.                
  118.                 asm volatile("CLR r0");
  119.                 asm volatile("CLR r1");
  120.                 asm volatile("CLR r30");
  121.                 asm volatile("CLR r31");
  122.                
  123.                 ASCII_X("R0:    0x",R[0],16,"   ");
  124.                 ASCII_X("R1:    0x",R[1],16,"   ");
  125.                 ASCII_X("R30:   0x",R[2],16,"   ");
  126.                 ASCII_X("R31:   0x",R[3],16,"   ");
  127.                 ASCII_X("RZ:    0x",RAMPZ,16,"\r\n");
  128. }
  129.  
  130. void Write_Flash_Page(u8b addr[3], u8b page[])
  131. {
  132.         USART1_TX_String("Load");
  133.         ENTER();
  134.         SPM_Page_Load(addr, page);
  135.         ASCII("addr_l:  0x",addr[0],16);
  136.         ASCII("addr_h:  0x",addr[1],16);
  137.         ASCII("addr_e:  0x",addr[2],16);
  138.         ASCII("SPMCSR:  0x",SPMCSR,16);
  139.        
  140.         USART1_TX_String("Erase");
  141.         ENTER();
  142.         SPM_Page_Erase(addr);
  143.         ASCII("addr_l:  0x",addr[0],16);
  144.         ASCII("addr_h:  0x",addr[1],16);
  145.         ASCII("addr_e:  0x",addr[2],16);
  146.         ASCII("SPMCSR:  0x",SPMCSR,16);
  147.        
  148.         SPM_RD_EN();
  149.         USART1_TX_String("Read EN");
  150.         ENTER();
  151.         ASCII("SPMCSR:  0x",SPMCSR,16);
  152.        
  153.         USART1_TX_String("Write");
  154.         ENTER();
  155.         SPM_Page_Write(addr);
  156.         ASCII("addr_l:  0x",addr[0],16);
  157.         ASCII("addr_h:  0x",addr[1],16);
  158.         ASCII("addr_e:  0x",addr[2],16);
  159.         ASCII("SPMCSR:  0x",SPMCSR,16);
  160.  
  161.         SPM_RD_EN();
  162.         USART1_TX_String("Read EN");
  163.         ENTER();
  164.         ASCII("SPMCSR:  0x",SPMCSR,16);
  165.         // Fill temporary page buffer
  166.         // Perform a Page Erase
  167.         // Perform a Page Write
  168. }


Az ASCII(), ASCII_X() és USART1_TX_String() funkcióknak, de hibakereső funkcióik vannak.

A hibakeresés során a SPM_Page_Erase(), SPM_Page_Write() funkciók végén jelentkezik vagy anomália, vagy egy komoly hiba:
Idézet:
„addr_l: 0x0
addr_h: 0x1
addr_e: 0x0
SPMCSR: 0x0
Erase
R30: 0x0 R31: 0x1 RZ: 0x0
SPMCSR: 0x43
SPMCSR: 0x43
SPMCSR: 0x43
SPMCSR: 0x43
R0: 0x0 R1: 0x0 R30: 0x1e R31: 0x0 RZ: 0x0
addr_l: 0x0
addr_h: 0x1
addr_e: 0x0
SPMCSR: 0x40
Read EN
SPMCSR: 0x0
Write
R30: 0x0 R31: 0x1 RZ: 0x0
SPMCSR: 0x45
SPMCSR: 0x45
SPMCSR: 0x45
SPMCSR: 0x45
R0: 0x0 R1: 0x0 R30: 0x1e R31: 0x0 RZ: 0x0
addr_l: 0x0
addr_h: 0x1
addr_e: 0x0
SPMCSR: 0x40
Read EN
SPMCSR: 0x0”


Ezek szerint az R30 és az R31 értéke nem egyezik meg az általam adott érékekkel. Most azt nem tudom, hogy ez csak amiatt van, mert a meghívott ASCII_X() bezavar és felülírja ezeket a regisztereket, vagy valóban itt van a hiba?
(#) attika válasza Sick-Bastard hozzászólására (») Szept 11, 2015 /
 
Parancsolj,ezt írta ki.
avrdude: warning: cannot set sck period. please check for usbasp firmware update
.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9307

avrdude: safemode: Fuses OK

avrdude done. Thank you.
(#) Sick-Bastard válasza attika hozzászólására (») Szept 11, 2015 /
 
Ezek szerint régebbi ardude-od van. Mellékelem a 6.1-et és hozzá egy GUI-t is.
A 6.1 alapból kiírja a Fuse biteket is:
Idézet:
„avrdude: safemode: Fuses OK (E:FF, H:10, L:06)”

avrdude.rar
    
(#) Droot hozzászólása Szept 11, 2015 /
 
ATtiny26-on float változókat nem lehet használni?
(#) attika válasza Sick-Bastard hozzászólására (») Szept 11, 2015 /
 
De akkor most ez jó? vagy kell csinálnom vele valamit?
Közben elkészültem a nyákokkal is.
Ez az 1.0.5 nekem meg a 0.2.0-as van.
(#) Droot válasza Droot hozzászólására (») Szept 11, 2015 /
 
Amint deklarálom, kiírja az avr studio hogy betelt a chip, pedig deklarálás előtt 16% volt foglalt. Illetve adcvel mérek feszültséget és uint8_t változóba az sem működik, hogy volt = adcget()/1024*5000;
(#) csatti2 válasza Droot hozzászólására (») Szept 12, 2015 /
 
Lévén nincs FPU ezekben a mikrokontrollerekben ezért a lebegőpontos számokat szoftveresen kell megvalósítani. Ez elég nagy helyet kíván. A másik gond pedig, hogy ráadásul nagyon lassú is. Ezért aztán, nem illik lebegőpontos matematikát alkalmazni ilyen eszközökben. A számítások nagy részét kellő pontossággal el lehet végezni integer matematikával is, csak kicsit gondolkodni kell.

A számítás természetesen nem működik. Első lépésben elosztod az ADC értékét 1024-el, miközben annak a maximális értéke 1023. Az eredmény tehát 0. Ezt kedvedre szorozhatod, akármekkora számmal, az csak 0 marad. Egyébként pedig mit keresne uint8_t-ben egy olyan érték, ami millivoltban van és akár 5000 is lehet? Vagy castolod a számítást uint32_t-be és először szorzol, utána osztasz, vagy pedig szorzol 5-el, utána pedig kivond a végeredményből az 1/44-edét és akkor maradhatsz integernél (a C alapértelmezetten ezzel számol ugyanis). Még így is túl pontos lesz, lévén nem valószínű, hogy tényleg pont 5V lenne a referenciafeszültséged.
A hozzászólás módosítva: Szept 12, 2015
(#) Droot válasza csatti2 hozzászólására (») Szept 12, 2015 /
 
Köszönöm az információkat!
Bocsánat a hülyeségekért, természetesen nem uint8_t-t használok, hanem egyenlőre unsigned int-et, csak este septiben elalvás előtt beírtam egy példát.
(#) Droot válasza Droot hozzászólására (») Szept 12, 2015 /
 
A hőmérséklet mérés eléggé nehézkes, mivel a log függ vénysem működik...
Temperature = (1/(1/298+1/3977*log(NTCResistance/10000))-273)
Így kellene mérni.
Esetleg valami alternatívát tudtok?
(#) Sick-Bastard válasza Droot hozzászólására (») Szept 12, 2015 /
 
Bocsi NTC ellenállással még nem mértem.
Én eddig csak LM335-el mértem szobahőmérsékletet, amihez 2,56V-os külső referenciát használtam(a belső nem volt stabil).
Ha jól emlékszem 5 összeadással és 5 kivonással, egy for() ciklusban, meg is volt a pontos eredmény.
(#) Sick-Bastard válasza attika hozzászólására (») Szept 12, 2015 /
 
Jó lesz szerintem, csak még feltétlen nézd meg a Fusebit Dr-t futtató avr Fuse bitjeit, mielőtt kivennéd az USBasp NYÁKjából, mert lehet hogy ez még külső oszcillátorra van állítva.
(#) csatti2 válasza Droot hozzászólására (») Szept 12, 2015 / 1
 
Csinálsz egy lookup table-t fokonként a kívánt méréstartományra (számítógépen legenerálod, adott hőmérsékleten mennyi is az ADC értéke, majd megkeresed a táblában melyikhez van legközelebb). Egy fokon belül pedig linearizálod a mérést (már elég jó közelítést ad majd), pl. 507 és 512 a lookup table-ben az 50 és 51 fokokhoz tartozó érték, neked 510 az ADC-d tehát a hőmérséklet kb. 50,6 lesz (persze mondjuk a százszorosával számítasz, hogy egész értékkel dolgozhass).
(#) Sick-Bastard válasza Sick-Bastard hozzászólására (») Szept 12, 2015 /
 
Megoldva.
A hiba a SPM_Page_Erase() és a SPM_Page_Write() funkciók közé beillesztett SPM_RD_EN() volt, ami az RWWSB bitet volt hivatott resetelni a RWWSRE bit aktiválásával. Ezzel a lépéssel az átmeneti puffer automatikusan törlődött, mintha nem is töltöttem volna fel.
Idézet:
„24.8.2 Filling the Temporary Buffer (Page Loading)
...The temporary buffer will auto-erase after a Page Write operation or by writing the RWWSRE bit in SPMCSR. ...”
(#) attika hozzászólása Szept 12, 2015 /
 
Mi a különbség a Hex és A Bin fájl között,azon túl,hogy az egyik az,Bin 7,94KB a Hex 22,3KB?
De mindegy melyiket égetem bele mert mind a kettővel működik,de miért?
Következő: »»   690 / 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