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   227 / 840
(#) tibibalogh520 válasza SmithWebster hozzászólására (») Máj 27, 2010 /
 
Írd le azt is, hogy mit néztél el.
Hátha később más is okulhat belőle.
(#) SmithWebster hozzászólása Máj 27, 2010 /
 
Hát...
A AvrStudioba a csatlakozás után a Fuses fülnél a verify-t nyomogattam csak. Én magam sem értem, hogy miért hittem, hogy azzal fogja beállítani. Azt hiszem fáradt voltam/vagyok... Szóval a CKDIV8 pipa kiszedése után program gomb, aztán átállítottam az ISP frekit és működött.

Üdv.
(#) NickE hozzászólása Máj 27, 2010 /
 
Atmelék csak úgy hirtelen felindulásból megduplázták az áraikat? Oké, hogy gyenge a forint, de ez ~20% emelést indokolna, nem 100%-ot.
(#) Sir-Nyeteg válasza NickE hozzászólására (») Máj 27, 2010 /
 
Le vagy maradva... a téma ki lett beszélve a HEStore topicban is, meg itt is már. Válságkor leálltak a gyártással, kifogytak a készletek, és ezt csak most érezzük... Megjelentek a kínai AVR hamisítványok, és van amelyik procinak négyszeres lett az ára.
(#) Axel hozzászólása Máj 27, 2010 /
 
OFF:
De jó is ez a (v)álság, hogy minden áremelést van mire fogni :boxer: (Most itt nem a HEStore-ra gondolok konkrétan)
ON:
(#) zombee hozzászólása Máj 27, 2010 /
 
Sziasztok, kivételesen most én kérdezek...

Adott az AVRStudio4, és C-ben írok programot ATMega16-ra.
Ha két "unsigned char" számot kivonok, összeadok, vagy egyiket csökkentem/növelem 1-el egy while ciklusban, hirtelen több mint 3000 byte-al nő meg a kód.
Optimalizálás: "Os" - a többinél még nagyobb lesz.

miért?
(#) v alaki hozzászólása Máj 27, 2010 /
 
Sziasztok.
Előre annyit, hogy azért kérdezek kicsit általánosan mert rá szertnék jönni a problémám megoldására, de egy ideje nem jutok előbre. (ha kell felrakom a kódot is)
Feladat, hogy az ADC-re potmétert kötök. A feszültséget egy másik lábon PWM-en keresztül vissza adja.

A tünet; KB fél-táp feszültségig minden jó utánna a szépen világosodó LED kialszik.
Korrektül játszik minden oda-vissza.
A fél-táp nagyon gyanús, de az ADC referenciájának a tápfesz van beállítva.
Néztem jobbról-balra, elölről-hátulra, de mindig ugyanezt csinálja.
Mit néztem be?
(#) Moderátor hozzászólása v alaki hozzászólására (») Máj 27, 2010
 
Forráskód nélkül kevés az információ. Biztosan kiszúrják a hibát, akár többen is, ha felrakod.
(#) v alaki válasza (») Máj 27, 2010 /
 
Értem.
Az a másik gépen van, holnap felteszem.
(#) zombee válasza (») Máj 27, 2010 /
 
Elég nagy a kód, megpróbálom a problémát jelentő kb 10 sorra leegyszerűsíteni, új projektben.
Gondoltam, más is találkozott már vele, de úgy néz ki hogy valamit nem tudok .
(#) puli122 válasza v alaki hozzászólására (») Máj 27, 2010 /
 
Ez így elsőre nekem úgytünik hogy nem egyezik az AD átalakító és a pwm felbontása. Ha nem állítasz rajta akkor a pwm 8 az AD pedig 10 bitesen üzemel. Ha egyformára állítod mennie kéne. Persze lehet hogy hülyeség amit írok
(#) zombee válasza (») Máj 27, 2010 /
 
Íme egy forráskód amit leegyszerűsítettem kevesebb 20 sorra.
A lényeg, hogy "Os" optimalizálással 3848 byte-ot ad, az adatszegmensben pedig 264 byte-ot foglal.

Valahol a delay_ms -nél van a gebasz, mert ha konstanst adok neki,
vagy olyan változót aminek a while ciklusban nem változtatom az értékét, akkor alig növeli a kódot...

A kód innen letölthető!
(#) trudnai válasza zombee hozzászólására (») Máj 27, 2010 /
 
A _delay_ms float tipussal megy, tehat ha azt hasznalod akkor automatan berantja a float rutinokat, attol no meg a kod.
(#) zombee válasza trudnai hozzászólására (») Máj 28, 2010 /
 
Szóval hívjam meg 1 értékkel egy for ciklusba?
Mert ha konstanst adok át neki akkor nem nő a kód...

Egyébként érdekes, hogy a delay_us is hasonlóan viselkedik.
(#) Norberto válasza zombee hozzászólására (») Máj 28, 2010 /
 
Ha úgy működik, akkor ez egy lehetőség a megoldásra, és örülni kell neki.

De például az az út is járható, hogy saját késleltető rutint kreálsz, vagy keresel a neten, ami nem float-okkal küszködik. Esetleg assembly szárnyasbetétet is ki lehetne próbálni, ha sok időd van és szeretsz kísérletezgetni. (A szárnyas nem célzás, csak humorizálás.)
(#) trudnai válasza zombee hozzászólására (») Máj 28, 2010 /
 
Idézet:
„Szóval hívjam meg 1 értékkel egy for ciklusba?”


Latom hamar raerzel a lenyegere Ahogy Norberto mondta, ezt a for ciklusos dolgot beteheted a sajat fuggvenyedbe, aminek a parametere egy int, azt csokkentgeted a for helyett egy while-al ameddig nulla nem lesz. Es akkor kesz is vagy, van egy nem float-os delay_ms -ed.

Valahogy igy:
  1. void wait_ms ( unsigned int ms ) {
  2.     while ( ms-- ) {
  3.         _delay_ms(1);
  4.     }
  5. }
(Nem probaltam ki csak lefirkantottam gyorsan, ha hibas akkor elnezest kerek)
(#) zombee válasza trudnai hozzászólására (») Máj 28, 2010 /
 
Az elv a lényeg, nem a kód 100% helyssége.

Eddig for ciklussal játszottam, végülis a while is jó.
Egy külön függvénybe szebb is lesz...
(#) Axel hozzászólása Máj 28, 2010 /
 
Sziasztok!

Mi lehet a hiba az alábbi kódban?
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. int main(void) {
  4.               DDRB = (1<<PINB0)|(1<<PINB1)|(0<<PINB4);
  5.                                  
  6.                                  while(1){
  7.                                  PORTB = (1<<PB1);
  8.                                  if(PINB4==1){
  9.                                  _delay_ms (250);
  10.                                  PORTB=(1<<PINB0);
  11.                                  _delay_ms (1500);
  12.                                  }
  13.                                  return 0;
  14.         }
  15.         }


Amit szeretném ha csinálna: A PORTB1 kimenetként van beállítva. Ezt a kimenetet egy gombot közbeiktatva rákötöm a bemenetként konfigurált PORTB4-re. Ha gombot lenyomom azt várnám, hogy a PORTB0-ra kötött LED kigyulladjon. De nem ezt teszi. Mit rontottam el?

Köszi szépen!
(#) icserny válasza Axel hozzászólására (») Máj 28, 2010 /
 
Idézet:
„Mit rontottam el?”

  1. DDRB = (1<<PINB0)|(1<<PINB1)|(0<<PINB4);
  2. //                                                               ---------------

Például a megjelölt részt:
1. Bitet törölni ÉS művelettel lehet, nem VAGY-gyal!
2. (0<
Én ezzel próbálkoznék:
  1. DDRB = (1<<PINB0) | (1<<PINB1) & ~(1<<PINB4);
(#) (Felhasználó 4577) válasza icserny hozzászólására (») Máj 28, 2010 /
 
A forráskód nem látszik rendesen, mert a fórum motor html tag-ként kezelte.
(#) icserny válasza (Felhasználó 4577) hozzászólására (») Máj 28, 2010 /
 
Látom, s sajnos a javítás sem sikerült. Szóval elmondom szóban: az utolsó taggal van probléma. Nem Vagy kapcsolat kell, s nem a nulla léptetése kell, hanem a balratolt egyes komplementálása (maszk)

Még egy megjegyzés: ha értékadással történik DDRB megadása, akkor az összes bitjét illene tisztességesen beállítani...
(#) Sir-Nyeteg válasza icserny hozzászólására (») Máj 28, 2010 /
 
Én mindig csak és kizárólag vagy kapcsolattal és 0-1-gyel állítottam a ki és bemeneteket, sosem volt vele gondom...
(#) gtk válasza Axel hozzászólására (») Máj 28, 2010 /
 
Gondold at a kodot, abszolute nem jo.
(#) Axel hozzászólása Máj 28, 2010 /
 
Most egy kicsit összezavarodtam a post-ok közt. Hol is van tulajdonképp a hiba? Nem türelmetlenkedni akarok csak a portok logikai állapotának olvasása nagyon fontos lenne nekem most mert írok egy programot és hiába van kész az algoritmus elve ha már itt megakadok
(#) Axel válasza gtk hozzászólására (») Máj 28, 2010 /
 
Sajnos nem tudom jobban átgondolni mert nagyon az elején járok ennek az egésznek ezért is kérek segítséget. Hidd el kérlek, hogy alaposan átgondoltam én ezt mielőtt postoltam.
De azért leírom mit gondolok:
Beállítok 3db portbitet. Kettőt kimenetnek egyet bemenetnek. Nyitok egy végtelen ciklust. A portb 1. bitjére kiadom a logikai egyest. Ha ezt a logikai egyest a portb 4.-edik bitjén "viszontlátom" akkor az if törzsében az utasítás végrehajtódik. 250-es delay a pergés miatt. Kinyitom a pb0-t amina led van. Ez ég 1,5 sec-ig aztán kezdődik minden elölről. Ebben az elgondolásban én sajnos nem tudom mi a hiba. :no:
(#) (Felhasználó 4577) válasza Axel hozzászólására (») Máj 28, 2010 /
 
  1. PINB4==1

Ez nem port kiolvasás, vagyis nem megfelelő...
Egyszer már írtam egy példát a port kiolvasásra, de úgy látom feleslegesen jártattam a számat.

A PORTB1-et nem fogod kimenetnek beállítani, mert olyan nincs. PINB1, másnéven PB1 van.
Nem értem mi értelme van annak, hogy az egyik portot a másikra kötöd.

Írok Neked egy main függvényt a gombnyomásra LED bekapcsolásra:
  1. int main()
  2. {
  3.         DDRB = (1<<PB1); //PB1 kimenet, minden más bemenet
  4.         PORTB |= (1<<PB4); //Mivel PB4-re lesz kötve a gomb, bekapcsoljuk a felhúzóellenállást
  5.  
  6.         while(1) //Végtelenciklus...
  7.         {
  8.         if( !(PINB & (1<<PB4)) ) //PB4 vizsgálata
  9.                 PORTB = (1<<PB0); //PB0 bekapcsolása, ha a gomb nyomva van
  10.                 else
  11.                 PORTB &= ~(1<<PB0); //PB0 kikapcsolása, ha a gomb fel van engedve
  12.         }
  13.  
  14. }


Kimenetnek nem kell beállítani semmit se. Minden bit értéke a DDR regiszterben alapból nulla, azaz bemenet...
Olyat, hogy
  1. (0<<valami)

nem írunk regiszter címzéskor. A fenti példaprogramban láthatod, hogy mit írunk helyette.

Remélem tudtam segíteni.
(#) Axel válasza (Felhasználó 4577) hozzászólására (») Máj 28, 2010 /
 
No kipróbáltam. Sajnos nem jó ez sem nálam. A LED haloványan világít csak és folyamatosan. Ha megnyomom a gombot elenyészően nő a fénye. Egyébként kipróbáltam azt is amit a múltkor írtál de nem jött be sajnos. Azért kötöm egyik portot vissza a másikra mert mátrixbillentyűzetes kapcsolást akarok építeni és az pontosan ugyanezen az elven működik.

A hasznos infókat köszömöm!
(#) simib hozzászólása Máj 28, 2010 /
 
Sziasztok!

Kérdésem a következő lenne:
Létezik ez az AVR DMX nevezetű pc-s fényvezérlő, ez végülis mindegy hogy micsoda. A lényeg hogy abban egy AT90S8515 van. Ezt lehetne helyettesíteni egy AT89S52-vel (azért ezzel, mert ez van nekem itthon)?
Ahogy néztem az adatlapokat a lábkiosztás nekem egyformának tűnt. Program átírása nélkül lehetséges a csere? Sajnos csak a hex file van meg, forrást nem találtam.

Köszönöm a válaszokat!
(#) trudnai válasza Axel hozzászólására (») Máj 28, 2010 /
 
variszabi peldajaban van egy apro hiba, PB1-et teszi kimenetnek, de PB0-t kapcsolgatja -- gyakorlatilag az a felhuzo ellenallast fogja csak kapcsolgatni a PB0-n. Ja es a masik apro hiba, hogy lekapcsolja a felhuzast a PB4-en, ha a gombot megnyomod. A felhuzas amugy 20k kornyekere teheto, tehat a halvagy vilagitas aktiv modban megmagyarazhato ha a PB0-n van a LED-- de passziv modban nem tudom mi van -- melyik portra kototted a LED-et?
(#) (Felhasználó 4577) válasza Axel hozzászólására (») Máj 28, 2010 /
 
Nem próbáltam ki, csak miután megírtam újra átnéztem, működnie kell. Trudnai, kérlek javíts ki, ha nem.

Csatoltam egy kapcsolási rajzot és egy forráskódot. Véletlenül bukkantam rá az Interneten, "Majd jó lesz valamire." címszóval. Nézd át, értsd meg a logikáját és halászd ki a lényeget.
Következő: »»   227 / 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