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   106 / 840
(#) FElici válasza Sir-Nyeteg hozzászólására (») Feb 23, 2009 /
 
Ez a Topi-féle programozó JTAG programozó? Lehet, hogy hülye kérdés, de számomra nem egyértelmű.

Mert ha JTAG, akkor tetszik a dolog.
De látom, hogy fenntvan HEstore-n 4100-ért... ennyit nekem megér, és még a tyúk, vagy a tojás problémával sem kell foglalkoznom. Nah meg akkor be is tudok tankolni AVR-ekből is.
(#) Topi válasza FElici hozzászólására (») Feb 23, 2009 /
 
Idézet:
„Ez a Topi-féle programozó JTAG programozó?”


A cikk neve: USB-s ISP programozó. Akkor számomra egyértelmű, hogy nem JTAG, hanem ISP.

Sir-Nyeteg: Programozás közben a kimenetet rövidrezárva maximum a bufferek mehetnek tönkre. Mivel a kimenet le van választva a procitól.
Volt már olyan, hogy írt nekem valaki hogy melegszik a processzor rettentően és hogy biztos szar a kapcsolás. Ott üvöltözött, már fenyegetőzött, hogy direkt rossz kapcsolást tettem fel, és neki ha kár keletkezik a gépébe beperel.

Végén kiderült, hogy egy ón gombóc ment a kristály lábai alá és rövidrezárta az oszcillátort.

Egy szó mint száz, a táp rövidrezárásakor a számítógép USB-je előbb kapcsol le, mint gond keletkezne, a kimenetek rövidrezárásakor előbb a puffer IC adja meg magát. Persze előfordulhat, hogy emiatt a puffer IC rövidzárat alkot a proci felé.

Első körben, mindenféle képpen cserélném a puffer IC-t.
(#) FElici válasza Topi hozzászólására (») Feb 23, 2009 /
 
Ahha.
Én meghajlok tudásod előtt, de nem értem.
ISP-->In Circuit Serial Programing
JTAG-->Joint Test Action Group, nah ez nem mond sokat, de messze elhatárolom kategóriájában az ISP-től, mint fogalom. Eddig az volt a világképem, hogya a JTAG programozó=debugolni képes programozó.

Szóval ez hogy is van? ISP programozó==>nem tud debugolni programozó?
Ha igen, akkor tudtok javasolni valami alapból USB-s, debugolni képes programozót?
Esetleg, amit kiborg említett programozó Bővebben: Link egy USB-->soros port átalakítóval hobbi szinten 100%-osan megfelelhet nekem?
(#) tpeter válasza gtk hozzászólására (») Feb 23, 2009 /
 
Ezt a pergésmentesítős témát jobban át kell még néznem. (Meg be is kéne ugranom a lomexbe pár marék kondiért)

Viszont itt van ez a megszakítás kezelő kód:
  1. #include "avr/io.h"
  2. #include "avr/interrupt.h"
  3. #include "util/delay.h"
  4.  
  5. #define F_CPU 4000000
  6.  
  7. volatile int val = 128;
  8.  
  9. ISR(INT1_vect) {
  10.         if(PIND & (1<<PIND2)) // check for pin #2
  11.                 val--;
  12. }
  13. ISR(INT0_vect) {
  14.         if(PIND & (1<<PIND3)) // check for pin #3
  15.                 val++;
  16. }
  17.  
  18. int main(void) {
  19.         //configure interrupt for rising edges on INT1
  20.         MCUCR = 0b00001111;
  21.         GIMSK = 0b11000000;
  22.  
  23.         //enable interrupt
  24.         sei();
  25.  
  26.         //set portB to output
  27.         DDRB=0xFF;
  28.  
  29.         //set portD to input
  30.         DDRD=0x00;
  31.  
  32.         while (1) {
  33.                 PORTB=val;
  34.         }
  35.         return 0;
  36. }


Most már szerintem jól kezelem le másik INT láb "lekérdezését", de továbbra is csak az egyik irányba számol. Mi lehet a gond?

Tiny2313-ról van szó továbbra is.
(#) vzoole válasza tpeter hozzászólására (») Feb 23, 2009 /
 
Lehet hogy jó lenne az egy megszakítással lekezelt enkóder is, de szerintem ott a felfutó és lefutó éleket is figyelni kell.

Habár nem gondoltam át teljesen, de egy próbát megér.

MOD.: Habár közbe átgondoltam... mégse, visszavonom amit mondtam.

Program kódot így szúrj be:
(code=c) kód (/code)
természetesen szögletes zárójel
(#) vzoole válasza tpeter hozzászólására (») Feb 23, 2009 /
 
Egy ha nem 8 bites binális számot jelenítessz meg akkor egyszerűbb a debug-olás...

Led ki-be kapcsolásával kezdeném keresni a hibát valahogy így:

  1. #include "avr/io.h"
  2. #include "avr/interrupt.h"
  3. #include "util/delay.h"
  4.  
  5. #define F_CPU 4000000
  6.  
  7. volatile int val = 128;
  8.  
  9. ISR(INT1_vect) {
  10.     if(PIND & (1 << PIND2)) {
  11.         PORTD = 0xFF; // ledek bekapcs
  12.     } // if
  13.     else {
  14.         PORTD = 0x00; // ledek kikapcs
  15.     } // else
  16.  
  17. /* futófény
  18. ISR(INT1_vect) {
  19.     if(PIND & (1 << PIND2)) {
  20.         val = val*2;
  21.         if(val > 128) val = 1;
  22.     } // if
  23.     else {
  24.         val = val*2;
  25.         if(val<1) val = 128;
  26.     } // else
  27. }
  28. */
  29. int main(void) {
  30.     //configure interrupt for rising edges on INT1
  31.     MCUCR = 0b00001111;
  32.     GIMSK = 0b11000000;
  33.  
  34.      //enable interrupt
  35.     sei();
  36.  
  37.     //set portB to output
  38.     DDRB=0xFF;
  39.  
  40.     //set portD to input
  41.     DDRD=0x00;
  42.  
  43.     while (1) {
  44.         // futofény
  45.         //PORTB=val;
  46.     }
  47.     return 0;
  48. }
(#) vzoole válasza vzoole hozzászólására (») Feb 23, 2009 /
 
Lehetőleg az INT0-át kapcsold ki, csak elfelejtettem módosítani.

MOD.: ezt is módosítani kell, PORTB-t elírtam PORTD-re.
  1. ISR(INT1_vect) {
  2.     if(PIND & (1 << PIND2)) {
  3.         PORTB = 0xFF; // ledek bekapcs
  4.     } // if
  5.     else {
  6.         PORTB = 0x00; // ledek kikapcs
  7.     } // else
(#) tpeter válasza vzoole hozzászólására (») Feb 23, 2009 /
 
Szia!

Köszi az ötletet, ám nem igazán értem hogy mire gondolsz. Nekem úgy tűnik hogy az a baj, hogy az egyik INT-hez tartozó kódom valamiért sosem fut le, illetve - lehet hogy a rossz pergésmentesítés miatt - a másik láb lekérdezése ütközik gondba.
Ejj, de jó lenne egy debugger!

Egyébként szerintem is elég egy INT-tel lekezelni, ezt a két INT-eset csak végső elkeseredésemben csináltam

(amúgy a rendes kódbeillesztést hogy csinálod?)
(#) vzoole válasza tpeter hozzászólására (») Feb 23, 2009 /
 
Az enkódered közös pontja +5 volton van, és a kimenetek ellenállással testra vannak kötve igaz?

kódbeszúrás:
Bővebben: Link

MOD.: egyik adatlapba 8ms pattogást láttam, tehát lehetne így is csinálni

  1. ISR(INT1_vect) {
  2.     _delay_ms(8); // megvárni még lemegy a pattogás (8ms pattogás lesz, meg 8ms várás = 16ms)
  3.     if(PIND & (1 << PIND2)) {
  4.         PORTB = 0xFF; // ledek bekapcs
  5.     } // if
  6.     else {
  7.         PORTB = 0x00; // ledek kikapcs
  8.     } // else
(#) tpeter válasza vzoole hozzászólására (») Feb 23, 2009 /
 
Forditva van kötve, a közös pont van a test felé és a kimenetek felhúzva ellenállásal a tápra.

Gondoltam rá én is hogy ezt a pattogást sw-ből oldom meg. Esetemben ez is jó amit te mutattál, de talán nem célszerű blokkoltatni.

Na, ezt majd kipróbálom. Most alig látok a fáradságtól.
Köszi a tippeket, jó éjszakát!
(#) tpeter válasza tpeter hozzászólására (») Feb 24, 2009 /
 
a pergés / pattogásmentesítésre a következőt találtam ki:
INT kezelő rutinban tiltom a külső megszakításokat, majd inítok egy timer-t (t > t(pergés) ) ami pedig majd engedélyezni fogja azokat amikor lejárt.
Nyilván ezt már mindenki kitalálta előttem
(#) Sir-Nyeteg válasza Topi hozzászólására (») Feb 24, 2009 /
 
Puffer IC adta meg magát :yes:
Köszönöm!
Most már van tartalék is.

Amikor AVR stúdióban Szoftveresen csatlakoztatom az AVR-ISP programozót (kis AVR feliratú IC-gomb-ra klikk)
akkor előjön egy ablak, ami megkérdezi hogy akarom-e upgradelni a szoftvert. Mi történne, ha az OK-ra klikkelnék? Kikapcsolható ez a kérdés?
(#) Topi válasza Sir-Nyeteg hozzászólására (») Feb 24, 2009 /
 
Gyári kód van leklónozva, de az update lehetősége nincs benne.
Szóval ha az OK-ra kattintasz, annyi történik, hogy kiírja nem tudta update-elni.
(#) Istike88 válasza vzoole hozzászólására (») Feb 24, 2009 /
 
Helló!

Nem akarok közbeszólni, mivel csak mostanság tanulmányozom az avr-eket. Viszont azt figyeltem meg, hogy a GIMSK regiszter úgy van beállítva hogy az INT0 interrupt is engedélyezve van, és az MCUCR regiszter pedig úgy hogy mind két INT felfutóélre van állítva. Nem lehet hogy úgy egyszerűbb volna egy rotary encodert lekezelni, hogy ha két megszakítást alkalmazunk akkor az egyik a felfutóélt a másik pedig a lefutást vizsgálja? ( ha jól emlékszem akkor erre keresitek a megoldást)
Persze ez csak egy kevéssé hozzáértő hozzászólás, ötleteket próbálok adni illetve ihletet, nyugodtan kilehet javítani ha hülyeséget írok.

Üdv
(#) Istike88 válasza Istike88 hozzászólására (») Feb 24, 2009 /
 
még egy megfigyelés: ha jól értelmeztem az interruptokat akkor a PD2 lábat nem kell megvizsgálni az interruptban, mivel maga a megszakítás a lábon történő változásra következik be!
(#) tpeter válasza Istike88 hozzászólására (») Feb 24, 2009 /
 
ha egyre gondolunk, akkor: nem egészen.

a PD2-re az enkóder másik lába van kötve. Ezt azért kell megvizsgálni hogy tudjuk hogy melyik irányba van csavarva. Ez itt elég jól leírja.
(#) Istike88 válasza tpeter hozzászólására (») Feb 24, 2009 /
 
ahha! így már értem a vizsgálat lényegét!
(#) Sir-Nyeteg hozzászólása Feb 24, 2009 /
 
Meg lehet oldani egy AVR-nél, (pl atmega8), hogy ne lehessen kiolvasni, vagy pl írni, vagy csak én tudjam írni, pl valami jelszóval? Esetleg van egyszer-írható AVR?
Nézegettem, de annyira még nem tudok angolul, hogy a fuse bitek röviditéseit megértsem, vagy a többi menüpontot értelmezni tudjam.
Köszi!
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Feb 24, 2009 /
 
Van védelem AVR -re, ha a fuse biteket beállítod. Elég sok kombináció létezik. Mindenképpen elkéne olvasnod az adatlap Memory Programming/Fuse Bits bekezdését. Azért jó ha szem elött tartod, hogy magadat is ki fogod belölle zárni. Tehát a késöbbi program frissítés lehetetlen lesz, ha csak nem írsz valami okos bootlodert. Ami megfelelő ellenörzési protokol után frissíti a flash-t. Bár ha teljesen kiforrot végleges kódod van, akkor nem gond a frissítés hiánya.
(#) TavIR-AVR válasza ATtiny hozzászólására (») Feb 24, 2009 /
 
A FuseBitek beallitasa:

Csak kiolvasas vagy kiolvasas + ellenorzes ellen veded.


Biztosra mesz:
1, lock mind.
2, Disable Reset

Bővebben: Bővebben: Link
(#) Sir-Nyeteg válasza TavIR-AVR hozzászólására (») Feb 25, 2009 /
 
Köszönöm!
A frissítés csak hardveres változtatással lesz célszerű a jövőben, és mivel smd alkatrészeket használok, így felesleges a frissítésre törekedni, azaz megfelelne az egyszer írható verzió is.
Köszönöm!
Nagyon jó a leírás!
(#) gtk hozzászólása Feb 25, 2009 /
 
Nem ertem ezt a levedes dolgot. Miert nem tudom beirni a lock biteket?
A fuse bitek irasaval nincs gond, tehat soft es programozo hiba kizarva, es megis:#378987
(#) gtk válasza gtk hozzászólására (») Feb 25, 2009 /
 
-Termeszetesen lezarja, csak visszaellenorizni mar nem tudja (es ott dob errort) - ez mondjuk termeszetes, csak nekem elsore nem volt az
(#) diablo666 hozzászólása Feb 27, 2009 /
 
Üdvözletem.
Lenne pár kérdésem, kezdjük ott hogy szeretnék egy gitárhangolót csinálni, amit találtam is ezen a honlapon pár lappal hátrébb, a mellékelt fájlban ott a c forráskód.
már obj-be fordításkor hibák voltak benne:
avr-gcc -g -Os -mmcu=attiny2313 -c Dokumentumok/gtuner.c
In file included from Dokumentumok/gtuner.c:44:
/usr/lib/gcc/avr/4.3.0/../../../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for "
Dokumentumok/gtuner.c:50:1: warning: "F_CPU" redefined
/usr/lib/gcc/avr/4.3.0/../../../../avr/include/util/delay.h:86:1: warning: this is the location of the previous definition

A másik kérdés hogy a Center_Count-nál megadott értékek csak szerintem nem jók vagy más szerint se
Kicsit jobban kifejtem: a hangot néztem mert ugye azt mindenki tudja hogy az a hang az 440 Hz, a többi hangot nem tudom. kiszámolva hogy 8kk/64/220 ~568,18 ami nem 440 Hz. tehát vagy én értelmezem rosszul ezt a programot vagy rosszul lett kiszámolva.
Válaszokat előre is köszönöm

gtuner.c
    
(#) proba hozzászólása Feb 27, 2009 /
 
Most kezdtem AVR rel meg a C nyelvvel is foglalkozni.
Kezdeteknek az AVR STUDIO 4 -et gondoltam.
Sajnos midjárt a kezdeteknél elakadtam azt nem értem hogy a mellékelt C programnak miért a mellékelt ASM az eredménye,vagy mit rontottam el ,hova tünt a "a" meg a "c" változó.A fordításra meg a újraépítésre is kattintgattam de sehogyan sem sikerült őket is bevenni a buliba.
(#) killbill válasza diablo666 hozzászólására (») Feb 27, 2009 /
 
Ehhez latni kellene a util/delay.h-t, de szerintem a #define F_CPU sort az #include ele kellene tenni. De ez csak egy tipp.

A frekvenciakkal meg semmi baj. A
  1. #define A_STRING 220
az 220Hz-et jelent, es az is 'A' hang, csak egy oktavval melyebb, mint a 440Hz. Az a bizonyos kiszamolt ertek, a (BASE_FREQUENCY/A_STRING) az viszont mar nem Hz ertek lesz (amit te is kiszamoltal), hanem a kerdeses hang egy periodusa alatti timer lepesek szama.
(#) ATtiny válasza proba hozzászólására (») Feb 27, 2009 /
 
Semmit nem rontottál el. A kód optimalizálás kavar be neked. Mivel az a és c változó értékeit semmire nem használja a programod így a fordító szépen kioptimalizálta őket, hogy anyival is gyorsabban fusson a kód. Ha pontosan azt szeretnéd, hogy leforduljon, mint amit begépeltél, akkor vedd le az optimalizálás szintjét :O0 -ra. A Projekt beállításainál
(#) diablo666 válasza killbill hozzászólására (») Feb 27, 2009 /
 
Köszönöm a választ, jó hogy ezt tisztáztuk mielőtt valamit módosítanék benne.
Viszont még egy kérdés, mivel nem 8 MHz kvarcot rakok bele hanem 9.8304MHz-est, ezért F_CPU megváltoztatom a számot, kérdés hogy máshol is kell e valamilyen beavatkozást eszközölnőm e miatt.
(#) killbill válasza diablo666 hozzászólására (») Feb 28, 2009 /
 
Vegigneztem a kodot es szerintem eleg csak az F_CPU define-t atirni a megfelelo ertekre. Viszont kivancsi vagyok, hogy tenyleg az volt-e a baj, hogy a #define F_CPU sor rossz helyen volt.
(#) killbill válasza ATtiny hozzászólására (») Feb 28, 2009 /
 
Idézet:
„Ha pontosan azt szeretnéd, hogy leforduljon, mint amit begépeltél, akkor vedd le az optimalizálás szintjét :O0 -ra”


Pontosan. Viszont, ha megis szeretned elvezni az optimalizalas elonyeit, de valamiert fontos, hogy egy valtozoval kapcsolatos muveleteket pontosan ugy forditson, ahogy leirtad, akkor a valtozot 'volatile' kell deklaralni: pl:

int w;
for(w = 0; w < 1000; ++w);

sorok feltehetoleg az optimalizalas sullyesztojeben vegzik, de ha az irod, hogy:

volatile int w;

akkor a fenti for sort szepen beforditja, ahogy kell.
Következő: »»   106 / 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