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   99 / 840
(#) Ricsi89 hozzászólása Jan 30, 2009 /
 
Helló!
Az Attiny45 reset lábát, ha beállítom kimenetnek, akkor hogy lehet programozni, ha nincs reset láb? kellene ez a láb kimenetnek, mert a többi már foglalt.
(#) snapscan válasza Ricsi89 hozzászólására (») Jan 30, 2009 /
 
Ha egyszer átprogramoztad I/O lábnak, onnan már csak magas feszültségű programozással tudod újra programozni.
(#) Ricsi89 válasza snapscan hozzászólására (») Jan 30, 2009 /
 
Akkor valami mást kell kitalálnom.
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Jan 30, 2009 /
 
Úgy gondoltam, hogy:
k=0
while(1)
if(nyomod a gombot): (for k++, timer)
if(nem nyomod a gombot & k=!0)
ebben:
if(k<50) rövid volt, k=0
else: hosszú volt, kilép while ciklusból is, és ugrik tovább

Csakhogy ezt azé se sikerült sehogyan sem összehozni, pedig egyszerűnek tűnik, így lett belőle ez:

k=0
while(1)
if(nem nyom): (for k++, timer)
if(nyom & k<50) rövid volt, k=0
if(nyom & k>50) hosszú volt, megy tova...

Így tehát nem tudtam összehozni a hosszú gombnyomást, de ha sokáig nem nyomod a gombot, akkor azt érzékeli, és kigyúl egy led, h innentől már más funkcijó tartozik az ujabb gombnyomáshoz.
Nah, ez az ötlet hogy tetszik?
Bár még próbálkozom az eredeti megvalósítással.>
(#) Sir-Nyeteg hozzászólása Jan 31, 2009 /
 
Hümm... (ha így kezdek egy hozzászólást, akkor lehet félni; magamtól is szoktam)
Atmega8, de általánosíthatunk is.
Lehet-e egy változó értékét lementeni úgy, hogy az legközelebb megmaradjon, akár áramszünet esetén is?
Sajna most már összekevertem, EEPROM, FLASH, RAM stb.
Elmentem, hogy mi volt utoljára a változó értéke, és legközelebb egyből azzal indul a program, hogy kiolvas?
Ez tartozna a hosszú-rövid gombnyomáshoz.
(rövid: növel, hosszú elfogad)
(#) TavIR-AVR válasza Sir-Nyeteg hozzászólására (») Jan 31, 2009 /
 
SRAM: Statikus memória. Amíg áram alatt van a chip, addig memóriaként működik. Utána felejt. A változók tárolása van itt.

Flash: Flashmemória, avagy programmemória. Itt tárolódik a programod. lap szervezésű.

EEPROM: háttértár, ahova írhatsz, olvashatod. Byte szervezésű. Kikapcs adatok tárolására ideális.

basom alatt:
Dim a as byte ERAM 'Az EEPROMban tárolódó A érték
writeeeprom mit, hova 'a mit erteket a hova cimen tárolja (byte)
readeeprom mit, honnan 'a mit változót a honnan címről feltölti.
Bascom + EEPROM
(#) Sir-Nyeteg válasza TavIR-AVR hozzászólására (») Jan 31, 2009 /
 
Áh, köszi.
Én C-ben tologatom a progikat, találtam adatlapban is példát rá, de ott mindenféle memóriacímeket említ, amit szivesen kihagynék, ill. nekem az nem mond semmit, hogy (mit, hova), mert az rengeteg variáns lehet... meg ezt külső függvénnyel hogyan hívjam meg, meg stb stb.
Köszi, kutatgatok még mintaprogik után C-ben. De ezek szerint nem lesz bonyi a dolog.

Nem találtam.
Esetleg nincs valakinek komplett programja, ami működik, 100%-ig egyértelmű lenne? Bocsi
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Jan 31, 2009 /
 
Itt a kód, nem teszteltem, de működnie kellene. Persze a timer -t az AVR tipusához kell konfigurálni, illetve a gombot én a kód alapján a PORT B -re raktam, ezt is át kéne írni ahova jólesik.


Szerkesztve : A fórum motor nem képes jól megjeleníteni a kódot... Amit itt látsz az hiányos... Ha kell a jó kód írjál.
  1. #define GOMBPIN 3 //Melyik PIN -en van a gomb ? A gomb alapbol nyitott és a föld felé záródik
  2. #define MINIMALISIDO 10
  3. #define ROVIDIDO 5000
  4.  
  5. int gombvizsgalat(void)
  6. {
  7.  if(!(PINB & (1<<GOMBPIN)))   // gomb le van nyomva?
  8.   {
  9.    if(TCCR1B ==0) //ha nem fut a timer1
  10.    {
  11.     TCCR1B |= (1<<CS12)|(1<<CS12);  // Timer1 16bites indtása preselect ratio : 1024
  12.         TCNT1 = 0; //Timer1 nullázása
  13.    }
  14.   }
  15.   else //nincs lenyomva a gomb
  16.   {
  17.    if(TCCR1B !=0) //ha fut a timer1
  18.    {
  19.     TCCR1B = 0; //akkor leállítjuk
  20.     if(TCNT1<MINIMALISIDO) return 0; //levolt nyomva a gomd te túl rövid ideig
  21.         if((TCNT1>=MINIMALISIDO)&&(TCNT1<ROVIDIDO)) return 1; //Rövid gomb nyomás volt
  22.         return 2; //Hoszu gomb nyomás volt
  23.    }
  24.   }
  25.  return 0;
  26. }
  27.  
  28. void rovid_lenyomas(void)
  29. {
  30. // Ez a kod fut le ha rovid ideig volt lenyomva a gomb
  31.  
  32. }
  33.  
  34. void hoszu_lenyomas(void)
  35. {
  36. // Ez a kod fut le ha hoszu ideig volt lenyomva a gomb
  37.  
  38. }
  39.  
  40. void nincs_lenyomas(void)
  41. {
  42. // Ez a kod fut le ha nem volt lenyomva a gomb
  43.  
  44. }
  45.  
  46. int main(void
  47. {
  48.  //init
  49.  DDRB &= ~(1<<GOMBPIN); //Bemenet lesz a gomb
  50.  PORTB |= (1<<GOMBPIN); //felhúzó ellenállás
  51.  
  52.  while(1)
  53.  {
  54.   switch(gombvizsgalat())
  55.   {
  56.    case 1: rovid_lenyomas(); break;
  57.    case 2: hoszu_lenyomas(); break;
  58.    default: nincs_lenyomas(); break;
  59.  }
  60. }
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Jan 31, 2009 /
 
Köszönöm szépen, működik is!
Bemásolom ide a konkrét megoldást, hogy kereshető legyen:

EEPROM írása c nyelven:
  1. #include <avr/eeprom.h>
  2.  
  3. ...main()...
  4.  
  5. írás:
  6. eeprom_busy_wait();
  7. eeprom_write_byte((uint8_t*)0,a);
  8. eeprom_busy_wait();
  9.  
  10. olvasás:
  11. eeprom_busy_wait();
  12. a= eeprom_read_byte((uint8_t*)0);
  13. eeprom_busy_wait();

a változót írtuk be és olvastuk ki a 0-ás memóriahelyről
Köszönet!
(#) Grebi hozzászólása Feb 1, 2009 /
 
üdv mindenkinek

Felmerült egy olyan probléma hogy nem akarja az istenért sem beprogramozni az a vezérlőt a programozó... Ez lett volna a programozó teszt programozása, de valahogy nem tudom beállítani hogy működjön...levettem a frekvenciát is a CLKDIV8 fuse miatt ami benne van a mikrovezérlőben, de akkor sem megy mi lehet a probléma? Miért nem akarja felprogramozni a vezérlőt, vagy lehet hogy én raktam rosszul össze a programozót??
Valaki segitsen mert én már tanácstalan vagyok :nemtudom: :no:
Előre is kössz....
(#) Grebi hozzászólása Feb 1, 2009 /
 
A screenshot lemaradt....ezen rajta van a hibaüznet...
Valamint a az AVR-ben elindul a program de nem úgy működik ahogyan kellene...
Ez egy egyszerü 2 LED-es villogó lenne de a két leg egyszerre villog ahelyett hogy felváltva tenné ezt...

error.JPG
    
(#) gtk hozzászólása Feb 2, 2009 /
 
Sziasztok !

Attiny2313:
Kellene egy Open Drain I/O kulso felhuzo ellenallassal (4.7k) iButton -hoz (OW protokol).
Ahogy nezem csak a TWI-nel van ilyen,
SDA jo is lenne, csak az a kerdes, hogy hogyan hasznalhatnam egyszerre I/Onak es programozasra is?
Vagy esetleg mas lehetoseg?

Koszi.
(#) gtk válasza gtk hozzászólására (») Feb 2, 2009 /
 
Az mar vilagos hogy I/Okent hasznalhato kulso felhuzo ellenallassal.
Az nem, hogy a DDRx es PORTx regisztereken kivul mast is kell configolni?

Idézet:
„Pull-ups on the SDA and SCL port pin are disabled in Two-wire mode.”


Namost van belso felhuzo ellenallasa es ki kell kapcsolni azzal hogy TWI modot allitok a portnak? vagy nincs?
(#) ATtiny válasza gtk hozzászólására (») Feb 2, 2009 /
 
Ha lefordítom a szöveget amit bemásoltál, abból az jön le, hogy kikapcsolja a beépített felhúzó ellenállást automatikusan. Még sosem próbáltam így használni. Egyénként miért nem jó a beépített felhúzó ellenállás? Én szertem használni őket így. Megspórolok egy külső ellenállsát. A programozás miatt ne aggódjál, ott nem zavar be a beépített felhúzó ellenállás, külső felhúzó ellenállás, sem okozhat elvileg bajt a programozó lábakon, de megintcsak ismételni tudom magam, ha csak anyi az össz feladat, hogy felhúzd a tápra a lábat, arra tökéletes a beépített felhúzó ellenállás is.
(#) gtk válasza ATtiny hozzászólására (») Feb 2, 2009 /
 
Nem jo a belso iButton eseteben, es mas Open Drain I/O nincs az ICn.
Az erdekelne hogy alapbol ki van kapcsolva a belso felhuzo ellenallas, vagy ezt valami configgal meg kell tenni ?
Lesz meg mivel kinlodni, ebben biztos szeretnek lenni.

(#) ATtiny válasza gtk hozzászólására (») Feb 2, 2009 /
 
Alapból bekapcsoláskor minden lábon inaktív a felhúzó ellenállás. Illetve alapból a lábak is tristate bemenet állapotban vannak. Ezek állapotát a progam tudja megváltoztatni a futás során. De bekapcsoláskor mindíg így indul ahogy leírtam.
(#) Sztyopa hozzászólása Feb 2, 2009 /
 
Kedves Mindenki!

Egy ATmega2561-est szeretnék programozni/debugolni az ePosz cég JTAG ICE eszközével. Namost tudok kapcsolódni az AVR-hez de pl. a fuse biteket nem olvassa nem írja a lock biteket olvassa (0xFF) programozni nem tudok de olvasni igen. Ugyanakkor olvasáskor csupa 0-t olvas. Namost az eredeti JTAG ICE nem támogatja ezt a mikrovezérlőt de elvileg ezzel lehet ezt programozni, legalábbis úgy kaptam hozzá hogy működik. Ha tudna valaki segíteni hogy mi lehet a baj akkor azt megköszönném.
(#) gtk válasza ATtiny hozzászólására (») Feb 2, 2009 /
 
Koszi. Ezek szerint hasznalhatom I/O-kent kulso felhuzo ellenallassal. Hamarosan kiderul.
(#) wg_kezdo hozzászólása Feb 2, 2009 /
 
Egy ötletem megvalósíthatóságára szeretném kikérni a véleményeteket:
Egy digitális jel felvevőt és lejátszót szeretnék építeni.
Az alapötlet, hogy pl USB-s készülékeket átvezetni egy AVR-en vagyis a lábakat (adatlábak) rákötni egy AVR két lábára. Majd ezt továbbvezetni a laptophoz.
Amikor lenyomok egy gombot az AVR elkezdi felvenni mindkét jelet majd ezeket vissza lehet játszani:
Pl:
Billentyűzet bedugásakor felveszi az elejét amíg felismeri az eszközt.
Majd megállítom.
Lenyomom pl az A betűt ezt felveszem stb...stb...

Az USB-nél, ha jól látom az 1 és 4 láb a +5V és a föld.
A másik kettőre azt írták, hogy data + és data - ez pontosan mit jelent?
(#) gtk válasza wg_kezdo hozzászólására (») Feb 2, 2009 /
 
Eloszoris az USB protokol tul bonyolult .
Masodszor hogy akarod max. 16MHz-en futo procival "felvenni" a 60Mbyte/s adatatvitelt? (USB2.0) Es hova tarolod el?
(#) ATtiny válasza wg_kezdo hozzászólására (») Feb 2, 2009 /
 
Elméletig lehetséges amit akarsz, de nem lesz túl könnyű dolgod, már az illesztésnél problémák lesznek. Az usb csavart érpáras fizikai közeget használ az átvitelhez, és csak a leglassabb átviteli sebességnél kmpatibilis valamelyest a logikai jelekkel. High Speed módba 400mV-os jelek szaladgálnak a kábelen, azt te nem fogod egyszerüen feldolgozni, már csak a 480Mbit/sec -es sebesség miatt sem. Bár a Low Speed 1,5Mbit/sec -je is elég nagy kihívás, hogy letudjad menteni valahogy.
(#) huba válasza wg_kezdo hozzászólására (») Feb 2, 2009 /
 
Ha USB-s billentyűzetet akarsz AVR-vel szimulálni (karakterküldés ilyesmi) akkor arra vannak netten kész megoldások. Topi is így oldotta meg a valamelyik témában bemutatott adatgyűjtőjét, ami excelbe irogat.
(#) vzoole hozzászólása Feb 2, 2009 /
 
Sziasztok!

Egy elméleti kérdésem lenne...

Szeretnék építeni egy chronométer-t, azaz lövedék sebesség mérő műszert.

Airsofthoz kéne, ahol a lövedékek kezdő sebessége kb 80m/sec és 150m/sec közözz mozog.

Lenne két érzékelő (optpkapu), első indítana egy számlálót, második leállítaná, és kijelezné ezt sebességben.
Ha 10 centire helyezem az érzékelőket egymástók akkor 1/1000 (0,001) mp alatt lemegy az indítás, leállítás (vagy még gyorsabban).

Gondolom ez nem jelent gondot, pl egy 16MHz kvarc oszcillátorral 16000 utasítást tud végrehajtani 0,001 mp alatt?

Ilyen egy gyári készülék:
Chronographs
(#) wg_kezdo válasza ATtiny hozzászólására (») Feb 3, 2009 /
 
Sejtettem, hogy nem lesz egyszerű.
Akkor marad a második megoldás avagy fogok egy USB-s billentyűzetet és kiszerelem az elektronikáját.
(#) icserny válasza wg_kezdo hozzászólására (») Feb 3, 2009 /
 
Az ötlet megvalósítható, de olyan eszközök kellenek hozzá, amivel kivitelezhető a ~21 nanoszekundumonkénti mintavételezés és az adatok ilyen ütemű eltárolása.

Ilyen például a BEAGLE USB 12 analizátor.


A High Speed eszközök (gyors USB pendrive, külső diszkek) esetén egy 64 megabájtos átmeneti tárolóval "lassítják meg" a forgalmat ahhoz, hogy a 16,7 ns feloldású mintavételező veszteségmentesen fel tudja dolgozni a jeleket.

Természetesen az egésznek csak akkor van értelme, ha van a háttérben egy olyan program, amelyik analizálja a jeleket, és emészthető formában mutatja a protokolt a felhasználónak.



(#) wg_kezdo válasza icserny hozzászólására (») Feb 3, 2009 /
 
Topi csinált itt egy olyat, hogy egy atmega8 (16?) -ost úgy látott a gép, mint egy billentyűzetet.
Namármost nekem is hasonlóra lenne szükségem.
Az a baj, hogy mindegyik megoldás komplett és nagyon hosszú bonyolult a forráskódjuk, napokig tartana értelmezni.
Általános leírást pedig nem találtam eddig, hogy hogyan is működik ez az usb dolog, ha csak egy sima kis billentyűzetről lenne szó.
(Amúgy Joystick készül így ha minden kötél szakad marad a kiszerelt USB-s billentyűzet elektronikája)
(#) Hooligan01 válasza vzoole hozzászólására (») Feb 3, 2009 /
 
Hello!

Én egyszer készítettem egy ilyen chrono-t.
Igaz basic volt a nyelv, de az most szinte nem lényeg.
Link
(#) gtk hozzászólása Feb 3, 2009 /
 
Sziasztok !

Irok valami drivert attiny2313-ra.
Irtam ket delay fuggvenyt:

  1. void
  2. delay_us (uint16_t us)
  3. {
  4.   do {
  5.    _delay_us (1.0);
  6.   }while (-- us);
  7. }
  8.  
  9. void delay_ms (double ms)
  10. {
  11.   //delay time in us = ms*10*100
  12.   uint16_t t = (10 * ms);
  13.   while (t--)
  14.     delay_us (100);
  15. }


Belso 8 MHz , 8 DIV unprogrammed -nel a delay_ms(500); kb 4-szer akkora idot kesleltet.
(L FUSE = 11100010)

Mi lehet a gond
(#) gtk válasza gtk hozzászólására (») Feb 3, 2009 /
 
Ha igy irom az 1sec delayt akkor jo:

  1. _delay_ms(100.0);
  2. _delay_ms(100.0);
  3. _delay_ms(100.0);
  4. _delay_ms(100.0);
  5. _delay_ms(100.0);
  6. _delay_ms(100.0);
  7. _delay_ms(100.0);
  8. _delay_ms(100.0);
  9. _delay_ms(100.0);
  10. _delay_ms(100.0);


Ennyi ido elmenne a ciklussal ?
mega8-nal nem emlekszem hogy ilyen nagy elteres lett volna.
(#) ATtiny válasza gtk hozzászólására (») Feb 3, 2009 /
 
Használható a _delay_us (double __us) és _delay_ms (double __ms) is ha include -olod a delay.h -t. ezek után nem értem mindek akarsz olyan delay fügvényt írni ami már kész van. Ezek a gyári fügvyények elvileg pontosak, ha jól megadtad a processzor sebességét a #define F_CPU 8000000UL parancsal (itt most 8Mhz). Amúgy meg javaslom áttanulmányozni az WinAVR\avr\include\util\delay.h file-t mert abban pontosen le van írva, hogyan is kell használni. Én szeméyl szerint nem szeretem ezeket a gyári delay-eket mert sokkal hatékoynabban is lehet késleltetni, de amúgy működnek.
Következő: »»   99 / 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