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   445 / 840
(#) oregharcos hozzászólása Máj 21, 2012 /
 
Sziasztok!
Már egy programot sikerült SirLeslie és TavIR-AVR segítségével beprogramozni ATtyni45-be.
Tanulásképpen ismét elővettem ezt a leírást, http://www.hobbielektronika.hu/kapcsolasok/nyolc_labbal_i_resz.html...%3E%3E
Itt található programot szeretném úgy megoldani,
hogy csak akkor szóljon, amikor kap egy indító
jelet, pl. nyomógombról.
Ez a program:
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. void m_delay_10ms(unsigned long val) {
  6. //-------------------------------------
  7.            while(val--) _delay_ms(10);
  8. }
  9.        
  10. //-------------------------------------
  11. void do_delay(uint16_t ms_delay, uint16_t num_ms, uint16_t us_delay, uint16_t num_us)  {
  12. //-------------------------------------
  13.         uint16_t i;
  14.  
  15.         for(i=0;i<num_ms;i++) _delay_ms(250);
  16.         for(i=0;i<ms_delay;i++) _delay_ms(1);
  17.         for(i=0;i<num_us;i++) _delay_us(250);
  18.         for(i=0;i<us_delay;i++) _delay_us(1);
  19. }
  20.  
  21.  
  22. //-------------------------------------
  23. void generate_tone(uint16_t frequency, uint16_t duration)
  24. //-------------------------------------
  25. {
  26.           uint32_t total_delay_time;
  27.           uint16_t total_ms_delay_time, total_us_delay_time;
  28.           uint16_t num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
  29.           uint16_t num_periods;
  30.  
  31.           total_delay_time = (1000000/frequency)/2-10;
  32.  
  33.           total_ms_delay_time = total_delay_time/1000;
  34.           num_ms_delays = total_ms_delay_time/250;
  35.           ms_delay_time = total_ms_delay_time%250;
  36.  
  37.           total_us_delay_time = total_delay_time%1000;
  38.           num_us_delays = total_us_delay_time/250;
  39.           us_delay_time = total_us_delay_time%250;
  40.  
  41.           num_periods = ((uint32_t)duration*1000)/(1000000/frequency);
  42.  
  43.           while((num_periods--) != 0)
  44.           {
  45.              do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  46.              PORTB |=  (1<<PINB3);
  47.              do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
  48.              PORTB &= ~(1<<PINB3);
  49.           }
  50.  
  51.           return;
  52. }
  53.  
  54. //-------------------------------------
  55. int main(void) {
  56. //-------------------------------------
  57.            DDRB = (1<<PINB3)|(1<<PINB4); //csak a PB3 és a PB4 kimenet
  58.            while(1) {
  59.                generate_tone(1000,200);
  60.                generate_tone(1200,200);
  61.                generate_tone(1400,200);
  62.                generate_tone(1200,200);
  63.                generate_tone(1000,200);
  64.  
  65.                if(PORTB & (1<<PINB4)) PORTB &= ~(1<<PINB4);
  66.                                  else PORTB |=  (1<<PINB4);
  67.                m_delay_10ms(250); //100*10ms = 1s
  68.            }
  69.            return 0;
  70. }


Hogyan tudnám ezt megoldani?

Segítségeteket előre is köszönöm!
(#) sikolymester válasza oregharcos hozzászólására (») Máj 21, 2012 / 1
 
Egy io-t bemenetnek állítasz és teszel a main while ciklusba egy while loopot, ami addig áll, amíg nem változik meg az io állapota a kívántra.
Egyszerű, de nagyszerű.
(#) H.Boti válasza oregharcos hozzászólására (») Máj 21, 2012 / 1
 
A led és az ellenállása helyére tegyél egy nyomógombot és a PortB4-et állítsd be bemenetnek (a DDRB kezdetű sorban a PINB4 előtti az 1-est cseréld ki 0-ra).

A while ciklus tartalma pedig ez legyen:
  1. if(!(PINB & (1<<PINB4))) {  //ez ellenorzi a gombot
  2.   generate_tone(1000,200);
  3.   generate_tone(1200,200);
  4.   generate_tone(1400,200);
  5.   generate_tone(1200,200);
  6.   generate_tone(1000,200);
  7.   m_delay_10ms(1);
  8. }


Egyébként van egy Hangra aktivált sípoló kapcsolás, ezt kell csak kicsit átalakítani. Bővebben: Link
(#) oregharcos hozzászólása Máj 21, 2012 /
 
Sziasztok!
Nagyon köszönöm mindkettőtöknek a gyors választ!
A belinkelt kapcsolás nagyon jó, mert tudom tanulmányozni a működést is.
Még egyszer köszönöm!
(#) morgo hozzászólása Máj 23, 2012 /
 
Sziasztok! Az lenne a kérdésem, hogy ez az áramkör működhet-e?
Amit tudnia kéne:
Gombnyomásra elindul egy 10-12 perces időzítés, (bekapcsolja a fetet) ennek lejárta után az AVR készenlétbe hejezi magát.
Ha az időzítés lejárta előtt kap egy új impulzust, kezdi előről a számlálást.
Az időzítés lejárta előtt 2-3 perccel figyelmeztet az egyik LED.
Ha az akksi töltöttségi szintje ha túl alacsony, jelez a másik LED (csak a bekapcsolás ideje alatt).
Mivel programozói ismereteim egyenlőek a nullával, szívesen fogadnék egy linket is, valami hasonló kütyüről. Azt meg sem merem említeni, hogy valaki megírhatná a hozzávaló progit
Azért kéne AVR-rel megoldani, mert nagyon pici a rendelkezésre álló hely, és tiny13, meg tiny45 van kéznél soic tokos.
Előre is köszönöm a válaszokat.

tiny13.jpg
    
(#) sgt válasza morgo hozzászólására (») Máj 23, 2012 /
 
Ahhoz hogy mérni tudj táp feszt le kell osztanod a tápfeszt és úgy mérni belső referenciával.

Itt a HE-n minden szükséges cikk fent a progra megírásához.

Szívesen megírom, de ingyen senki sem fogja vállalni.
(#) morgo válasza sgt hozzászólására (») Máj 23, 2012 /
 
Tehát a PB3 lára menő ellenállás helyett jó lesz egy trimmer, aminek alsó végét a GND-re kötöm, a csúszka pedig megy az AVR-re. Így legalább tudom állítani a kijelzés szintjét.
Köszönöm a gyors válasz, privátban megkereslek a program ügyében, de most mennem kell melózni.
(#) kala1982a hozzászólása Máj 23, 2012 /
 
Sziasztok, valaki tudna nekem C64-es Sid chip-ről használható leírást, AVR-es dallamcsengőnek kellene. Azt olvastam róla, hogy 6510-es processzort kell emulálni. Találtam videókat is róla, de leírást nem. Valaki szólaltatta meg AVRrel?
(#) kiborg hozzászólása Máj 23, 2012 /
 
Hali!

Probléma merült fel egy M16 használatában. Timer0-t Fast PWM módba konfigurálom (ez működik is), míg a Timer2-t arra használom, hogy 50ms-ként növeljem/csökkentsem a OCR0-t( ezáltal változtassam a kitöltési tényezőt). Egy motor lassú elindulása/megállása lenne a végcél. Viszont szkópon nézem a jelet és nem folyamatos a PWM jel változása, hanem szakaszos, néha szemmel láthatóan megáll egy-egy pillanatra,majd folytatja tovább. Miért lehet ez? (a motoron is érezni, hogy időnként azonos a fordulata, majd egy rántással adja tudtomra,hogy most behozta a lemaradást)
Miért okozhatja ezt ?
Arra tippelek, hogy FAST PWM-módban nem folyamatos az OCR0 frissítése (hanem csak akkor amikor a számláló túlcsordult) de ezt meg azért vetem el, mert 64us-ként csordul túl, és én meg 50ms-ként frissítem. Adatok: 4MHz órajel, Timer0 nincs előosztó,WGM01 és WGM00 és COM01 és CS00 = 1, Timer2 1024-es előosztó, Timer2 Compare engedélyezve.
Bocsi, hogy hosszú, de remélem valaki tud segíteni.
Üdv Kiborg
(#) zombee válasza kiborg hozzászólására (») Máj 23, 2012 /
 
Bugyuta elgondolás, de értelmesebb magyarázatot nem tudok: az a tippem hogy ez egy hardver bug.
A Timer0 és Timer2 órajelét ugyanarról a 4MHz-ről veszed, ezért - szerintem - néha előfordul hogy éppen
akkor akarja befrissíteni az OCR0-t amikor a Timer0 Fast-PWM része éppen "rögzíti" azt a kövi ciklus erejéig.

TIPP: frissítéskor állítsd le a TIMER0-t(CS02:00=0), majd tedd normál módba(WGM01:00=0), fontos hogy
ezt a két lépést külön parancsban tedd meg. Ilyenkor állítsd át az OCR0-t, majd indíthatod Fast-PWM
módban, ezt megtegeted már egyetlen parancsban is, csak a leállításnál fontos a sorrend.
(#) kerdes10 hozzászólása Máj 23, 2012 /
 
üdv mindenkinek!

egy kérdést szeretnék feltenni : hogyan,melyik programmal tudk létrehozni .lst kiterjesztésű file-t?

bascom avr-ben nem lehet.
köszönöm a választ
(#) TavIR-AVR válasza kala1982a hozzászólására (») Máj 23, 2012 /
 
Kulcsszó a kereséséhez:
Arduino + SID + C64
Illetve ezek kombinációi....

(#) TavIR-AVR válasza kerdes10 hozzászólására (») Máj 23, 2012 /
 
- Notepad?
File-Save as....
- Intéző, átnevezés?


Mihez kellene? Mi célt szolgálna?
Hova kell ez az állomány?
Mit látnál belőle?
(#) sikolymester válasza kerdes10 hozzászólására (») Máj 23, 2012 /
 
avr-gcc fordító erre kiválóan alkalmas.
Ha mfile-lal csinálsz makefile-t, akkor ez a sor eleve benne lesz:

  1. CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)


Ez varázsol neked fordítás közben .lst file-t.
(#) pluto válasza kiborg hozzászólására (») Máj 23, 2012 /
 
Szia!

A kérdésedre ugyan nem tudom a választ, de elvileg valami hasonló is lehet akár mint például, ha feltöltesz egy portot egy értékkel és utána azonnal olvasod.

Példa: out PORTD,r16
NOP ; Itt kell az "időt húzni"
in r17,PIND

Mert a külső szignálra a reakció akár 1,5 órajel is lehet. Ennek ugyan semmi köze a problémádhoz, de talán ebbe az irányba kellene gondolatilag indulni. Feltételezem, hogy zombee fórumtársunk is hasonló elgondolások alapján kapirgált - szerintem - a jó irányba. Bár én azért nem nevezném hardware bug-nak. Ha meg van a megoldás, azt légyszíves tedd már közkincsé.
(#) kerdes10 válasza sikolymester hozzászólására (») Máj 23, 2012 /
 
ez az avr-ggc fordító egy külön program?próbáltam letölteni de mintha ez az avr studio kiegészítője lenne,vagy részprogramja

és akkor ez azt tudja hogy megnyitok egy .hex vagy .bas kiterjesztésű filet-amit bascomavr-ben írtam- rámegyek hogy save as,aztán generál egy .lst filet?

vagy hogy kell ezt kivitelezni a konvertálást?

köszönöm a választ
(#) sikolymester válasza kerdes10 hozzászólására (») Máj 23, 2012 / 1
 
Az avr-gcc egy c fordító AVRhez. A .lst file egy olyan valami, ami tartalmazza a c kódot és az assembly kódot, amit a fordító a c kódból csinált. Így egyből láthatja a delikvens, hogy mennyire hatékony a fordítója.

Nincsen értelme hex file-ról beszélni, abból nem lesz .lst.

Kérlek mondd, mit szeretnél pontosan elérni?
(#) sgt válasza kerdes10 hozzászólására (») Máj 24, 2012 /
 
Töltsd le az AVR Studio 4.18-t, melléje a WinAVR-t, tedd bele a programod, fordítsd le, indísd el a debugot, és van egy olyan ikon, hogy Toggle Dissambler Window, és tádád soronként mutatja, hogy minek mi a megvalósítása asm-ben. De a projekt mappában az lss kiterjesztésű fájl ugyanaz, szval azt is megnézheted.
(#) kiborg válasza zombee hozzászólására (») Máj 24, 2012 /
 
Hali!

Köszi az ötletet, de sajnos nem vált be, megmaradt a rángatás, bár más módon sikerült csökkentenem. (ekkorával már együtt tudok élni)(részben a programban is volt hiba,amire közben rájöttem)
Másrészt most csak a OC0-t vezérlem. Hogy lehetne ezt a jelet egy H-hídhoz felhasználni ? Mert ott nekem 4 vezetékre lenne szükségem. (ebben a részben volt a nagyobb rángatásért felelős rész) Ehhez a h-hídhoz.(ez csak félhíd)
(#) zombee válasza kiborg hozzászólására (») Máj 24, 2012 /
 
Két H-félhíd kombinálható, így egy teljes H-híd vezérlése is megoldható 2 vezetékkel. Én még anno bipól tranzisztorokkal építettem a boci-boci-tarka hanggenerátorhoz, abba a négy "nagy" tranzisztor mellé két kicsi is ment, így vezérelhető volt 2 szálon. 2 vezérlőszál pedig minden AVR Timer1-én van.
(#) kiborg válasza zombee hozzászólására (») Máj 24, 2012 /
 
Igen, de viszont nem szeretném fékezni(ergo rövidre zárni a forgórészt) a motort, ezért kell a 4 vezeték.
Azért használnák feteket, mert nagy áramokat (1-10A) kapcsolok 10-50V-on. Nem akarom hogy melegedjenek, nem szeretnék rájuk hűtőbordát rakni.
Tudsz egy FET-es H-hidat mutatni, ami 2 vezetékes és ha nincs vezérelve, akkor nem nyit össze a két nagy fet ?
Üdv Kiborg
(#) sikolymester válasza kiborg hozzászólására (») Máj 24, 2012 /
 
Ne felejts beletenni un. dead time -ot. A feteknek van egy véges idejük, amíg lekapcsolnak. Ha ezzel nem számolsz, akkor jó kis füstölés lesz a vége. Legjobb az lenne, ha olyan mikrokontrollert használnál, amiben hardveresen van ilyen, mert ahogy olvasom nem sikerült egy sokkal egyszerűbb dolgot sem megcsinálnod hiba mentesen.
(#) freechat hozzászólása Máj 24, 2012 /
 
Volt(Van) valahol egy kapcsolás amiben az AVR vagy PIC és az egérből kiszedett optokapu összekapcsolása volt.
Végignéztem az összes kapcsolást és sehol nem találom.
Le lett szedve vagy rossz helyen keresem?

Valami próbapanelon volt összerakva.
(#) vagnerjazon válasza freechat hozzászólására (») Máj 24, 2012 /
 
Szia!
Tessék, gondolom, erre gondoltál.
(#) sikolymester válasza kiborg hozzászólására (») Máj 24, 2012 /
 
Figyelmedbe ajánlom az Attiny26-t például, mivel abban van un. non-overlapping funkció a pwm kimeneteken. Nézegesd át az adatlapját, mert hasznos kis funkció ez.

kicsit idézve belőle:
Idézet:
„The non-overlapping output pairs (OC1A - OC1A and OC1B - OC1B) are never both set at the same time. This allows driving power switches directly.”
(#) kiborg válasza sikolymester hozzászólására (») Máj 24, 2012 /
 
Köszi a figyelmeztetést.
A jelenleg használt H-hídnál nincs ilyen gondom, mert a kikapcsolást tranzisztor végzi el gyorsan, a bekapcsolást meg egy ellenállás, így a bekapcsolásom mindig lassabb lesz,mint a kikapcsolásom. Ha állandó PWM-el használom, semmi melegedése nincs, pedig 24V-os motorral játszok.(üresjáratban 500mA)
A Tiny26 adatlapját megnézem.
(#) kerdes10 válasza sikolymester hozzászólására (») Máj 24, 2012 /
 
a tina 7 nevezetű áramkör szimuláviós programban szeretnék letesztelni egy avr-t,és amikor a programot akarom betölteni,akkor 2 lehetőségem van:
- asm -et
vagy
- hex+lst párost töltök fel rá


Mivel asm-hez nem értek,ezért gondoltam .bas-ból először hex-et csinálni BasicAvr segítségével,ez ment is csak azt az lst fájlt nem tudtam hogy micsoda.

de így akkor nem is fog menni,mert látom hexből nem lesz lst.
(#) sikolymester válasza kerdes10 hozzászólására (») Máj 24, 2012 /
 
Kell neked a WinAVR.
A következő parancsot add ki:
avr-objdump -j .sec1 -d -m avr5 foo.hex
Ezzel megkapod a hex fileből az asm filet. Gyakorlatilag egy disassembler így.
(#) kerdes10 hozzászólása Máj 24, 2012 /
 
erről a programról még nem hallottam
hova adjam ki a parancsot, hogy kell ezt lefuttatni?
(#) dc001 hozzászólása Máj 25, 2012 /
 
Úgy néz ki találtam egy avr-gcc fordító hibát.

A mellékelt programot lefordítva az avr-gcc-t (v4.5.3) használva (64bit-es ubuntu 12.04 rendszeren) -Os, -O2 és -O3 optimalizáció mellett hibás binárist készít. Az -O1 optimalizáció mellett nem jön elő a hiba. Ugyanezt a programot az avr-gcc v4.3.4 használva nem jelentkezik a hiba.

Ha valakinek esetleg volna kedve és ideje kiprobálhatná, hogy milyen fordítóknál és/vagy milyen rendszeren jelentkezik ez a hiba. Segítségeteket előre is köszönöm.

A mellékelt program csak egy LCD kijelzőt feltételez (R/W nincs használva). Az LCD kijelzőhöz használt portokat a ports.h file-ban kell átírni. A Makefile-ben atmega8 van beállítva 8MHz órajellel, ha szükséges át lehet írni.

Helyes működés közben az LCD kijelzőn a '00 00', '01 01' .. '0F 0F' jelenik meg másodperces lépésközzel.

Hibás működés közben ez helyett '00 FF', '01 FF' .. '0F FF' jelenik meg.

(A hiba switch-en belüli értékadásnál jelentkezik, a main.c-ben a check() függvényben.)
Következő: »»   445 / 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