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   201 / 841
(#) Békabácsi válasza puli122 hozzászólására (») Márc 25, 2010 /
 
Szia!

Nemcsak a bátorításod miatt kérdezek

Egy kicsit elméleti a kérdéskör, amit feszegetek, de uC témában még kezdőnek számítok (a programozásban nem, de az más tészta).

Azt hiszem, Topi AVR-PIC cikkében (de lehet, hogy a Nullától a robotokig-ban) olvastam, hogy először tessék assemblerben programozni tudni a mikrovezérlőket, aztán jöhet a többi (C, BASIC, stb.).

Véleményem szerint, ha teljesen magadénak érzed a uC "logikáját", akkor -és egyébként is csak akkor- tudod működésre bírni az eszközt, ha tényleg tudod, hogy mi hol van.

Kétségtelen, hogy rendszerközeli nyelven lehet a legoptimálisabb és pontosabb kódot készíteni, de -bár ez csak az én véleményem- feleslegesnek érzek több órányi kódolási munkát, hogy pl. egy LCD-vezérlést megvalósítsak (mondjuk egy többszintű menükezelést). Igen, tudom, hogy elegendő egyszer "kitalálni" és include, vagy saját rutingyűjtemény, de...

És pont ezek miatt gondolom, hogy jó dolog egy ilyen multifunkciós kísérleti panel...

Összedugdosom a hardvert és aztán "kikísérletezem" a szoftvert

Mert hiszen pont ez a mikrovezérlők lényege, hogy a korábban minden-a-hardver elvet el lehet vinni a minimális-hardver-sok-szoftver irányába (hiszen mennyivel könnyebb egy szoftvert módosítani).

Hogyan látod Te ezt a kérdéskört?

Békabácsi
(#) (Felhasználó 4577) válasza frankopeter hozzászólására (») Márc 25, 2010 /
 
Idézet:
„AZT PRÓBÁLD MEGÉRTETNI, hogy ha külső órajel generátort használok, akkor az lehet nem pont 8Mhz-es? Hanem mondjuk 4Mhz-es, mert a saját frekvenciáját "erölteti" az ic-re?”

Leírtam a választ.

Idézet:
„TUDOM MEGLEPŐNEK TŰNHET: de még nem néztem bele a delay.h fájlba. ... Meglepett a "delay.h" fájl. Fizikus? Elmagyaráznád a delay.h fájlt?”

Hát akkor mondjuk nézz bele, senki se fogja elmagyarázni.

Most pont ugyan ez megy a PICKIT2 építése témában is.
(#) puli122 válasza Békabácsi hozzászólására (») Márc 25, 2010 /
 
Igen, egyetértünk ha jól látom mindenben amit írtál

Abszolút igaz hogy érdemes tisztában lenni az alacsony szintű programozás (assembler) legalább alapjaival. Vannak előnyei természetesen, DE én mégis könnyebbnek, gyorsabbnak találom a Basic vagy C nyelvet.
Azt is figyelembe kell vennünk hogy egy kezdő aki még soha nem csinált ilyet, sokkal előbb ér el sikereket pl: Basic-ben mint bármi másban. És ugye a sikerélmény fontos, a továbblépéshez.
A panelről meg annyit, hogy azért is született meg, hogy minél egyszerűbben-gyorsabban-átláthatóbban lehessen kezelni az alap perifériákat. És ha már valamit összedugdostál, lehet izgatni a szoftvert összevissza. Ebből lehet tanulni szerintem a legjobban.
(#) Fizikus válasza frankopeter hozzászólására (») Márc 25, 2010 /
 
Igen, ha külső kristály adja az órajelet, akkor "ráerőlteti" a saját frekvenciáját az IC-re.
Az adatlapban 3 működési mód szerepel, amelyek más-más frekvenciatartományra lettek optimalizálva. Ezért ha nem tudod, hogy melyiket jelölted ki, akkor a próbálkozás marad.
Pl. a 3-8 MHz közötti frekvenciatartományban mindegy hogy milyen kristályt használsz csak legyen 3 és 8 MHz között. Jó a 4 MHz-es is, de a 8MHz-es 2 módot is lefed.
Ha az utolsó módot választottad ki, akkor mindenképpen 8MHz, vagy annál nagyobb sebesség kell.

delay.h : helyetted nem tudok megtanulni biciklizni, azt neked kell megtenned. Segiteni tudok, de ha ilyen hangnemben folytatod, akkor nem tudom hogy akarok-e.

ATtiny45.jpg
    
(#) toMI-DBT válasza toMI-DBT hozzászólására (») Márc 25, 2010 /
 
senkinek semmi ötlete ez ügyben? Találkozott már valaki ilyen gonddal? ( sei van minden normális, egy ledet akarok felvillantani, -os-el nem megy -o0-val meg igen... )
(#) (Felhasználó 4577) válasza toMI-DBT hozzászólására (») Márc 25, 2010 /
 
Másold be a forráskódot és megnézzük.
(#) toMI-DBT válasza (Felhasználó 4577) hozzászólására (») Márc 25, 2010 /
 
  1. #include <avr/io.h>            
  2. #include <util/delay.h>
  3.  
  4. #include <avr/interrupt.h>
  5.  
  6. #define F_CPU 8000000UL
  7. #define SEI() asm("sei")
  8. #define CLI() asm("cli")
  9.  
  10.  
  11. void timerinit(void);
  12. void adcinit(void);
  13. void adc_start_conversion(uint8_t channel);
  14.  
  15. uint8_t ad,cnt0;
  16.  
  17. int main (void)
  18. {
  19. sei();
  20. DDRC=(1<<PC5);
  21. timerinit();
  22.  
  23.                 while(1)
  24.                 {
  25.  
  26.                         if(ad==1)
  27.                                 {
  28.                                         PORTC = (1<<PORTC5);
  29.                                        
  30.                                         //ad=0;
  31.                                 }
  32.  
  33.  
  34.  
  35.  
  36.                 }
  37.  
  38.  
  39.  
  40.  
  41. return 0;
  42.  
  43.  
  44. }
  45.  
  46. ISR(TIMER1_COMPA_vect)
  47.         {
  48.         cnt0++;
  49.  
  50.         if(cnt0==100)
  51.                 {
  52.                 ad=1;
  53.                 cnt0=0;
  54.                 }
  55.  
  56.         }
  57.  
  58.  
  59. void adcinit(void)
  60.         {
  61.         ADMUX|=(1<<REFS0)|(0<<REFS1);
  62.         ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
  63.         }
  64.  
  65. void adc_start_conversion(uint8_t channel)
  66.         {
  67.         ADMUX=(ADMUX&0xF0)|channel;
  68.         ADCSRA |= (1<<ADSC);
  69.         }
  70.  
  71.  
  72. void timerinit(void)
  73.         {
  74.         TCCR1B|=(1<<WGM12)|(1<<CS10);
  75.         TIMSK1|=(1<<OCIE1A);
  76.         OCR1A=10000;
  77.         }
(#) (Felhasználó 4577) válasza toMI-DBT hozzászólására (») Márc 25, 2010 /
 
uint8_t ad,cnt0; helyett volatile unsigned int ad,cnt0;
Szerintem ennyi csak.
(#) gtk válasza toMI-DBT hozzászólására (») Márc 25, 2010 /
 
Van valami oka annak hogy letrehozod a SEI, CLI makrokat es megis a sei(); makrot hasznalod? Amugy ennek az asm bejegyzesnek nem art utanna nezni, en azt hiszem ez is volatile kell legyen, de bovebben az avr-libc dokumentacioban,..
(#) (Felhasználó 4577) válasza gtk hozzászólására (») Márc 25, 2010 /
 
Szerintem is felesleges. Az AVR-GCC interrupt.h-ban alapból van sei(); és cli(); így felesleges Assembly-vel megoldani.
Mivel a kis és nagybetűk közt különbséget tesz, így ki is lehet törölni azokat a makrókat.
(#) toMI-DBT válasza (Felhasználó 4577) hozzászólására (») Márc 26, 2010 /
 
nem jó úgy se
(#) toMI-DBT válasza gtk hozzászólására (») Márc 26, 2010 /
 
kipróbáltam vele és nélküle nem működik... Sok értelme nincsen csak miért ne?
(#) ATtiny válasza toMI-DBT hozzászólására (») Márc 26, 2010 /
 
Szia!

A problémák, amiket látok: a megszakításban használt változók deklarálásához kell a volatile előtag. Nincsenek értékek adva a változóknak a program elején, pedig szinte azonnal vizsgálod az értéküket. O0 -ás optimalizációs szint esetén elképzelhető, hogy a fordító minden változót nulláz a program elején. Os -es opció esetén már egyáltalán nem biztos ez. És végül nem látom a kódodban, hogy, hol kapcsolod ki a LED-et. Az egyértelmű, hogy mikor kapcsolod be. Na de hol van a kikapcsolása?
(#) toMI-DBT válasza ATtiny hozzászólására (») Márc 26, 2010 /
 
direkt nem kapcsoltam ki mert ha jól működik a megszakítás akkor ég ha nem akkor nem de köszi megpróbálom, azt hittem valami beállítás gond van...
(#) frankopeter válasza (Felhasználó 4577) hozzászólására (») Márc 26, 2010 /
 
"Leírtam a választ.": köszi.
Inkább Ctrl+c, Ctrl+v ahol megtalálom.
Kevesebb karaktert kellett volna használni.

És én is jobban érezném magam.


"Hát akkor mondjuk nézz bele, senki se fogja elmagyarázni."

Belenéztem, de kössz hogy ilyen segítőkész vagy.
Körübelül mint az "XP F1" (help).


"Most pont ugyan ez megy a PICKIT2 építése témában is."

Ezt a választ köszönöm. Átnézek oda.
Peti
(#) frankopeter válasza Fizikus hozzászólására (») Márc 26, 2010 /
 
Kösz a választ.
Beszerzek még két kristályt.
Köszönöm biciklizni tudok.
A hangnemért bocsánat, csak gondoltam idézlek, és a
saját szavaiddal kezdem a mondataimat.
(#) (Felhasználó 4577) válasza frankopeter hozzászólására (») Márc 26, 2010 /
 
Na jó, úgy látom nem veszed a lapot.
(#) Békabácsi válasza puli122 hozzászólására (») Márc 26, 2010 /
 
Igen, tényleg mindenben egyetértünk

Azért még "megvárom" a 40-lábú változatot; sok sikert hozzá!

BB
(#) frankopeter válasza (Felhasználó 4577) hozzászólására (») Márc 27, 2010 /
 
Nemszeretek kártyázni. Najó! ABohnanza-t szeretem.
(#) frankopeter hozzászólása Márc 27, 2010 /
 
Hello.

Kérdésem van:

A led villogtatós első program megértésénél járok.

"m_delay_10ms(100);"

Ez a sor elvileg 1s-os késleltetést ad.
Átnéztem közlekedési lámpás részbe, mert ott
van hasonló, csak 5s-os késleltetéssel.

" m_delay_10ms(500);"

értem hogy 10*500ms=5s, de ha ledvillogtatós "C" fájlt átírom, videó szerint rárakom az icre, akkor is 1 másodpercenként vált a led.

miért?
(#) (Felhasználó 4577) válasza frankopeter hozzászólására (») Márc 27, 2010 /
 
Konkrétan arra gondoltam, hogy a PICKIT2-s témában is ugyan ez megy, hogy elmondták egy a felhasználónak, hogy mi a probléma, mit nézzen meg, de ő nem nézte meg és egyfolytában csak azt hajkurászta, hogy mi a baja mi a baja.

Értsd meg, hogy senki se fog helyetted dolgozni. Az Interneten kismillió leírást találsz a delay.h-ról, senki se fog helyetted "belenézni".

Innentől részemről a problémáid lezárva, oldd meg ahogy akarod.
(#) frankopeter válasza (Felhasználó 4577) hozzászólására (») Márc 27, 2010 /
 
köszi. értem.
megértettem, de kellemestet fogok benned csalódni, ha nem kioktatással és helyesírási tanácsokkal segítesz, hanem a tudásod egy részét megosztod velem. szerintem én a tizede tudásodnak örülnék.
de abból már penge vagyok hogy ITT a helyesírási hiba és a kérdezés nagyobb gond mint a "nemtudás".


"Konkrétan arra gondoltam, hogy a PICKIT2-s témában is ugyan ez megy, hogy elmondták egy a felhasználónak, hogy mi a probléma, mit nézzen meg, de ő nem nézte meg és egyfolytában csak azt hajkurászta, hogy mi a baja mi a baja."

**************. bocsánat. itt kisípoltam magam.
SZERINTED én eddig, végig ugyan azt a kérdést raktam fel? mi a bajom mi a bajom: azért fórum hogy havalami van kérdezzek, nem? (oké, a forum szabályzatot nem olvastam el)
mindegy nem ér ez ennyi karaktert.
na csá.
(ha tiszteletlennek érzed a köszönést, igazad van)
(#) trudnai válasza frankopeter hozzászólására (») Márc 27, 2010 /
 
Idézet:
„m_delay_10ms(500);”

Nezd meg a fuggveny deklaraciojat:

  1. void m_delay_10ms(unsigned char val)

unsigned char max erteke mennyi is lehet?
(#) NagyKrisz válasza frankopeter hozzászólására (») Márc 27, 2010 /
 
char típus: -128...0.127
unsigned char típus: 0....255

Tudom javasolni a Programfejlesztés C nyelven című könyvet.
(#) niches hozzászólása Márc 27, 2010 /
 
Sziasztok!

ATmega164P-t programozok, és egy számomra kicsit furcsa dologra lettem figyelmes. Egy előző chipnél fordult elő, hogy a C port 2-es, 3-as, 4-es és 5-ös bitje úgy tűnt nem működik, mintha kiütöttem volna. Adatlapot gyorsan megnéztem mi lehet, és mint kiderült ezek a JTAG lábak. A leírás szerint ha a JTAGEN fuse bit nincs programozva, akkor ugye sima I/O pinként működnek ezen lábak.

Próbálgatásképpen ledekkel néztem a portot, de fuse bit ide-oda, sosem működött. Aztán gondoltam beleírom a programba, hogy PINC=1 ; Erre rögtön helyre jött, ami még nem meglepő. Az érdekesség az, hogyha most kikommentelem ezt a sort, és megint visszatöltöm az eddigi programot, akkor már jó marad a 4 láb... Hol van a csalafintaság a dologban?
(#) Szobiati hozzászólása Márc 27, 2010 /
 
Sziasztok!
Amennyire eddig nem volt gondom a mikrokontrollerekkel most annál több van. Zsinórban a 3. megépített áramköröm nem működik.
A probléma az, hogy bár tudok kommunikálni a procival mindenféle marhaságokat ír bele aztán ilyen hibát kapok.
Minden jól van bekötve, a kontoller egy ATTiny2313-as ami a kapcsolásoknál található USB-Explorer lelke akarna lenni.
A DeviceID-t ki tudom olvasni, de 5-ből 2-3X rossz, a többi esetben jó, a fuse biteket nem merem állítani, mert, ha oda is rossz adatokat ír, megint kizárom magam a prociból. Ja, igen a RESET gombot is rendesen folyamatosan nyomom és minden ki van mérve minden érintkezik, ráadásul stabilan. A programozási sebességet is próbáltam lentebb venni, de ugyanez.

Találkozott már bárki hasonlóval?

Előre is köszönök minden segítséget,
Attila
(#) Ricsi89 válasza Szobiati hozzászólására (») Márc 27, 2010 /
 
Milyen programozóval programozol?
(#) Szobiati válasza Ricsi89 hozzászólására (») Márc 27, 2010 /
 
Ővele meg az AVR Studióval.
(#) Ricsi89 válasza Szobiati hozzászólására (») Márc 27, 2010 /
 
Ennél milyen reset gombot nyomsz? A resetet itt a programozó majd állítja, amikor kell. Esetleg a slowsck jumpert felteheted, hátha...
(#) Szobiati válasza Ricsi89 hozzászólására (») Márc 27, 2010 /
 
Az USB-Exploreren nincs kivezetve a reset láb ezért egy gombot kell nyomni rajta. Ezt írja a cikk és ezt írtam, hogy így tettem.
Következő: »»   201 / 841
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