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   175 / 840
(#) Melphi hozzászólása Jan 2, 2010 /
 
Sziasztok érdeklödni szeretnék hogy evvel a példánnyal lehetne attiny26-ot felégetni?
Előre is köszönöm.
(#) janyjozsef válasza Topi hozzászólására (») Jan 2, 2010 /
 
Bocsi!

Igazad van!
Elírtam

400byte
(#) labu01wx hozzászólása Jan 2, 2010 /
 
Sziasztok!
Egy olyan programot szeretnék írni, ami az első gomnyomásra felkapcsol egy zöld ledet, majd mégegy gombnyomásra átvált sárgára, pirosra, zöldre....
Ha rövid ideig nyomva tartom, akkor kikapcsolja a ledeket.
A program elkészült, de csak a zöld led világít(+néha kikapcsol) ha nyomom a gombot, ha nem.
A program így néz ki:
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define GOMB_ALL (!(PINB  &   (1<<PB2)))
  5. #define LEDS_ALL (PORTB & ((1<<PB0)|(1<<PB3)|(1<<PB4)))
  6. #define LEDS_OFF (PORTB &= ~((1<<PB0)|(1<<PB3)|(1<<PB4)))
  7.  
  8. #define ZOLD_ON   (PORTB |=  (1<<PB0))
  9. #define ZOLD_OFF  (PORTB &= ~(1<<PB0))
  10. #define ZOLD      (1<<PB0)
  11.  
  12. #define SARGA_ON   (PORTB |=  (1<<PB4))
  13. #define SARGA_OFF  (PORTB &= ~(1<<PB4))
  14. #define SARGA      (1<<PB4)
  15.  
  16. #define PIROS_ON   (PORTB |=  (1<<PB3))
  17. #define PIROS_OFF  (PORTB &= ~(1<<PB3))
  18. #define PIROS      (1<<PB3)
  19.  
  20.  
  21. void m_delay_10ms(unsigned short val) {
  22.   unsigned short i;
  23.   for(i=0;i<val;i++) _delay_ms(10);
  24. }
  25.  
  26. int main(void) {
  27.   DDRB |=((1<<PB0) | (1<<PB3) | (1<<PB4) | (0<<PB2));
  28.   PORTB|=(1<<PB2);
  29.   while(1) {
  30.     if (GOMB_ALL) {
  31.           m_delay_10ms(50);
  32.           if (GOMB_ALL && LEDS_ALL) { LEDS_OFF;}
  33.           else {
  34.             switch (LEDS_ALL) {
  35.                   case PIROS: ZOLD_ON; PIROS_OFF; break;
  36.                   case ZOLD: SARGA_ON; ZOLD_OFF; break;
  37.                   case SARGA: PIROS_ON; SARGA_OFF; break;
  38.                   default: ZOLD_ON;
  39.           }
  40.         }
  41.      }
  42.   }
  43.   return 0;
  44. }

A segítséget köszönöm!
(#) Sir-Nyeteg válasza labu01wx hozzászólására (») Jan 2, 2010 /
 
Első ránézésre: switch-case "helyesírása"! Nézz meg egy mintaprogramot és abból másold, ha nem megy fejből!
Szintaktikai hiba. Vagy csak a bemásolás miatt tűntek el karakterek belőle?
(#) Sir-Nyeteg válasza Sir-Nyeteg hozzászólására (») Jan 2, 2010 /
 
Vagy csak én vagyok a ... áh, bocsi.
Csendben maradtam volna...
(#) Ricsi89 válasza labu01wx hozzászólására (») Jan 2, 2010 /
 
Gyorsan összedobtam a dolgot és nekem a váltás működik, csak a kikapcsolás nem megy benne, mert a zöld villog 0,5s-onként.
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Jan 2, 2010 /
 
Van két lehetőség. Az egyik, hogy addig maradnak sötétek a ledek, ameddig nyomod a kapcsolót, vagy addig amíg újra nem indítod az AVR-t. Az elsőt egy while ciklussal lehet megcsinálni, a másodikat pedig egy break paranccsal. Kb így:
  1. if (GOMB_ALL && LEDS_ALL) { while(GOMB_ALL) LEDS_OFF;}

A másikat pedig:
  1. if (GOMB_ALL && LEDS_ALL) { LEDS_OFF; break;}
Ezekkel a megoldásokkal nekem működik a váltás és hosszan nyomva a gombot kikapcsol mindegyik led.
(#) janyjozsef válasza labu01wx hozzászólására (») Jan 2, 2010 /
 
Prell hibád van. Tegyél az
  1. if(GOMB_ALL) {}
végére is egy kis várakoztatást, mer, ha hosszan nyomva van a gomb, akkor azonnal visszaugrik az if-be. Talán ez a gond.
(#) janyjozsef hozzászólása Jan 2, 2010 /
 
Mire mondtam valamit, már meg is válaszolta gr98.
(#) Stefan válasza labu01wx hozzászólására (») Jan 3, 2010 /
 
Ez talan segit valamit
  1. unsigned char xy;
  2. char gombckeck(void){ //nem:0 rovid:1 hosszu:2, prellmentesitett
  3. xy=0;
  4. if (!GOMB_ALL) return 0;
  5.         else{
  6.                 while(GOMB_ALL){        //prellmentesito ciklus most 30ms
  7.                 _delay_ms(1);
  8.                 xy++;
  9.                         if ( xy >=30){
  10.                                 while (GOMB_ALL) {
  11.                                 xy++;
  12.                                 m_delay_10ms(10);
  13.                                 if (xy >=50) return 2; ///20*100ms=2 masodperc a hosszu gombnyomas
  14.                                 }
  15.                         return 1;
  16.                         }
  17.                                
  18.                 }
  19.                
  20.         }
  21. return 0;
  22. }

Most írtam kómás fejjel, nempróbáltam ki!
(#) janyjozsef hozzászólása Jan 3, 2010 /
 
Sziasztok!

Tudja valaki, hogy ATMEGA esetén (16MHz quartz-al) mekkora lehet egy külső INT elméleti maximális frekvenciája.

Köszi.
(#) edison14 hozzászólása Jan 4, 2010 /
 
HELLO !

Valaki tudna egy leírást adni, hogy AVR studioban hogyan kell programozni és hogy hogyan kezdjek neki a programozás tanulásának? Egy ATmega8-al szeretném elkezdeni mert az adatlapja szerint sok funkciót tartalmaz ezért az alapoktól kezdve a nagyobb programokig meg tudnám tanulni a kezelését. Még annyi kérdésem lenne, hogy milyen nyelven tanuljak meg programozni? Két nyelvről biztosan tudok az egyik az ASSEMBLY a másik a C vagy C++.

A segítséget előre is köszönöm.
(#) trudnai válasza edison14 hozzászólására (») Jan 4, 2010 /
 
Kattints a "Kapcsolasok"-ra, ott a kereseshez irdd be, hogy "nyolc", elo kell jonnie a Topi fele anyagnak, a "Nyolc labbal" cikksorozatnak. Szerintem indulj ki onnan, meg olvasgasd ezen a forumon, hogy kik miket irkaltak, milyen hibakkal talalkoztak es azokra milyen valaszok jottek.

Amugy Assembly vagy C vagy "Mas": Van meg a Bascom-nak nevezett dolog, amihez en nem konyitok, talan azt is megnezheted, de velemenyem szerint C-vel probalkozz. Assembly-t is erdemes megtanulni legalabb olyan szinten, hogy olvasni tudd a forras kodot. C++ -t en hanyagolnam mikrokontrolleres kornyezetben...
(#) Fizikus válasza edison14 hozzászólására (») Jan 5, 2010 /
 
A Hobbielektronika weboldalon kattints a Kapcsolasok pontra, majd az MCU (Mikrokontroller) pont alatt az AVR-re. Az itt levo 9 cikket erdemes kezdetnek elolvasni.
(#) szoto hozzászólása Jan 5, 2010 /
 
Sziasztok!


Két Avr-t (atmega16-atmega8) szeretnék I2C buszon összekötni. Reggel óta keresgélek, de csak avr-eeprom kapcsolatra találtam példát.

Tudna valaki segíteni?
(#) szliczki hozzászólása Jan 5, 2010 /
 
Sziasztok!
USB csatlakozóval ellátott Joystick, AVR processzorral történő lekezeléséhez keresek iránymutatást. Nem olyat ami PC beiktatásával működik, hanem ami közvetlenül fogadja a jeleket a Joyról.
Tippeket előre is köszönöm!
(#) poznamokus válasza edison14 hozzászólására (») Jan 5, 2010 /
 
Szia!

Engem anno egyetemen bevágtak a mélyvízbe egy atmega128-al, kb egy év alatt értettem meg a dolgokat, pedig előtte C-ben már elég jól programoztam. Ha még nagyon kezdő vagy, akkor valóban érdemes a 8 lábas csodának nekiállani, bár az Atmega8 sem egy nagy szám, ugyanakkor csodákra is képes. (Nekem a házi vekkerem is azzal van megcsinálva)
(#) Lucifer válasza szliczki hozzászólására (») Jan 5, 2010 /
 
USB host implementációt (sem szoftveres, sem hardveres) én még nem láttam 8 bites AVR-en. A 32 biteseken van OTG, de az sem tud hostként viselkedni.
(#) TavIR-AVR válasza szliczki hozzászólására (») Jan 5, 2010 /
 
AVRben nincs USB host. Azaz a joystick nem megoldható.
(#) TavIR-AVR válasza edison14 hozzászólására (») Jan 5, 2010 /
 
Egyszerre a villanyt, prg nyelvet és a chip felépítést megtanulni nem semmi....

Lépésenként, apránként ess neki.


Én kezdőknek a Bascom ill Arduino szoktam javasolni....
Ez a HE belső szerkezetét elrejti, nem kell _ezt is_ egyszerre tanulni!
(#) TavIR-AVR válasza janyjozsef hozzászólására (») Jan 5, 2010 /
 
Kb 16 MHz / 10-16 órajel. Ekkor a főprogram NEM fut, csak az INT....

Gyakorlatilag ha nem mentesz regisztert, semmit, és pl. számlálásra kell, akkor a belső órajel max 40%-t lehet megfogni.... De ekkor _nincs_ belső utasításvégrehajtás.
(#) janyjozsef válasza szliczki hozzászólására (») Jan 5, 2010 /
 
Szia. Ahhoz USB master kellene, hogy legyél.
Device program van ATMEGA-ra és USB IC is sok van.

Itt azonban neked kell HOST-nak lenned.
Ennek nézz utána: ISP1160 (2xUSB1.1 ha jól emlékezem)
Ez van a Lom.x-nél
Ha jól emlékszem a szegedi cégnél van 1xUSB2 HOST.
A keresőjükben keress arra hogy USB.
(#) edison14 hozzászólása Jan 8, 2010 /
 
Az egyik haverom nemrég kezdett el AVR-ekkel foglalkozni. Nagyon javasolta nekem a mikroC for AVR és mikroC for PIC programokat mivel ugyan az a kezelőfelülete mind a kettőnek így ha megtanulok AVR-t programozni és bele akarok tekinteni a PIC-ekbe akkor sokkal könnyebb lesz mert csak pár parancs és a program megírásában különbözik egy kicsit a két proceszor, ha megtanulom a PIC-ek és AVR-ek felépítését amelyben nagyon sokat segít az adatlapjuk akkor már nem lesz gond megírni mind a kettőre a programot. Ahogy mondtátok el is olvastam topi nyolc lábbal című cikkeit és elolvastam a nulláról a robotokig cikksorozatot valamint a tavir oldalon a bascom könyvet is elolvastam. Átnyálaztam az ATmega8 és a PIC16F628A adatlapjait és már kezdem érteni hogy a programban mit, miért és hogyan kell megírni. Én tegnap lehúztam mindkét programot és nagyon megtetszett, hogy ugyan az a kezelőfelülete mind a két programnak így ha egyik processzorról át akarok menni a másikra akkor nem kell megtanulnom egy új program használatát és kezelését sőt mint monda a haver tényleg csak nagyon kicsi eltérések vannak a két processzor programozása között pl az ő szavaival élve: "a portok irányát pl TRISA helyett DDRA-val állítom, timert máshogy állítom be stb." hát ezt mondta és van benne valami igazság. ITT találhatók a programok amikről beszéltem ráadásul még sok egyéb programozási nyelvet is találunk pl. mikroPascal, mikroBasik és mikroC és ez mind támogatja mindkét processzorfajtánkat.
Lehet hogy én is megpróbálkozok vele. A barátom 5 hónap alatt írt egy programot egy időzítőre. Csatolom a kapcsolási rajzot és a HEX-et.
(#) Topi hozzászólása Jan 8, 2010 /
 
INLINE EEPROM probléma:

Valakinek van frappáns megoldása arra a problémára, miszerint hiába csinálok külön függvényt, aminek csak pointert adok, az EEPROM írás - olvasás, mindig valamiért INLINE lesz.
Van egy kis procim, benne ~ 10-15 beállítási lehetőség, és a 2K-ból kb. 1,5K az EEPROM olvasások.

Irreális a dolog. Hiába teszem ki külső függvénybe, és a beállításra csak címével hivatkozom. Írtam egy függvényt, abban ASM-ben megírtam az EEPROM írás részletét, és hiába sima fgv. a GCC mindig inline linkeli be. És tele van EEPROM írás olvasással az lss.
Ha írok egy pl. alma(eeprom cím) függvényt, amiben meghívom akár a gyári eeprom.h-ból az olvasást, hiába nem inline az alma() fgv mégis inline lesz.

Ötlet? Valami tapasztalat?
(#) Ballage válasza Topi hozzászólására (») Jan 8, 2010 /
 
Szia Topi!

Akkor is ezt csinálja, ha megadod a fordítónak a "-fno-inline" kapcsolót?

Üdv,
Ballage
(#) Topi válasza Ballage hozzászólására (») Jan 8, 2010 /
 
Hát a kód az összeesik, de sajnos van olyan rutin aminél fontos hogy inline legyen. Saját fgv, külön jelölve hogy inline. Így most az sem inline.
(#) Ballage válasza Topi hozzászólására (») Jan 8, 2010 /
 
Azt esetleg beteheted egy #define makróként és akkor tutira "inline" lesz.
(#) janyjozsef válasza Topi hozzászólására (») Jan 8, 2010 /
 
Szia.

Én Wait-el jártam így.
A probléma az volt, hogy -Os opciónál a rövid kódot inline befordította.
Vagy más fordítási opciót kellene használni.
Vagy ahogy én is csináltam.
A Wait és Delay-t kitettem egy .c file-ba és azt a filet -O1-el fordítom, a többi marad -Os.
A kódom kapásból 1.2K-val lett kisebb.
(#) gtk válasza janyjozsef hozzászólására (») Jan 9, 2010 /
 
De az a bizonyos Wait inline-nak van deklaralva, nem?
(#) janyjozsef válasza gtk hozzászólására (») Jan 9, 2010 /
 
Nem inline!

Hiszen várakozás. Miért legyen gyors?

A -Os opció sebességre optimalizál. És szerinte a rövid kódrészleteket nem érdemes hívni, hanem egyszerűen beszúrja.

Nálam annyira optimalizált, hogy a Delay fg-be egy NOP-ot kellett raknom először, mert a for ciklust különben kioptimalizálta és nem volt delay-em.
Ezután tettem át őket másik .c file-ba és annak az optimalizációja -O1 -lett (a többi maradt -Os). Így a kódban hívogatja ezeket a fg-ket és rendesen le is futnak.
Következő: »»   175 / 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