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   423 / 840
(#) sikolymester válasza vzoole hozzászólására (») Márc 10, 2012 / 1
 
Szerintem ez érdekes lehet számodra: AVR182: Zero Cross Detector
(#) Reggie válasza vzoole hozzászólására (») Márc 10, 2012 / 1
 
Nagyon egyszeru: A sikolymester altal linkelt ZCD-t ugy alakitod at, hogy az egyik timer input capture labara rakotod es nem egy megszakitas bemenetre. Igy megmered a periodus idot es a kapot ertekbol kiszamolod a PWM-hez szukseges maximum erteket. Az input capture esemenyhez kapcsolodo megszakitas segitsegevel inditod a PWM-es timert, vagy nullazod a timer szamlalojat. Termeszetesen ezt nem eleg egyszer csinalni, hanem minden egyes periodus alkalmaval vegre kell hajtani, igy szinkronban marad a rendszered.
(#) szdani válasza Brian88 hozzászólására (») Márc 10, 2012 /
 
beállítottam de semmi, arra gondoltam hogy mi lenne ha kiszedném az ellenállásokat? Egyébként próbáltam hogy rakok 10K ellenállást a reset lábra, úgy fehér csíkok futnak a képernyőn.
(#) HDD hozzászólása Márc 10, 2012 /
 
Sziasztok
Buta kérdés, de azért segítsetek, kérlek.
Nem ismeri fel az AVR Dopert a feladat kezelőben látom Com8 osztotta ki neki.
De az AVR Stúdió 4. nem akarja látni.
Mindig ugyan oda ugrik vissza.
Hol hibáztam?
(#) zombee válasza HDD hozzászólására (») Márc 10, 2012 /
 
Látom Win7-ed van, ott előfordul. Próbáltad már EZT?
(#) (Felhasználó 56240) hozzászólása Márc 10, 2012 /
 
Sziasztok
Szeretnék kérni egy kis segítséget
Építtettem egy Szilva AVR910 programozott
Fel is programoztam már vele Atmega16-ost
Szóval működőt is
De ma az istenért sem akar működni
Segítséget köszönöm

-------------------------------------------

Checking programmer type ...
Found AVR ISP
Entering programming mode...
Entering programming mode failed!
Programmer did not return CR after 'T'-command.
Entering programming mode failed!
Programmer did not return CR after 'P'-command.
Signature = 0x0D 0x0D 0x3F
Leaving programming mode...
Leaving programming mode failed!
Programmer did not return CR after 'L'-command.

--------------------------------------------------------------

AVR910.jpg
    
(#) HDD válasza zombee hozzászólására (») Márc 10, 2012 /
 
Szia
Köszönöm a gyors választ
Jelzem, ha jó lett
(#) zombee válasza (Felhasználó 56240) hozzászólására (») Márc 10, 2012 /
 
Az avr910 tudtommal csak com1-com4-ig működhet AVR Studio-ban. Én JTAG ICE feltöltésekor találkozom
ugyanezzel a problémával mivel a bootloader is avr910-es...
(#) (Felhasználó 56240) válasza zombee hozzászólására (») Márc 10, 2012 /
 
Szia
com4 van, de próbáltam másik portón is
De a többi információval én még nem tudok mit kezdeni
Nem tudom meg próbáltam másik gépen is de ugyan az
(#) Suncorgo hozzászólása Márc 12, 2012 /
 
(#) zombee válasza Suncorgo hozzászólására (») Márc 12, 2012 /
 
Nekem a napokban jutott eszembe hogy az osztót nem kell bitenként kiolvasni, azaz teszem fel van egy
8 bites számlálóm akkor fölösleges a 8 kimenetet az AVR-re kötni, mikor egyet sem kell!

Elég ha az osztó bemenetét felül tudod bírálni az AVR-el! Ha már használod az ICP lábat akkor azzal.
A mérés/számlálás befejezte után csak léptetni kell az osztó bemenetét a következő fel/lefutó élig!
Ezzel a módszerrel nem csak az alsó biteket kapod meg, hanem az osztót is lenullázod!
Ráadásul használhatsz egyszerű nagyfrekis osztókat is, például MC12022 IC-t - 1.1GHz, programozható.
(#) Zsolt36 hozzászólása Márc 12, 2012 /
 
Sziasztok!
Megcsináltam életem első AVR programját. Az ötletet és szinte az egész programot Topi-tól szedtem a "8 lábbal AVR" kapcsolás közlekedési lámpájából. Egy kicsit módosítottam és átírtam az a portra mindent mert ezt atmega 644p-vel szeretném megoldani a sok láb és megbízhatóság miatt. Itt a program és az lenne a kérdésem hogy ez működik e? Majd bővítem a többi portra is ha kész lesz azt is felteszem.,

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #define EGYES_ON()    PORTA |=  (1<<PA0)
  4. #define EGYES_OFF()    PORTA &= ~(1<<PA0)
  5. #define KETTES_ON()    PORTA |=  (1<<PA1)
  6. #define KETTES_OFF()    PORTA &= ~(1<<PA1)
  7. #define HARMAS_ON()    PORTA |=  (1<<PA2)
  8. #define HARMAS_OFF()    PORTA &= ~(1<<PA2)
  9. #define NEGYES_ON()    PORTA |=  (1<<PA3)
  10. #define NEGYES_OFF()    PORTA &= ~(1<<PA3)
  11. #define OTOS_ON()    PORTA |=  (1<<PA4)
  12. #define OTOS_OFF()    PORTA &= ~(1<<PA4)
  13. #define HATOS_ON()    PORTA |=  (1<<PA5)
  14. #define HATOS_OFF()    PORTA &= ~(1<<PA5)
  15. #define HETES_ON()    PORTA |=  (1<<PA6)
  16. #define HETES_OFF()    PORTA &= ~(1<<PA6)
  17. #define NYOLCAS_ON()    PORTA |=  (1<<PA7)
  18. #define NYOLCAS_OFF()    PORTA &= ~(1<<PA7)
  19. void m_delay_10ms(unsigned long val) {
  20.    while(val--) _delay_ms(10);
  21. }
  22. int main(void) {
  23. uint8_t state;
  24.    DDRA = (1<<PINA0)|(1<<PINA1)|(1<<PINA2)|(1<<PINA3)|(1<<PINA4)|(1<<PINA5)|(1<<PINA6)|(1<<PINA7);
  25.    state = 0;
  26.    while(1) {
  27.    switch(state) {
  28.    case 0: EGYES_OFF();
  29.    KETTES_OFF();
  30.    HARMAS_OFF();
  31.    NEGYES_OFF();
  32.    OTOS_OFF();
  33.    HATOS_OFF();
  34.    HETES_OFF();
  35.    NYOLCAS_OFF();
  36.    EGYES_ON();
  37.    m_delay_10ms(100);
  38.    state++;
  39.    break;
  40.    case 1: KETTES_ON();
  41.    m_delay_10ms(100);
  42.    state++;
  43.    break;
  44.    case 2: HARMAS_ON();
  45.    m_delay_10ms(100);
  46.    state++;
  47.    break;
  48.    case 3: NEGYES_ON();
  49.    m_delay_10ms(100);
  50.    state++;
  51.    break;
  52.    case 4: OTOS_ON();
  53.    m_delay_10ms(100);
  54.    state++;
  55.    break;
  56.    case 5: HATOS_ON();
  57.    m_delay_10ms(100);
  58.    state++;
  59.    break;
  60.    case 6: HETES_ON();
  61.    m_delay_10ms(100);
  62.    state++;
  63.    break;
  64.    case 7: NYOLCAS_ON();
  65.    m_delay_10ms(100);
  66.    state++;
  67.    break;
  68.    default: state = 0;
  69.    }
  70.    }
  71.    return 0;
  72. }


Ui.: Ebből okos ledes villogó lenne amire sok led köthető, és minden kimeneten tranyó lenne.
(#) sikolymester válasza Zsolt36 hozzászólására (») Márc 12, 2012 /
 
Szerintem a válasz arra, hogy működik-e a legkönnyebben a szimulátorból szerezhető meg.

Futtasd le szimulátorban, és vagy léptetgessed, vagy tegyél a fontos helyekre breakpointokat.
(#) Zsolt36 válasza sikolymester hozzászólására (») Márc 12, 2012 /
 
WinAVR-el csináltam. Vagy azzal is lehet?
(#) sikolymester válasza Zsolt36 hozzászólására (») Márc 12, 2012 /
 
Töltsd le a Studio 4 -et és etesd meg a generált .elf filet vele, állítsd be a megfelelő AVR típust. Két szimulátor van, a Simulator és a Simulator 2. Ha az AVR típusod megleled a Simulator 2-ben, akkor azt használd.
(#) Tomi_Bp hozzászólása Márc 12, 2012 /
 
Sziasztok!
Szeretnék eepromban tárolni egy 16 bites változót. Hogy csináljam? Ennyit tudok:
  1. unsigned char hi_byte;
  2. unsigned char lo_byte;
  3. unsigned int addr_hi = 23;
  4. unsigned int addr_lo = 24;
  5. int x = 65000;
  6. int y;
  7.  
  8. x ???? hi_byte ???? lo_byte//ebben kellene a segítség
  9.  
  10. //eeprom irasa
  11.  
  12. eeprom_busy_wait();
  13. eeprom_write_byte((uint8_t*)addr_hi, hi_byte);
  14. eeprom_busy_wait();
  15. eeprom_write_byte((uint8_t*)addr_hi, lo_byte);
  16.  
  17. ...
  18.  
  19. //eeprom olvasasa
  20.  
  21. hi_byte = eeprom_read_byte((uint8_t*)addr_hi);
  22. lo_byte = eeprom_read_byte((uint8_t*)addr_lo);
  23. y = ( hi_byte << 8 ) | lo_byte;
meg a nevemet
Előre is köszi a segítséget!
(#) sikolymester válasza Tomi_Bp hozzászólására (») Márc 12, 2012 /
 
Hát a válasz az ott van az utolsó kódsorodban, csak éppen fordítva kell most.

  1. hi_byte = (uint8_t)(x >> 8);
  2. lo_byte = (uint8_t)x;


A zárójeles (uint8_t) un. typecastolás, nem feltétlen van rá szükség itt és most, de így elegáns a dolog.
Javaslom nézd át a kedvenc C könyvedben a bitenkénti műveleteket.

Ha meg nem ez volt a kérdés, akkor elnézést, de másra nem tudtam tippelni.

Apropó, lehet ám az eepromba 16 bites változókat is írni ám. Nézz itt körül.
(#) sgt válasza Tomi_Bp hozzászólására (») Márc 12, 2012 /
 
Végtelenül egyszerű! Bővebben: Link (program kód második sora) . Természetesen ugyanez igaz a write módra is.
(#) atideath hozzászólása Márc 12, 2012 /
 
Most ahogy fordítottam a programom ezt írta ki a fordító:
  1. AVR Memory Usage
  2. ----------------
  3. Device: atmega128
  4. Program:    7674 bytes (5.9% Full)
  5. (.text + .data + .bootloader)
  6. Data:       7542 bytes (184.1% Full)
  7. (.data + .bss + .noinit)


Ez nagy galibát jelent? Ettől függetlenül tökéletesen működik a program.
(#) sikolymester válasza atideath hozzászólására (») Márc 12, 2012 /
 
Nagy hibát jelent.
Az, hogy tökéletesen működik, nos az röviden szólva persze lehetséges.

Van fix méretű memória, amiben a stack és a változók vannak. Tegyük fel, hogy 4K a memóriád, deklarálsz 4Kbyte-nyi volatile tömböt, ami teljesen kitölti a memóriát. Ezek után ebbe szépen bele fog mászni a stack a függvény hívásoknál.

Ha te persze nem piszkálgatod azt a tömböt, akkor minden működik a maga módján, tökéletesen.

Itt egy kis olvasmány: Bővebben: Link
(#) atideath válasza sikolymester hozzászólására (») Márc 12, 2012 /
 
Kérdés az hogy mi foglalja ennyire a DATA memory-t? És hogyan tudnám csökkenteni?
(#) Reggie válasza atideath hozzászólására (») Márc 13, 2012 /
 
  1. avr-readelf -W -s <elf fajl> > <text fajl>


Ha megnyitod a text fajlt, akkor azok a sorok kellenek neked, amelyekben a tipus(Type oszlopban van) OBJECT es a cim(Value oszlopban van) 008xxxxx. Ezek a valtozok vannak fixen a ram-ban. A meretuket a Size oszlopban latod.
(#) atideath válasza Reggie hozzászólására (») Márc 13, 2012 /
 
Köszönöm! Meg is találtam a hibát.

Byte lcd_buffer[101][64]...... És nem is használtam .

Mivel grafikus LCD-t használok, és elég sok a tömböm amiben képeket tárolok, és ha mindre szükségem van akkor hogyan tudom az ebből adódó Memory-t átcsoportosítani vagy optimalizálni?

Pl:
  1. static const unsigned char PROGMEM Fokepernyo[] = {   //63 Zeilen a 8 Byte a 8 Pixel = 4032
  2.    1,                                             // Bit pro Pixel
  3.   64,                                             // Hoehe
  4.   101,  
  5. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  6. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ...........
(#) sikolymester válasza atideath hozzászólására (») Márc 13, 2012 /
 
Ahogyan az idézett kódodban is van, használd a PROGMEM direktívát. Így nem az SRAMban tárolódik az adat, hanem a FLASH-ben. Részleteket itt találsz: Data in Program Space
(#) Tomi_Bp válasza sikolymester hozzászólására (») Márc 14, 2012 /
 
Igen, erre gondoltam, így értettem, köszönöm!
Volna mégegy kérdésem. Azt tapasztaltam, hogy programozáskor törlődik az EEPROM tartalma és azt mondta egy ismerősöm, hogy erre van egy fuse bit. Melyik? Illetve melyikkel tudom kiolvashatatlanná tenni a Flash-t? (Mikor elkezdtem AVR-rel foglalkozni annyi "félelmetes" dolgot hallottam a fuse bitekkel kapcsolatban, hogy nem merek kisérletezni vele...) Köszi!
(#) zolee1209 válasza Tomi_Bp hozzászólására (») Márc 14, 2012 /
 
EESAVE-t pipáld ki.
(#) sikolymester válasza Tomi_Bp hozzászólására (») Márc 14, 2012 /
 
Attól függően, hogy mivel programozol, pl a Jtage Ice ( 1,2,3) illetve Dragon esetén, ha Jtag interface-t használsz, akkor külön lehet ott is állítani az opcióban, hogy törölje az eepromot a felprogramozásnál. Amúgy erre elvileg csakugyan van egy fuse bit. Valahol a debbug settingsben kell keresni.

Amúgy állítom, hogy a fuse biteket nem lehet elszúrni a Studio 4,5,6 -ból. Pony Prog és társai kicsit kuszábban tálalják a dolgokat. Ha mégis pony progban utazol, akkor nézd meg ez az oldalt előtte: fuse calc
(#) atideath hozzászólása Márc 14, 2012 /
 
Az AVR-rel szeretnék mérni frekvenciát. Motorom Sebességét és fordulatát. Két adatot tudok róla:

Fordulat:33.33 Hz / 1000u/min
Sebesség:1120 Hz / 100 km/h


Ezt is a neten találtam. Atmega128-al próbálom megvalósítani, de felső tartományban nagyjából 10kHz körül még elfogadható eredményeket ad vissza, alsó tartományban rémeseket. (1s időalap alatt beérkezett jelek számát nézem, AVRGCC) Valami megoldás kellene rá hogy gyors is legyen, értem itt hogy pl 1s körül le kellene mérnie mind a két frekvenciát viszonylag pontosan hogy tudjak áttételt számolni belőle (Fokozatkijelzés). Valami más ötlet?
(#) Ricsi89 válasza atideath hozzászólására (») Márc 14, 2012 /
 
Fordítsd meg a dolgot. A két beérkezett jel között eltelt időt mérd! Így pontosabban meg tudod határozni a frekvenciát.
(#) atideath válasza Ricsi89 hozzászólására (») Márc 14, 2012 /
 
Erre kaphatnék egy példát vagy valami leírást? Mekkora tartományban képes így mérni?
Következő: »»   423 / 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