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   178 / 840
(#) trudnai válasza (Felhasználó 4577) hozzászólására (») Jan 23, 2010 /
 
Kulon valasztod a szegmenseket portonkent... Tehat pl.

  1. #define p1MASK 0x07 // bits 2..0
  2. p1LED[10]={....}; // a, b es c szegmensek
  3. #define p2MASK 0x0E // bits 3..1
  4. p2LED[10]={....}; // d, e es f szegmensek


A kijelzo fuggvenyedben kimaszkolod a LED-eket, es be-OR-olod a LED biteket... minden portra termeszetesen... Semmi extra nincs ebben...
(#) janyjozsef válasza MrMarcee hozzászólására (») Jan 23, 2010 /
 
Ez jó lenne.
Viszont sokáig kellene gyűjteni az adatokat.

Még egy.

Ennyi adatot hol akarsz letárolni?

100millió byte => 100mega byte.
Vagy ha bit akkor 12.5mega byte.
SDRAM?

Még ha 10milliót akarsz is.
10mega byte
vagy bitenként 1.25mega byte.
SDRAM?

(#) MrMarcee válasza janyjozsef hozzászólására (») Jan 23, 2010 /
 
Nekem csak a randomolt 0-k és 1-ek száma kell. nem kell tárolnom minden. Mikor bejö az info a randomról, hogy 1 vagy 0, akkor azszerint növelem hozzájuk tartozó változó értékét. így kétszer 4 byte-ba elfér 1-1 változóba 4,2 milliárd adat. tehét 8,4 milliárd random elférne így.

Hogy tisztázzuk a dolgokat
Discovery-n volt egy műsor, abba volt, hogy csináltak eszközt, ami egész nap "pénzérmét dobált fel", tehát 0t és 1t randomolt. Sok évig csinálták, és azt akarták bebizonyítani vele, hogy az emberek hangulata, meg érzései befolyásolják a véletlenszerűséget. Példának hozták szept 11-et, hogy akkor nagyon eltért az 50-50%tól.
Na ezért akarok iylet építeni, hogy kipróbáljam. Például sulibe felelés előtt, mennyiben változik meg. Ennek az egyetlen hibája valóban az, hogy sokáig kell futnia, hogy elég random legyen. Ezt kéne valahogy kiküszöbölni.
(#) (Felhasználó 4577) válasza trudnai hozzászólására (») Jan 23, 2010 /
 
Közben megjött az ihlet, köszönöm!
Azt találtam ki, hogy két konstans-t hozok létre, egyet a PORTC-re és egyet a PORTD-re.
(#) (Felhasználó 4577) válasza trudnai hozzászólására (») Jan 23, 2010 /
 
Most néztem, hogy csak a nyomógombok miatt tűnt úgy, mintha a portc-n lennének a szegmensek, de mind a PORTD-n vannak.
(#) MrMarcee válasza janyjozsef hozzászólására (») Jan 23, 2010 /
 
Idézet:
„Az 100MHz a kimeneten és még ehhez számolni (RND) is akarsz?

ATMEGA esetém a 10MHz is lehetetlen. Mer 16MHz / 2 (be/ki) és a ciklusidő még nincs is benne.”


100 Mhz az 100 millió másopercenként. De nekem percenként kell a 16/2 az akkor 8 Mhz, az 60 sec-re 480 millió. tehát 1 percbe belefér az a 100 millió.
(#) Thowra válasza edison14 hozzászólására (») Jan 23, 2010 /
 
Üdv!
Topi tanácsát megfogadva megpróbálok beszerezni egy AVR t amin gyakorolhatok és építek hozzá egy programozót. A piceket vagy grafikus úton (Parsic) vagy basic nyelven programoztam, C vel is próbálkoztam de kevés volt a leírás.
Pár hete tanulok ASM t, lassan azzal is megbarátkozok.
(#) herzsolt hozzászólása Jan 23, 2010 / 1
 
Tudna valaki feltölteni egy olyan c-ben íródót progi részletet, amely abban segíteni, hogy egy LCD-n először kiír valamilyen azonosító szöveget, és utána tovább fut a főprogira? Mert eddig csak az sikerült, hogy kiír valamit, de nem megy tovább.
(#) harald hozzászólása Jan 23, 2010 / 1
 
Sziasztok lenne egy kérdésem Az Avrek mennyire kényesek az 5 voltos tápra meg a párhuzamos portról való programozásra a helyzet az hogy van volt két attiy45
bele égettem párhuzamos porton egy programot a tápot a számítógép usb portjáról vettem mint később megmértem 5,6volt elsőre működött kellett végeznem egykét módosítást és egyszer csak nem ismerte fel az avrt beletettem a másikat elsőre aztis felismerte utána nem(lehet hogy elszállt ?) sajnos nincs a környezetemben senki ahol kipróbálhatom most akarok beszerezni egy usbs égetőt a Hestoreból csak reménykedem hogy ezeket még fel lehet éleszteni vala hogyan
Köszönök minden segitséget mert elég kezdő vagyok

4b.gif
    
(#) gtk válasza harald hozzászólására (») Jan 23, 2010 /
 
Inkabb fuse bit problema lehet. 6V-ig kellene mukodjon.
(#) harald válasza gtk hozzászólására (») Jan 23, 2010 /
 
picit részletesebben légyszi mit lehet ilyenkor tenni?
(#) vzoole válasza herzsolt hozzászólására (») Jan 23, 2010 / 1
 
(#) gtk válasza harald hozzászólására (») Jan 23, 2010 /
 
Nem megfelelo fuse bit beallitas eseten "kizarhatod magad" az AVRbol, azaz nem tudod programozni. Kulso orajelet kell adni ra es ujra probalni. Volt sokszor szo rola itt.
(#) harald válasza gtk hozzászólására (») Jan 23, 2010 /
 
Értem olvastam rólla Köszi a segitséget megpróbállom
(#) herzsolt válasza vzoole hozzászólására (») Jan 23, 2010 /
 
Megnéztem köszi. Itt a progi részlet amivel kinlódom:
  1. void main(void)
  2. {
  3.         avr_init();
  4.  
  5. while (1)
  6. {
  7. // initialize the LCD for
  8. // 2 lines & 20 columns
  9. lcd_init(20);
  10.  
  11. // go on the second LCD line
  12. lcd_gotoxy(0,1);
  13.  
  14. // display the message
  15. lcd_putsf("Hello world");
  16. }
  17. {
  18.         adc_data=read_adc(0);
  19.         T = adc_data / 2;
  20.                      
  21.         pwm_val = Kp * (ee_tmprSet - T + T0);
  22.        
  23.         if (pwm_val > 1023) pwm_val = 1023;
  24.         if (pwm_val < 0) pwm_val = 0;
  25.        
  26.         if ((T > (ee_tmprSet - 6)) && (T < (ee_tmprSet + 6))) {
  27.                 green();
  28.         } else {


Ha így hagyom akkor villogtatja az LCD-t, ha berakom a lcd_putsf("Hello world"); után a while (1);-est akkor nem, csak folyamatosan kiírja, de nem lép tovább a födolgokra.
Mit rontok el?
(#) Moderátor hozzászólása herzsolt hozzászólására (») Jan 23, 2010
 
Kód beillesztést használd kérlek máskor.
(#) Topi válasza herzsolt hozzászólására (») Jan 23, 2010 /
 
Ha struktúráltan írnád a program sorokat, látod, hogy az (itt most) 16. sorban bezárod a while-t... És mivel while(1) van, ezért abból sosem jön ki. Nem is hajtódnak végre az alatta lévő 18.-tól kezdődő sorok...
(#) herzsolt válasza (») Jan 23, 2010 /
 
Elnézést, köszönöm a segítséget, máskor odafigyelek.
(#) herzsolt válasza Topi hozzászólására (») Jan 23, 2010 /
 
Segítenél ezt a kis részt átalakítani?
Ha iegen akkor hálás köszönetem érte.
(#) vzoole válasza herzsolt hozzászólására (») Jan 23, 2010 /
 
jujjjjjjjjjjjjjjjjj +100j

Bocsi, de rajtad inkább egy C alapok füzet/jegyzet/könyv segítene.
(#) (Felhasználó 4577) hozzászólása Jan 23, 2010 /
 
Sziasztok!

Van egy ADC konverzióm.
A visszaadott értéket átalakítom feszültséggé, majd egy másik értékké.
Ez a másik érték max. +/- 15-öt ugrál. Egy oldalon találtam egy digitális low-pass szűrőt, amit pár paraméter alapján kalkuláltam ki. Ezt beleraktam és sokkal jobb lett, már csak 3-at ugrál, ezt is sokkal ritkábban.
Hogyan lehetne digitálisan még ezt is kiszűrni?
(#) trudnai válasza herzsolt hozzászólására (») Jan 23, 2010 /
 
Nem tudom hogy ebben hol a LED villogtatas? Vagy epp az nincs benne? Ahogy mar emlitettek indentalnod kellene, hogy jobban lasd mi mihez tartozik. Ezt megteheted automatikusan is, sok szovegszerkesztonek van ilyen finkcioja, pl VIM alatt az elso soron nyomsz egy "g+" -t es mar kesz is. Vagy linux alatt indent nevu parancs -- csak azt persze be kellene parameterezni. Vagy keress ra C beutify-ra a google-ban, vannak olyanok amik online megcsinaljak neked...

Pl. a fent emlitett VIM ezt csinalja:
  1. void main(void)
  2. {
  3.     avr_init();
  4.  
  5.     while (1)
  6.     {
  7.         // initialize the LCD for
  8.         // 2 lines & 20 columns
  9.         lcd_init(20);
  10.  
  11.         // go on the second LCD line
  12.         lcd_gotoxy(0,1);
  13.  
  14.         // display the message
  15.         lcd_putsf("Hello world");
  16.     }
  17.     {
  18.         adc_data=read_adc(0);
  19.         T = adc_data / 2;
  20.  
  21.         pwm_val = Kp * (ee_tmprSet - T + T0);
  22.  
  23.         if (pwm_val > 1023) pwm_val = 1023;
  24.         if (pwm_val < 0) pwm_val = 0;
  25.  
  26.         if ((T > (ee_tmprSet - 6)) && (T < (ee_tmprSet + 6))) {
  27.             green();
  28.         } else {
...es ebbol mar lathatod is mire gondolt Topi...
(#) herzsolt válasza vzoole hozzászólására (») Jan 23, 2010 /
 
Köszi a segítséget, de az alap progi működik, csak ilyett még nem csináltam, hogy a progi előtt legyen egy név kiírás, de majd akkor valahogy más hogy.
(#) gtk válasza trudnai hozzászólására (») Jan 23, 2010 /
 
Indent-nek elegendo akar csak a bemeno es kimeno parameter is
  1. indent prog.c -o prog.c

(#) trudnai válasza gtk hozzászólására (») Jan 23, 2010 /
 
Na jo, csak akkor ugy formazza be ahogy az nekem nem tetszik
(#) vzoole válasza herzsolt hozzászólására (») Jan 23, 2010 / 1
 
1 - linkeltem neked mintaprogramot amiben van ilyen "köszönő" funkció.
2 - elmondták mi a hiba... elakad a while függvényben.

Sajnos ennél többet már nem lehet segíteni, max megírni helyetted a programot. De azt ugye te se szeretnéd, mert akkor nem tudod mit miért csinál.


Itt a progid kicsit összeszedve...
Írd le nekem lépésenként mit csinál (vagy mit kéne)!

  1. void main(void) {
  2.    
  3. avr_init();
  4.    
  5.     while (1) {
  6.         lcd_init(20);
  7.         lcd_gotoxy(0,1);
  8.         lcd_putsf("Hello world");
  9.     } // while(1)
  10.    
  11.     // { << ez itt mi???
  12.        
  13.     adc_data=read_adc(0);
  14.     T = adc_data / 2;
  15.  
  16.     pwm_val = Kp * (ee_tmprSet - T + T0);
  17.  
  18.     if (pwm_val > 1023) pwm_val = 1023;
  19.     if (pwm_val < 0) pwm_val = 0;
  20.  
  21.     if ((T > (ee_tmprSet - 6)) && (T < (ee_tmprSet + 6))) {green();}
  22.     else {}
  23.     //... amradék progi
  24. } // main(void)
(#) herzsolt hozzászólása Jan 23, 2010 /
 
Természtesen nekem kell megcsinálni, mert abbol tanulok.
De azért köszönöm.
(#) herzsolt válasza vzoole hozzászólására (») Jan 24, 2010 /
 
Sikerült megoldanom
Most már müködik.[code=c]void main(void)
{
avr_init();
lcd_init(20);
lcd_gotoxy(0,1);
lcd_putsf("Forrasztoallomas");
delay_ms(2000);
while (1)
{˝/code]

Köszönöm a segítséged.
(#) herzsolt válasza herzsolt hozzászólására (») Jan 24, 2010 /
 
  1. void main(void)
  2. {
  3.         avr_init();
  4.         lcd_init(20);
  5.         lcd_gotoxy(0,1);
  6.         lcd_putsf("Forrasztoallomas");
  7.         delay_ms(2000);
  8.     while (1)
  9.     {


Sikerült megoldani.
Köszönöm
(#) herzsolt válasza herzsolt hozzászólására (») Jan 24, 2010 /
 
Elnézést a moderátortól és minden fórum használótól a (#615534) hozzászólásom miatt, most már sikerült használnom a kod beillesztőt.
Következő: »»   178 / 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