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   588 / 840
(#) kokimy válasza zombee hozzászólására (») Feb 2, 2014 /
 
Köszi!
Akkor amit rendeltem Arduino nem sokra jó.

Mit ajánlasz, mivel kellene kezdeni? Mivel lehetne kísérletezni, mivel próbálkozzak? Milyen programozót kellene venni, s milyen AVR chippel kellene kezdeni? Illetve milyen programmal lehetne nekiállni az alapoktól programozni, s kitapasztalni, hogy mit is csinálok?
(#) zombee válasza Barbár hozzászólására (») Feb 2, 2014 /
 
A 6-os nem fogja felismerni, bármit is csinálsz. Csak a 4-es fogja látni.
A win eszközkezelőben (devmgmt.msc) nézd meg először a portoknál,
ha sárga felkiáltójel van rajta akkor a driver nem jó, telepíteni kell.

Én saját építésű stk500 és avrisp-mkII klónt használok, eddig mindkettő bevált. Win8 alatt is megy.
(#) zombee válasza kokimy hozzászólására (») Feb 2, 2014 /
 
Ha már megrendelted, ne tedd félre, lehet vele játszani. Aztán bátrabban indulhatsz neki
az "igazi" AVR-ezésnek.
(#) Vfr72 hozzászólása Feb 2, 2014 /
 
Sziasztok!
Az alábbi probléma megoldásához kérem a segítségeteket.
Adott egy hétszegmenses kijelző, amelyet multiplex vezérléssel működtetek. Időnként (ha jön egy megszakítás) ki kell lénem a kijelzési ciklusból, hogy lekezeljem a megszakítást. Sajnos a megszakítás nem tud kellően rövid lenni, mert be kell olvasnom egy értéket. A megszakítás idejére a kijelző "megtorpan", ekkor az egyik digit értéke fényesebb a többinél. Tehát ronda a kijelzés.
A multiplex vezérlés miatt muszáj a kijelzési ciklusidőt tartanom, de akkor mikor és hogyan olvassam be az értéket a portról?
Ötlet?
(#) zombee válasza Vfr72 hozzászólására (») Feb 2, 2014 /
 
Feltételezem hogy a kijelzőt a "főprogram" szolgálja ki, a beolvasást pedig egy megszakítás.
Miért nem bízod rá a kijelző kezelést is egy megszakításra? Mondjuk időzítőre...
(#) Vfr72 válasza zombee hozzászólására (») Feb 2, 2014 /
 
Van egy változóm (tömb), amelynek értékét a kijelzőre írom.
Az időzítő 250ms elteltével meghív egy függvényt, amely a meghíváskor beolvassa a soros porton lévő aktuális adatot (10 karaktert) és feltölti a tömböt az aktuális értékkel. A feltöltés után folytatódik a kijelzés.
Arra gondolsz, hogy időzítővel léptessem a kijelzőt?
(#) zombee válasza Vfr72 hozzászólására (») Feb 2, 2014 /
 
a soros portot és a tömb feltöltését kezelheted főprogramból, a kijelző léptetéseit megszakításból.
(#) benjami válasza zombee hozzászólására (») Feb 2, 2014 /
 
Nem tudom mi a bajod az arduino-val, azon is csak egy sima bootloaderrel ellátott atmega chip van. Nem kötelező a programot a hozzávaló fejlesztőeszközzel készíteni, ugyanúgy használhatod hozzá a normál AVR vagy ATMEL studiot. A fejlesztés idejére simán köré építhető a környezet, a végleges áramkörbe meg csak át kell dugni a chipet (persze csak ha nem SMD a cucc).
(#) csabeszq válasza zombee hozzászólására (») Feb 3, 2014 /
 
Ez így konkrétan nem igaz.

Az Arduino pazarolja az AVR memóriáját rendesen, de iszonyú kényelmes. Van rá egy rakás könyvtár és irodalom, simán illeszthető vele minden.

Én átszoktam Arduinora. Összeütöm a szoftvert gyorsan, a végső megoldás meg atmega328p lesz.

Kifizeted a drágább ic-t, de gyorsabban megvagy.
(#) zombee válasza csabeszq hozzászólására (») Feb 3, 2014 /
 
Kb. erre gondoltam egész végig. Kényelmes, de LED-ek villogtatásához és nyomógombozáshoz
kicsit drága. Tanuláshoz biztos nem ezt választanám.
(#) Vfr72 válasza zombee hozzászólására (») Feb 3, 2014 /
 
Köszi, megpróbálom a javaslatod.

üdv. Vfr72.
(#) TavIR-AVR válasza zombee hozzászólására (») Feb 3, 2014 / 1
 
Drága????

Az idődet is számold, mivel az Arduino az kb. azonnal működik, míg ha Te (kezdőként) rakod össze, a szívások több 10 órát is elvihetnek.

Kezdőként, ha csak küzdés és kudarc ér - soha nem lépsz tovább. Az induláshoz az Arduino teljesen jó, mert sokat megtanulsz a használat során. És utána _azonos_ hardware-n mehet tovább pascal, C vagy Basic fele is...

És az Arduino nem csak nyomógombozásra jó. Ardupilot és egy jópár nevesített *duino projakt sokkal gyorsabban kész, mintha megírogatnád... És az Arduinonak azért egész használható irodalma és közössége van...
(#) csabeszq válasza TavIR-AVR hozzászólására (») Feb 3, 2014 /
 
Pontosan, amikor érdekelt, hogy hogy megy a TV-m infrája, nem kezdtem leimplementálni a NEC és a többi protokolt. Betöltöttem a lib-et és megnéztem. A lib automatikusan felismerte a protokolt és láttam a kódját. A megértést a kész lib egyáltalán nem gátolja.

De mondjuk az LCD illesztőkről is beszélhetünk, melyek programozása nem piskóta, de kész libekkel simán viszed.

És persze az SPI kezelése, vagy az ADC is tök egyszerű.

Emellett írhatsz könyvtárakat, amiket későbbi projektjeid folyamán felhasználhatsz.

Van egy szint, amihez kevés az Arduino, de azt a szintet kezdőként elég sokára fogja elérni.
(#) csabeszq válasza csabeszq hozzászólására (») Feb 3, 2014 /
 
A neten keresgélve mindenhez találsz kész megoldást.

PS/2 billentyűzet, egér illesztés, sőt még a C64 1541-es lemezét is simán illesztheted. Kezdőként elég arra koncentrálni, amit csinálni akarsz és megkeresni a kész könyvtárakat hozzá.
(#) kokimy válasza csabeszq hozzászólására (») Feb 3, 2014 /
 
Szóval annyit csinálsz, hogy pl egy ilyen Arduinó boardba beletöltöd a programot, majd kiveszed a foglalatból az ICt és átteszed az általad csinált áramkörbe?

Tényleg, ha a 328P tönkremenne, akkor csak kiveszem, beleteszem az újat, és megy?
(#) zombee válasza kokimy hozzászólására (») Feb 3, 2014 /
 
Miután rátöltötted a bootloadert és beállítottad a FUSE biteket, igen.
(#) csabeszq válasza kokimy hozzászólására (») Feb 3, 2014 /
 
Vannak arduino-k amikből nehézkes kivenni, mert az IC SMD.

Ha DIP-es Arduino-t vettél, azzal kiszeded az IC-t és másikat raksz helyette bootloaderrel, fuse bitekkel. Ennyi.

Mindaddig, amíg Arduino alatt a VCC-t nem piszkálod, addig jó eséllyel csak az AVR-t tudod tönkretenni.

VCC-vel már képes vagy kiégetni minden IC-t az Arduino-n, sőt az alaplapod USB portját is. Elég mondjuk 30V-ot rátenned az 5V-ra és game over.

De rövidrezárástól is kiéghet némelyik kínai darab.

Kiadsz az egyik pinen logikai magasat, abból 40 mA kinyerhető, így nem kell piszkálnod a VCC-t. Ez a legtöbb esetben elegendő. Ha ennél több kell, akkor külső táp.
A hozzászólás módosítva: Feb 3, 2014
(#) kokimy válasza csabeszq hozzászólására (») Feb 3, 2014 /
 
Idézet:
„Ha DIP-es Arduino-t vettél, azzal kiszeded az IC-t és másikat raksz helyette bootloaderrel, fuse bitekkel. Ennyi.”


Azt leírnád, hogy a bootloadert és a fuse biteket hogyan lehet rátölteni, és a fuse biteket hogyan tudom beállítani?
Bocs, nagyon nem értek hozzá, de lelkes vagyok, s szeretném tudni.
(#) szili83 hozzászólása Feb 3, 2014 /
 
Pénteken megjött az arduino UNO-m, kipróbáltam, 0-13-ig digitális kimenetet állítottam be, és megnéztem LEDdel, mindet bekapcsoltam mint futófény, jó volt ment.

Gondoltam OK, kipróbálom a kijelzőt is. De itt jött a fekete leves.
Nem ment. Elöször így hibássan kötöttem be, és ráengedtem ezt a programkódot:
  1. /*  LiquidCrystal
  2.     LCD fuggvenykonyvtar
  3.     2x16 karakteres LCD mintaprogram
  4.     EXT1 aramkorre hangolva
  5.    
  6.     60 nap alatt Arduino tanfolyam
  7.     (c) TavIR http://www.tavir.hu  */
  8.  
  9. #include "LiquidCrystal.h"
  10.   // A LiquidCrystal eljarast hasznaljuk
  11.  
  12. LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
  13.   // Az LCD bekotese labak szerint:
  14.   // RS(D4), E(D5), D4(D6) ,D5(D7), D6(D8), D7(D9)
  15.  
  16. void setup() {
  17.     //Inicializalas
  18.     pinMode(13, OUTPUT);
  19.       //Az LCD hattervilagitas a D13
  20.       //Csak az EXT1 lapon!
  21.     digitalWrite(13, HIGH);
  22.       // Hatter bekapcsol
  23.     lcd.begin(16, 2);
  24.       //Az LCD 2 sor, 16 oszlopos
  25.     lcd.print("Hello, World!");
  26.       //LCD-re kiirunk szoveget
  27. }
  28.  
  29. void loop() {
  30.   //Maga a foprogram
  31.   lcd.setCursor(0, 1);
  32.     //A kiiras helye: 0. oszlop, 1. sor
  33.   lcd.print(millis()/1000);
  34.     //eltelt masodperc a bekapcsolas ota
  35. }


Majd rájöttem, hogy hülyeséget csináltam, s átkötöttem ez szerint ami a fenti programkódhoz kell.. De persze megint nem ment.... Fel is adtam, majd ma elővettem, hátha megy, de nem jó.
Akkor a 0-13-as digitális lábakat beállítottam kimenetté, tettem rájuk LED-et, és a következő furcsa jelenségre lettem figyelmes. A 4,5,6 lábaknál a LED halványan világított, a többi fényesen.
Szóval szerintem valamit tönkretettem. Ok, gondoltam akkor a programrészben a 4,5,6 lábakat átírtam a 1,2,3-ra, de úgy sem megy. Így működnie kellene? Vagy sikerült a kijelzőt és az arduinot is tönkretennem? Vagy más lábkiosztással kellene próbálkoznom?
A kijelzőn csak hátérvilágítás van, semi, a kontraszt sem változik.
Szóval a kijelzőt tettem tönkre, vagy az Arduinot, vagy mindkettőt? Hogyan lehetne letesztelni?
A hozzászólás módosítva: Feb 3, 2014
(#) csabeszq válasza kokimy hozzászólására (») Feb 3, 2014 /
 
Az elvi lehetőségekről írtam. Nekem van otthon ISP programozóm, így semmiből sem áll kivenni az IC-t, berakni egy másikat és a 6-os tüskesorra meg rárakni a programozót.

Ha az Arduino könyvtárába bemész, láthatod, hogy a hardware/arduino/boards.txt alatt melyik alappanelhez milyen fuse bitek és bootloader tartozik.

  1. uno.name=Arduino Uno
  2. uno.upload.protocol=arduino
  3. uno.upload.maximum_size=32256
  4. uno.upload.speed=115200
  5. uno.bootloader.low_fuses=0xff
  6. uno.bootloader.high_fuses=0xde
  7. uno.bootloader.extended_fuses=0x05
  8. uno.bootloader.path=optiboot
  9. uno.bootloader.file=optiboot_atmega328.hex
  10. uno.bootloader.unlock_bits=0x3F
  11. uno.bootloader.lock_bits=0x0F
  12. uno.build.mcu=atmega328p
  13. uno.build.f_cpu=16000000L
  14. uno.build.core=arduino
  15. uno.build.variant=standard


Értelemszerűen ha UNO-d van, akkor az optiboot_atmega328.hex-et rakod fel, amit a harware/arduino/bootloaders/optiboot alatt találsz meg.

Ha a neten keresgélsz, rájössz, hogy mindezt programozó nélkül is meg lehet csinálni, ide-oda dugdosol kondenzátorokat, vagy ellenállásokat, de ezt még sosem próbáltam. Minthogy van értelmes ISP programozóm, így dugdossa a kondenzátorokat az, akinek két anyja van.

Ha valaki életében már csinált ilyet, akkor az elmesélheti a részleteket.
(#) csabeszq válasza szili83 hozzászólására (») Feb 3, 2014 /
 
Egy LCD-t nehéz beizzítani, legalább annyira, amennyire egy Arduino-t tönkretenni.

Az Arduino lábait kötheted +5V-ra, vagy GND-re direkte, attól még nem megy tönkre. Minthogy más nincs, így kizárólag külső táppal tudod agyonverni.

Az LCD az más, mert mondjuk fordítva is kezdheted a számozást. Meg felcserélheted a +5V-ot és a GND-t, kicsit több játék van az agyonverésre.

Első kérdés: a háttérvilágítás megy-e (15-16-os lábon R1 meg kakaó)? Ha ez megy rögtön tudod, hogy melyik az egyenes irány. Ehhez nem kell semmi más, kizárólag ezt a két lábat bekötnöd. Értelemszerűen úgy lett kitalálva, hogy ha fordítva kötöd be, még nem döglik meg. (16-1, 15-2 lábak, mind VCC és GND)

Ha megvan a háttérvilágítás, akkor kötheted össze a többi lábat.

A kontraszt beállítása fontos, ha rosszul áll, akkor nem látsz semmit. Én amolyan totál brutál módon 220-ohmmal lekötöttem a földre. Elég hányadék kinézete lett tőle, de legalább sikerült olvasni. Ha a +5V-ra kötöttem volna értelemszerűen semmit sem láttam volna.

Talán kezdetben érdemes megtartani az eredeti kiosztást a programban.

  1. LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


Ez annyiból jobb, hogy a az adatbitek a PORTD-n vannak és meg nem mondom, hogy képes-e a lib adatokat átküldeni úgy, hogy össze-vissza portokon van.

A 0,1-es pineket hagyd ki a játékból, mert azok az UART lábak. (Serial)
A hozzászólás módosítva: Feb 3, 2014
(#) szili83 válasza csabeszq hozzászólására (») Feb 3, 2014 /
 
Értem, de akkor az a pár láb miért halványabb vajon?
Nem használtam külső tápot, ugyhogy nem mehetett elvileg tönkre.
A háttérvilágítás megy.A kontrasztot lekötöm a földre most, s megnézem mi az eredménye, pill megnézem, s megírom.
(#) csabeszq válasza szili83 hozzászólására (») Feb 4, 2014 /
 
A halványan világít sztori már velem is előfordult.

Elfelejtettem outputra kapcsolni a portot (pinMode), az a durva, hogy az AVR belső felhúzóellenállása képes látható fényt produkálni. Azt hiszed, hogy output, csak gyengén világít, közben az input felhúzóellenállását kapcsolgatod ki-be.

A hozzászólás módosítva: Feb 4, 2014
(#) szili83 válasza csabeszq hozzászólására (») Feb 4, 2014 /
 
Igazad van, így szépen erősen világít.

  1. void setup(){
  2.  
  3.   pinMode(4, OUTPUT);
  4.   pinMode(5, OUTPUT);
  5.   pinMode(6, OUTPUT);
  6.  
  7. }
  8.  
  9. void loop() {
  10.  
  11.    digitalWrite(4, HIGH);
  12.    delay(100);
  13.  
  14.  
  15.    digitalWrite(5, HIGH);
  16.    delay(100);
  17.  
  18.  
  19.    digitalWrite(6, HIGH);
  20.    delay(100);
  21.  
  22.  
  23. }
(#) szili83 válasza csabeszq hozzászólására (») Feb 4, 2014 /
 
A kontraszt megjött így.
Amúgy mivel lehet normálisan beállítani, hogy a potit kihagyom?
A kiíratást holnap megnézem, s bekötöm rendesen az egészet.
1 soron volt kép, azaz minden pixel sötét volt, de a másik az semmi....
(#) csabeszq válasza szili83 hozzászólására (») Feb 4, 2014 /
 
Ha inicializálod, akkor kétsoros lesz. Ha ki is írsz rá valamit, akkor a kockák mögött megjelennek a betűk.

Poti nélkül persze szépségversenyre ne menj vele, de nálam a kék LCD olvasható, csak borzasztó ronda.
(#) csabeszq válasza csabeszq hozzászólására (») Feb 4, 2014 /
 
Jelenleg szóközöket látsz a felső sorban, alsó sor ki van kapcsolva. A betűid ezekben a kockákban lesznek.
(#) TavIR-AVR válasza szili83 hozzászólására (») Feb 4, 2014 /
 
A fekete kocka: a kijelző kap tápot és van kontraszt.
Az I2C LCD könyvtárban a paraméterek az LCD és a PCF8574 chip közti beállítást/bekötést adják meg. Ezt vagy ki kell mérni, vagy a gyártói mintakódot kell használni (rajz alapján beállítani). Eddig 5 féle bekötéssel találkoztam.

De itt még az I2C illesztőIC címét is meg kell tudni, mert ebből 8-8 féle lehet (PCF8574 vagy 8574A chip).

A vezérlő bekötése az SCL/SDA (A4/A5) lábakra mehet csak, máshova NEM!

Hogy ne kelljen I2C címet keresgélni:
  1. /*
  2.   TWI/I2Cscanner
  3.   (c) TavIR http://www.tavir.hu
  4.  
  5.  This sketch tests the standard 7-bit addresses
  6.  from 0 to 127. Devices with higher bit address
  7.  might not be seen properly. Work only at hardware I2C/TWI!
  8.  
  9.  Tested via Arduino 1.0.2
  10.  
  11.   Founded at arduino.cc forum
  12.   Modified 12 March 2013
  13.   by TavIR / Robert Cseh
  14.  
  15.   This example code is in the public domain.
  16.  */
  17.  
  18. #include <Wire.h>
  19.  
  20. void setup()
  21. { Wire.begin();
  22.   Serial.begin(9600);
  23.   Serial.println("\nI2C Scanner"); }
  24.  
  25. void loop()
  26. { byte error, address;
  27.   int nDevices;
  28.  
  29.   Serial.println("Scanning...");
  30.  
  31.   nDevices = 0;
  32.   for(address = 0; address <= 127; address++ )
  33.   {
  34.     // The i2c_scanner uses the return value of
  35.     // the Write.endTransmisstion to see if
  36.     // a device did acknowledge to the address.
  37.     Wire.beginTransmission(address);
  38.     error = Wire.endTransmission();
  39.  
  40.     if (error == 0)
  41.     { Serial.print("I2C device found at address 0x");
  42.       if (address<16)
  43.         Serial.print("0");
  44.       Serial.print(address,HEX);
  45.       Serial.println(" !");
  46.       nDevices++;
  47.     }
  48.     else if (error==4)
  49.     {
  50.       Serial.print("Unknow error at address 0x");
  51.       if (address<16)
  52.         Serial.print("0");
  53.       Serial.println(address,HEX);
  54.     }    
  55.   }
  56.   if (nDevices == 0)
  57.     Serial.println("No I2C devices found\n");
  58.   else
  59.     Serial.println("done\n");
  60.  
  61.   delay(8000);
  62. }
A hozzászólás módosítva: Feb 4, 2014
(#) TavIR-AVR válasza szili83 hozzászólására (») Feb 4, 2014 /
 
Poti helyett: két fix ellenállással helyettesíted
(#) csabeszq válasza TavIR-AVR hozzászólására (») Feb 4, 2014 /
 
Ez nem I2C LCD, 16 lábú.
Következő: »»   588 / 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