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   550 / 840
(#) Szabi1 válasza Szabi1 hozzászólására (») Júl 20, 2013 /
 
Most eszembe jutott egy másik ötlet, 4 output portot használok a h bridge-ra ami vezérli, és egy MOSFET kapcsolna külön az előálitott PWM-et a h-bridge pluszjára.
(#) Szabi1 válasza Szabi1 hozzászólására (») Júl 20, 2013 /
 
írtam egy új programot, csak nem tudom hogy helyes-e amit írtam?
Lényegében megnézi nyomtam e valamilyen gombot ha igen akkor annak megfelelően növel vagy csökkenti a PWM kitöltési tényezőt. Azután lekeresi hogy a szenzor mit érzékelt, a szerint kapcsolja a H-hidat, hogy merrre menjen.
Az előzőhöz képest itt a kapcsolók a PB0,PB1 en vannak, a H hídhoz PB2,PB5,PB6,PB7 tartozik,
PB3,PB4 a PWM előállításhoz van lefoglalva.
(#) zombee válasza Szabi1 hozzászólására (») Júl 20, 2013 /
 
Ez most kérdés volt vagy válasz? Kérlek ne blogolj, ha van valami ötleted próbáld ki, ha nem megy akkor KÉRDEZZ! De ne várd hogy minden szösszenetre valaki felhördül hogy "de hát ez így nem jó!", ha meg alapból nem várod hogy válaszoljanak akkor BLOGOLSZ!
(#) elektros90 válasza Szabi1 hozzászólására (») Júl 20, 2013 /
 
Mi lenne ha a nyomógombot megszakításokkal kezelnéd? Annak hatására növelnéd/csökkentenéd a duty változód értékét. Ezáltal kevesebb dolga lenne a procinak.
A hozzászólás módosítva: Júl 20, 2013
(#) Szabi1 válasza elektros90 hozzászólására (») Júl 20, 2013 /
 
Én inkább PC programozáshoz értek, olyat tanultam eddig csak a suliban, kezdő vagyok az AVR programozásban, s nem vagyok biztos, hogy a registereket jól állítom be, illetve az itt lévő speciális utasításokat jól használom-e ami számomra idegen még?
Igen halottam már IRQ ról számítógépeknél, csak nem gondoltam, hogy AVR-nél is van ilyesmi, gondolom valami registert kell piszkálni, hogy használjam?
(#) elektros90 válasza Szabi1 hozzászólására (») Júl 20, 2013 /
 
Nem annyira bonyolult a dolog. Adottak bizonyos megszakítási vektorok (interrupt vectors). Ebből van több fajta, adatlapban találsz adatokat róla. Itt egy tutorial róla, de itt a HE-n is találsz rengeteg segítséget. A megszakításban célszerű csak rövid és gyors műveleteket végrehajtani, mert nagyon időkritikus. Amíg a proci azt hajtsa végre, addig a main áll, majd folytatódik onnan ahol abbahagyta.
Az okosabb kolegák majd jobban elmagyarázzák esetleg.
A hozzászólás módosítva: Júl 20, 2013
(#) Szabi1 válasza elektros90 hozzászólására (») Júl 20, 2013 /
 
Köszönöm szépen, ám a többi része a kódnak helyes?
(#) Fizikus válasza Szabi1 hozzászólására (») Júl 21, 2013 /
 
Idézet:
„Igen halottam már IRQ ról számítógépeknél, csak nem gondoltam, hogy AVR-nél is van ilyesmi, gondolom valami registert kell piszkálni, hogy használjam?”


Én külső megszakításokat használtam a robotomnál:
Will-i 3
(#) Szabi1 válasza Fizikus hozzászólására (») Júl 21, 2013 /
 
OK, megoldom, de a többi része jó a kódnak??
(#) yoman917 hozzászólása Júl 21, 2013 /
 
Sziasztok!

Attiny2313-al szeretnék egy frekvenciamérést készíteni majd egy majdani motorgyújtáshoz. Első körben csak a frekvenciamérés a fontos. Összeraktam próbapanelon egy astabil multivibrátort 555 IC-vel. Azt szeretném elérni, hogy ha a frekvencia nagyobb, mint 1 kHz, akkor egy Led villanjon fel, majd ha a frekvencia 1 kHz alá esik, akkor aludjon ki. Írtam egy kódot egy kis segítséggel, de sajnos sehogy sem tudom működésre bírni. Tudnátok segíteni, hogy mi lehet benne a hiba?
  1. #define F_CPU 8000000UL
  2. #include <avr/io.h>
  3. #include <avr/interrupt.h>
  4. #include <util/delay.h>
  5.  
  6.  
  7. #define PRESCALE 64
  8.  
  9. volatile uint16_t u16Ford_min=0, u16Ford_s=0;
  10.  
  11. ISR(INT1_vect)
  12. {
  13.         uint16_t u16Szamlalo=TCNT1;
  14.  
  15.         TCNT1=0;
  16.        
  17.         //fordulatszámok számitása egy jó nagy változóban
  18.         //nehogy elveszitsünk belőle felső biteket!
  19.         uint32_t u32Temp=60*F_CPU/PRESCALE/u16Szamlalo;
  20.        
  21.         //kirakjuk a globálisba
  22.         u16Ford_min = u32Temp;
  23.         u16Ford_s = u32Temp/60;
  24. }
  25.  
  26.  
  27. int main(void)
  28. {
  29.        
  30.         //konfiguráljuk a külső interruptot
  31.         MCUCR|=( (0<<ISC11) | (1<<ISC10) );
  32.         GIMSK|=(1<<INT1);
  33.        
  34.  
  35.        
  36.         //timer1et beállitjuk F_CPU/64-re
  37.         TCCR1B|=( (0<<CS12) | (1<<CS11) | (1<<CS10) );
  38.  
  39.  
  40.         DDRB|= (1<<PB1);
  41.        
  42.        
  43.         sei();
  44.  
  45.         while(1)
  46.         {
  47.        
  48.                 if(u16Ford_s>1000)
  49.                 {
  50.  
  51.                 PORTB=(1<<PB1);
  52.        
  53.                                        
  54.                 }      
  55.                        
  56.                 else
  57.                
  58.                 {
  59.                
  60.                
  61.                 PORTB=(0<<PB1);
  62.        
  63.                 }
  64.         }
  65.  
  66.         return 0;
  67. }
(#) johny999 hozzászólása Júl 21, 2013 /
 
Sziasztok,

adott a következő kódrészlet

  1. ISR(TIMER1_OVF_vect) {
  2.  
  3.         timer1_ovf_count++;
  4.  
  5.         if (timer1_ovf_count > 305) { //1sec = 61x overflow
  6.                
  7.                 if (count_up == 0) {
  8.                
  9.                         if (freq >= 64) {
  10.                                 freq-=5;
  11.                         }
  12.                        
  13.                         if (freq < 64) {
  14.                                 count_up = 1;
  15.                         }
  16.                 }
  17.                
  18.                 if (count_up == 1) {
  19.                
  20.                         if (freq <= 159) {
  21.                                 freq+=5;
  22.                         }
  23.                        
  24.                         if (freq > 159) {
  25.                                 count_up = 0;
  26.                         }
  27.                 }
  28.                
  29.                 PORTB = (1 << PINB2);
  30.                 _delay_ms(10);
  31.                 PORTB = (0 << PINB2);
  32.                
  33.                 OCR0A = freq;
  34.                 timer1_ovf_count = 0;
  35.         }
  36. }


x másodpercenként léptetem először lefele 159-tol 64-ig a freq változó értékét, majd visszafele 64-től 159-ig.

Hogyan lehetne megcsinálni hogy ha eléri a szélső értékeket akkor 2x egymás után ne ugyanaz az érték kerüljön a freq változóba? :/

Most így néz ki de sehogy se tudok rájönni hogyan kéne ezt kiküszöbölni.

159 154 .... 69 64 64 69 .... 154 159 159 ....
A hozzászólás módosítva: Júl 21, 2013
(#) elektros90 válasza johny999 hozzászólására (») Júl 21, 2013 /
 
  1. count_up = 1;
  2. freq = 69;
  3.  
  4. count_up = 0;
  5. freq = 154;


Így?
(#) zombee válasza yoman917 hozzászólására (») Júl 21, 2013 / 1
 
Hello!

Nem néztem meg a kódot, de egyvalamire ügyelj: ilyen "kis" frekik mellett nem érdemes az impulzusok számát mérni, mert nagyon rossz lesz a felbontás és ugrálni fog. Helyette az egyes gyűjtások között eltelt időt kell mérni, akár úgy is hogy több esemény időjét leátlagolod.
(#) johny999 válasza elektros90 hozzászólására (») Júl 21, 2013 /
 
Miután elküldtem a posztot rájöttem én is De köszi.

  1. freq = 64;
  2. count_up = 1;
  3.  
  4. freq = 154;
  5. count_up = 0;
A hozzászólás módosítva: Júl 21, 2013
(#) Szabi1 hozzászólása Júl 22, 2013 /
 
Sziasztok! Ez a kapcsolás működhet programozóként? Attiny2313 -at akarok programozni? Bővebben: Link Milyen programot használjak ami rálöki a programkódot?
A hozzászólás módosítva: Júl 22, 2013
(#) gtk válasza Szabi1 hozzászólására (») Júl 22, 2013 /
 
Ki kell probalni, nem nagy munka. Vagy probald ki az alabbit, az nekem mukodik. Program: Avrdude stk-200 konfiggal (a masodik eseteben biztosan, az elso eseteben talan.)
A hozzászólás módosítva: Júl 22, 2013

stk200.png
    
(#) zombee válasza Szabi1 hozzászólására (») Júl 22, 2013 /
 
PonyProg viszi, és elvileg Bascom is. Ne feledd az AVR-t megtáplálni(5V)!
(#) Szabi1 válasza zombee hozzászólására (») Júl 22, 2013 /
 
Ezt építettem meg majd kipróbálom, most a mechanikán kinlódok, az áttételen.
(#) szdani hozzászólása Júl 23, 2013 /
 
Sziasztok!
TC1047-el szeretnék hőmérsékletet mérni, -40-től +125-ig mér, 10mV/C, ehez kéne nekem valami függvény ami kiszámolja a hőmérsékletet az ADC értékéből ami max 255.
(#) vagnerjazon hozzászólása Júl 24, 2013 /
 
Üdv.!

Atmel Studio 6-ban véletlenül eltalálhattam valami billentyűkombinációt, és olyan lett a szerkesztő felület, mint ahogy a mellékelt képen látszik. Tabulátorjelek, meg a szóközöket jelölő pontok jelennek meg, és ez eléggé zavaró. Tudja esetleg valaki, hogy hol lehet ezt kikapcsolni? Végignéztem a beállításokat, de nem jutottam semmire, mert nem tudom, hogy egyáltalán mit keressek. Köszönöm!
(#) Szabi1 válasza vagnerjazon hozzászólására (») Júl 24, 2013 /
 
Azt hiszem egy: ¶ ilyen jelű ikonra kattintva eltűnik, Microsoft Wordba legalábbis úgy lehet kikapcsolni.
(#) vagnerjazon válasza Szabi1 hozzászólására (») Júl 24, 2013 /
 
Sajnos nem találok olyat, pedig van egynéhány kicsi ikon. Abban sem vagyok biztos, hogy ugyanolyan jele lenne, mint a Wordben. Csak annyi biztos, hogy billentyűkombinációval sikerült bekapcsolni...
(#) Szabi1 válasza vagnerjazon hozzászólására (») Júl 24, 2013 /
 
CTRL+R, vagy CTRL+W Bővebben: Link
(#) vagnerjazon válasza Szabi1 hozzászólására (») Júl 24, 2013 /
 
Nagyon köszönöm! Eszembe se jutott, hogy ott kellene keresni. Majd legközelebb.
Egyébként - mint kiderült - nem CTRL+R vagy CTRL+W, hanem CTRL+R és CTRL+W, ugyanis egymás után kellett a kettő. (ezek után fogalmam sincs, hogy sikerült véletlenül lenyomni egymás után ezeket)
(#) zsozsoX hozzászólása Júl 24, 2013 /
 
Sziasztok! PC-ről küldök számokat az avrbe ami ott karakter (char) tömbbe megy azt szeretném számmá (int) átkonvertálni.Segítséget előre is köszönöm.
(#) Szabi1 válasza zsozsoX hozzászólására (») Júl 24, 2013 /
 
(#) Szabi1 hozzászólása Júl 24, 2013 /
 
A robotom átesett 1-2 változtatáson, a Flow teszten már átesett, nem füstölt semmi
Holnap feltöltöm a programot s megnézem hogy működik-e?
Belekerült a megszakitáskérelem is
(#) David 3g hozzászólása Júl 25, 2013 /
 
Sziasztok. Vettem egy kis usb égetöt ami atmega8 épül és isp keresztül tudok programozni. Szoval az lenne a kérdésem hogy ezt hogy tudom felismertetni valamelyik programmal ?
(#) Suncorgo hozzászólása Júl 25, 2013 /
 
Sziasztok!

Mekkora lehet egy AVR (pl mega8) egy bemenetének mintavételi frekvenciája? Gondolok itt arra hogy egy I/O portot bemenetnek állítok és írok egy ilyen progit, amivel egy digitális jel pozitív félperiódusát akarom megmérni.

while(vár pozitív élre);
tcnt nulláz;
while(vár negatív élre);
változó = tcnt érték;

a változóban benne van a jel pozitív ideje.
Szerintetek így mi az a legkisebb idő amit meg lehet mérni? (a legkisebb idő amit mérni kellene az kb 1ms)

Üdv:
Suncorgo
(#) TavIR-AVR válasza David 3g hozzászólására (») Júl 25, 2013 /
 
USBASP-t vettél.

Dobd ki típus.... Az AVRégetők fórumban volt kb. 1 hónapja eszmefuttatás róla, hogy miért....
Következő: »»   550 / 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