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   668 / 837
(#) shirke válasza kapu48 hozzászólására (») Máj 28, 2015 /
 
Háhááá!!! Köszönöm szépen!
A megoldás csupán annyi volt hogy az ADMUX utolsó 3 bitjét 1-be raktam.
Köszönöm a segítségeteket!
(#) Kovidivi válasza shirke hozzászólására (») Máj 28, 2015 /
 
Ezek szerint nem is azt a csatornát mintavételezted, ahol a poti volt? Mondjuk eddig 2x kérdeztem, melyik lábra kötöttél potit, de válasz nem jött. Na mindegy.
(#) shirke válasza Kovidivi hozzászólására (») Máj 28, 2015 /
 
Bocsi elírtam, ADCSRA utolsó 3 bitje. Amúgy kettővel feljebb írtam hogy ellenőriztem a lábakat.
(#) Bell válasza Sick-Bastard hozzászólására (») Máj 29, 2015 / 1
 
Alacsony sebességnél és a küldésnél beiktatott szünetekkel is ezt csinálja?
(#) Sick-Bastard válasza Bell hozzászólására (») Máj 29, 2015 /
 
A szünet volt a megoldás, ami a windows console program(om)ba kellett.

Elnézést kérek, hogy megint lemaradt az egyik legfontosabb információ, hogy a PC-n futó programot, ami a kommunikációt végzi a PC és az AVR között, is én próbálom megírni.

Köszönöm a segítséget!
(#) Bell válasza Sick-Bastard hozzászólására (») Máj 29, 2015 /
 
Tetszik az elgondolásod, játszottam hasonlóval.
Érdemes az adatokon azt a néhány hibajelző vizsgálatot elvégezni, kis plusz munkával sok időt, fölösleges melót lehet megtakarítani mindkét oldalon.
(#) k3gy3tl3n hozzászólása Máj 29, 2015 /
 
Sziasztok, van ötletetek hogy ez a 10 soros program miért nem érzékeli a gombnyomkodást? A gombot lenyomva földet kap PD7 (A led jól van bekötve azt tudom kapcsolgatni a programból csak nem gombnyomkodással)
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define LED 6
  5. #define LED_OFF() PORTD &= ~(1<<LED)
  6. #define LED_ON() PORTD |= (1<<LED)
  7.  
  8.  
  9. int main(void)
  10. {
  11.  DDRD |= (1<<LED);
  12.  DDRD &=~(1<<PD7); //set PD7 to input
  13.  PORTD |= (1 << PD7); //set PD7 to high (enable pullup)
  14.  
  15.  
  16.  
  17.     while (1)
  18.     {
  19.                  if(PIND & (1<<PD7))
  20.                  {
  21.                     LED_ON();
  22.                  }
  23.                  else
  24.                  {
  25.  
  26.                     LED_OFF();
  27.                  }
  28.  
  29.     }
  30. }
(#) Bell válasza k3gy3tl3n hozzászólására (») Máj 29, 2015 1 /
 
Logikai értékkel próbáld:
  1. PIND && (1<<PD7)
.
(#) k3gy3tl3n válasza Bell hozzászólására (») Máj 29, 2015 /
 
Az a vicc, hogy egy másik kapcsolásban ahol ugyan ezt a mikrokontrollert használtam ebben a formában működött:
  1. /*----------read button state----------*/
  2.                 if (!(PINB & (1<<PB0))){ //pressed (PB0 set to hight, if btn pressed it is low)
  3.                         LED_ON();
  4.                 }

Egyébként rámértem a uc lábára és 1V van rajt, nem 5-nek kéne lenni? Mikor nyomom a gombot akkor természetesen 0V De mivel inputnak van állítva a láb nem tudom, hogy jó e az az 1V amit mérek rajta
Megőrülök, hogy egy ilyen egyszerű dolog is képes nem működni grrr
A logikai és nem hiszem hogy jó ötlet, mivel PINB a számomra érdekes biten ha 0-ra vált máshol még lehet benne 1-es bit két 0-nál nagyobb szám így mindíg igazat adna.
A hozzászólás módosítva: Máj 29, 2015
(#) Bell válasza k3gy3tl3n hozzászólására (») Máj 29, 2015 /
 
Az 1V szerintem kevés. Próbáld meg ellenállással. Ha a portot másra is használod (ott van a LED!) &&, vagyis logikai érték kell.
Így sem működik?
A hozzászólás módosítva: Máj 29, 2015
(#) k3gy3tl3n válasza Bell hozzászólására (») Máj 29, 2015 /
 
Holnap reggel kipróbálom, ma már nem kínlódok vele, de mint ha logika éssel is próbálkoztam volna. Mindenesetre ezt a formát is próbáltam, ez sem volt jó:
  1. if (bit_is_clear( PIND, PD7))
  2. {
  3.         ....
  4. }
  5. else {
  6.     ....
  7. }

INNÉT lestem el, ez is atmega8 csak a gomb van máshova kötve.
Valóban a led is PORTD-n van de ide már kínomban tettem át a gombot, előtte PC2 lábra volt kötve onnét sem működött.
A hozzászólás módosítva: Máj 29, 2015
(#) Droot válasza k3gy3tl3n hozzászólására (») Máj 29, 2015 / 1
 
PD7 és a vcc közé tegyél be egy 1-15K-s ellenállást. Ha működik a portlábon elszállt a felhúzóellenállás. Ha nem és ugyan ez a kód másik lábon megy, a portláb szállt el.
(#) Jaedong válasza Bell hozzászólására (») Máj 30, 2015 / 2
 
C-ben nincsen "igazi logikai érték". Ami nem nulla az igaz, ami nulla az hamis, azaz a fenti kód az tökéletesen működik.
  1. if(PIND & (1<<PD7)) // ha PIND 7. bitje egy, akkor ez egyenlő 128-cal, ami igaz, tehát a gomb nincs lenyomva, ha nulla akkor pedig le van nyomva ugrunk tovább

Amit te írtál az pedig hibás alapból, mivel ilyenkor két állítást "éselsz össze", tehát PIND ( PIND mint "logikai érték") ÉS (1<<PD7) (ami természetesen mindig igaz lesz, mivel nagyobb mint nulla), ergo PIND && (1<<PD7) állítás akkor igaz, ha PIND nem nulla, és akkor hamis ha PIND == 0.

Ui.: Remélem értelmezhető amit írtam sajnos van már bennem pár sör
(#) zombee válasza Jaedong hozzászólására (») Máj 30, 2015 / 1
 
Szerintem nem érti. Lényeg hogy itt bitművelet van, nem logikai vizsgálat. Illetve az is van,
de először akkoris a bitművelet. És ez így jó...
(#) killbill válasza Bell hozzászólására (») Máj 30, 2015 /
 
Nem logikai kell, hanem aritmetikai (bitenkenti). Miert kellene logikai?
Viszont az 1V az tenyleg keves. Pedig meg a felhuzo is be van kapcsolva. Az ellenallas jo otlet, de meg kell keresni az okat, hogy a belso felhuzoval miert csak 1V-ig megy fel a labon a feszultseg.
A hozzászólás módosítva: Máj 30, 2015
(#) zombee válasza killbill hozzászólására (») Máj 30, 2015 /
 
Ha ujjal hozzáérsz, változik? Ja és mekkora a tápfesz? VCC és AVCC összekötve? GND is?
Véletlenül nem marad RESET-ben a cucc? A programozót ha lehúzod?
A hozzászólás módosítva: Máj 30, 2015
(#) Bell válasza Jaedong hozzászólására (») Máj 30, 2015 /
 
Na ezt valóban nagyon benéztem, köszönöm a helyreigazítást .
A hozzászólás módosítva: Máj 30, 2015
(#) k3gy3tl3n hozzászólása Máj 30, 2015 /
 
Most próbálom egy vadi új uc-vel, azzal sem megy.
(#) k3gy3tl3n hozzászólása Máj 30, 2015 /
 
Most egy dróttal próbálgatok földet adni a kiválasztottt input lábra és így működik! Rossz a gomb? Lehidalok
Update:
Közben meg is lett a hiba, persze én voltam hülye... A gomb egy joystickról van kivezetve és az eredeti vezetékeit nem vágtam le amik az isten tudja hova vezetnek a joystick áramkörén belül. Köszönöm mindenkinek a segítséget! Ja és a bitenkénti &-t használom, azzal működik.
A hozzászólás módosítva: Máj 30, 2015
(#) Bell válasza k3gy3tl3n hozzászólására (») Máj 30, 2015 /
 
Szuper.
Semmi gond a bitenkéntivel, ha nullát vársz és az eredmény is nulla.
Nemrég futottam bele egy hasonló, de összetettebb problémába, azért ötlött fel bennem.
(#) mpetrooo hozzászólása Máj 31, 2015 /
 
Üdv.

Még nagyon új vagyok a mikrokontrollerek világában, tegnap megépítettem egy 7 szegmenses órát.
ATMEGA8-16PU uC-t használtam, a beépített 8Mhz-t rendszer órát használtam 8.as osztóval, de az óra eszméletlenül pontatlan, 1óra alatt kb 1 perc késést szedett össze. Az lenne a kérdésem, hogy rátehetek-e egy 32Mhz-s órákba való kvarcot, arra is vonatkozik a 8-as osztó, továbbá amikor a 16 bites timer2-t inicializálom akkor ott még az 1024-el osztódik az órajel, ezek vonatkoznak külső kvarcra is?
Vagy ha nem is 32Mhz-s kvarcot teszek rá mit ajánlotok? A lehető legpontosabbra kéne csinálnáom az órát.

Üdv,
Máté
(#) edison14 válasza mpetrooo hozzászólására (») Máj 31, 2015 /
 
Szia!

Használj órakvarcot. Azzal lesz a legpontosabb az órád. EZ lenne az. Nem vagyok nagy AVR-es és nem tudom hogy azon a kontrolleren van e olyan lehetőség hogy az egyik timert külön órajelről járatod és van egy láb ahova az órakvarcot kötheted. És akkor a kontroller futhat belső órajelről a timer ahol számolsz az pedig a külső órakvarcról.
(#) Bakman válasza mpetrooo hozzászólására (») Máj 31, 2015 /
 
RTC IC-n nem godolkodtál? Pl. DS1307. Én ilyennel csináltam már órát, havonta - kéthavonta egy percet késik.
(#) mpetrooo válasza Bakman hozzászólására (») Máj 31, 2015 /
 
Nemrossz kis IC, csak azt nem értem hogy erre is ugyanúgy kell egy kvarc, tehát ennek az IC-nek a pontossága is azon múlik hogy a rátett kvarc mennyire pontos, tehát ugyanott vagyok igazából. Vagy ilyen precizitást soha nem fogok mikrokontrollerbe programozni?
(#) pont válasza mpetrooo hozzászólására (») Máj 31, 2015 /
 
Az óra kvarc az 32,xxxx KHz tehát órajelnek egy kicsit lassú. atmega8 azt hiszem 16MHz-ig húzható tehát 32 MHz-nem tehetsz rá. A programtól is függ a pontosság, de ha egy órakvarcos oszcillátor jeleit számolod, a különben rendes órajellel ketyegő kontrollerrel az elég pontos tud lenni. A rezgőkörbe lehet tenni trimerkondit a pontosság beállítására. De ha igazán pontos órát akarsz akkor csak a rádió vezéreltek jöhetnek szóba.
(#) Bell válasza mpetrooo hozzászólására (») Máj 31, 2015 /
 
Ha a pontosság és a rendelkezésre állás a fő szempont, előre elkészített, beállított modult vennék (pl. ilyet: bővebben: Link).
Ha az alkotás öröme, akkor sok kísérlettel, számolgatással, tanulással járnék végére a dolognak.
(#) mpetrooo válasza pont hozzászólására (») Máj 31, 2015 /
 
értem, de azt nem tudjátok hogy a külső órára vonatkozik-e a 8-as osztó, mert ha a 32-t nekem leosztja 8-al akkor jó lehetne, nem? A programról nagyvonalakban, meg hogy úgy működik hogy folyamatosan multiplexeli a 6 darab 7szegmenses kijelzőt, és közben a számláló ha elér egy megadott számot(eltelt egy perc) akkor interrupttal lefuttatja az alábbi rutint:
ISR(TIMER1_COMPA_vect)//[0]-óra,[1]-perc,[2]-másodperc
  1. {
  2.         time[2]++;
  3.         if(time[2] > 59)
  4.         {
  5.                 time[1]++;
  6.                 time[2] = 0;
  7.         }
  8.         if(time[1] > 59)
  9.         {
  10.                 time[0]++;
  11.                 time[1] = 0;
  12.         }
  13.         if(time[0] > 23)
  14.         time[0] = 0;
  15. }


ez jó megoldás? vagy valamit rosszul csinálok?
és még egy kérdés, hogy ez a számláló ctc módban megy, és a számláló mikor törlődik? amikor belépek a megszakítási szubrutinba vagy ha kilépek belőle, mert lehet hogy onnan is jön a pontatlanság hogy miután növelte a másodpercet a három darab if még lefut ás csak után indul újra a számláló.



Engem abszolút csak az alkotás öröme vonzz, végre elkezdtünk egyetemen normális dolgokkal foglalkozni(digitális technika), és innen jött a nagy mikrokontrollerezés
A hozzászólás módosítva: Máj 31, 2015
(#) Bell válasza mpetrooo hozzászólására (») Máj 31, 2015 /
 
Sejtettem, hogy ez az élvezetekre van kihegyezve
Szerintem a megszakítás előosztásait és a Timer értékét bármilyen kvarc esetében be lehet lőni úgy, hogy az óra pontos legyen. Magasabb frekvenciájú kvarcnál ez könnyebb lesz, kell előtte számolgatni.
Ha mégsem jön össze, lehet pár KHz-et hangolni a kvarcon.
(#) Massawa válasza mpetrooo hozzászólására (») Máj 31, 2015 /
 
A különbség az, hogy ezek az orakvarcok kismillio számban és többé kevésbé kalibráltan vannak gyártva ( minden jobb elektronikus irában ugyanez van), és még a legocskább is havi 10-20 mp hibahatáron belül van.
(#) csatti2 válasza edison14 hozzászólására (») Máj 31, 2015 /
 
Igen, lehet külső órakvarcot használni (a program pedig futhat a beépített oszcillátorról). Ugyanolyan pontos lesz vele, mint az RTC IC-kkel. Ami kicsit trükkösebb, hogy áramszünet esetén ne vesszen el az idő. Ezt valahogy érzékelni kell és bekapcsolni a megfelelő energiatakarékos módot (persze kell bele egy elem is ). A másik lehetőség, hogy csatlakoztatsz rá ezekből az olcsó ESP wifi modulokból egyet és az internetről frissíted az időt.
A hozzászólás módosítva: Máj 31, 2015
Következő: »»   668 / 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