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
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   743 / 743
(#) killbill válasza csabeszq hozzászólására (») Csü, 13:27 /
 
Csak olyat tudok, ami a mikrokontrollerben van. Pl. az NXP LPC1788 mikrokontroller LCD vezerloje olyan, hogy max. 24 bites TFT-t lehet rakotni, es azt tudja 24, 16, 8, 4, 2 es talan 1 bpp modban hasznalni. 8, 4, 2, 1 eseten van paletta. En 320x240 LCD-hez hasznalom 8 bpp modban. Kb 10-15 szint hasznalok. Par milliszekundum egy teljes kep valtas. Igaz, 100MHz Cortex-M3 processzor.
(#) csabeszq hozzászólása Csü, 23:30 /
 
Ha már a grafikus LCD-nél vagyunk:

https://www.pjrc.com/tech/8051/board5/lcd_128x64.html

Innen lehet letölteni több mega LCD fontot (lcd_fonts_01.tar.gz, lcd_fonts_02.tar.gz).

Ezek a fontok BDF formátumban vannak, néhány C fájlt le is generáltak belőlük, természetesen magyar ékezetek nélkül. Akinek magyar ékezetek is kellenek, annak saját gerenáló kódot kell készíteni. A BDF formátum nem túl bonyolult. Csak egy szövegfájl.

Nálam Linux alatt automatikusan megjelenik BDF-nél az Árvíztűrő Tükörfúrógép.
(#) wbt hozzászólása Pé, 9:08 /
 
Ha már 8051-es oldal, ADuC812-ben van ADC meg DMA, ami 1 utasításra behúzza az ADC adatokat a RAMba (200kHz/12bit), onnan "csak" ki kell vinned a grafikus LCDre. Van a családban ARM magos cucc is. Viszont az érdekelne, hogy tudtok-e olyan AVR-t vagy kisebb ARM-et, ami tud kezelni 4-bites mono LCD-t. Tehát 4-bitenként fogadja a pixeladatokat az X-shiftreg, ha kész, akkor az Y-shiftregiszter lép egyet. Eddig SED1330-al volt hajtva, de amellé kell külső RAM. (van 512x64-es LCD-m pár kiló, valamire csak használni kellene...)
(#) Kovidivi hozzászólása Pé, 10:39 / 1
 
Sziasztok!
Szeretnék megosztani egy kódot, ami úgy gondolom, elég hasznos.
Gombkezelést valósít meg, három gombot figyel egyszerre. 10mS-ként fut le, és három db. 8bites változóba monitorozza a gombok állapotát. Ha a minta úgy néz ki, hogy minimum 40mS-ig le volt nyomva a gomb, majd 30mS-ig fel van engedve, csak akkor értelmezi a függvény valós gombnyomásnak. Ezután beállít egy változót, hogy gombnyomás történt, amit majd egy másik függvénynek kell lekezelnie, feldolgoznia, majd ha megtörtént, akkor annak le is kell nulláznia. Így ha csúszik is kicsit a végrehajtás, amint utoléri magát a proci, azonnal végrehajtja amit kell. Ez amolyan buffer funkció. Szoftveres prellmentesítés is történik, azzal sem kell foglalkozni.
Használata: egyszerűen be kell rakni a main loopba, és ügyelni kell rá, hogy a main pörögjön folyamatosan, ne álljon meg sehol. Ez könnyen megoldható, ha minden függvény ugyanilyen előző és period változókkal ellenőrzi, hogy le kell-e futnia. Én pl. DS18b20-nál is külön választom a két állapotot, az elsőnél lekérdezem a hőmérsékletet, majd 1mp-ig nem piszkálom, fut a főprogram. 1mp után pedig csak lekérdezem a hőmérsékletet.
Ezt a függvényt be lehet rakni interruptba is, ha valakinek úgy jobban tetszik, nálam az interruptnak elsődleges funkciója van, nem késhet, viszont ha a gombnyomást 1-3mS-ma később ellenőrzöm, nem történik semmi.

Változók:
  1. unsigned char gomb_temp=0,gomb[3];
  2. unsigned char gomb_szamlalo[3]// bitenként tárolom le,hogy le van-e nyomva, vagy sincs.
  3. unsigned long gomb_elozo=0;
  4. unsigned char gomb_period=10;      //mS


  1. void gombellenorzes()
  2. {
  3. if ((gomb_elozo+gomb_period)<millis)
  4.         {
  5.                 gomb_elozo=millis;
  6.                 unsigned char gomb_temp=0;
  7.                 gomb_temp=(~PIND)&(0b01110000)// a PORTD 4,5,6-os lábán vannak a gombok, felhúzóellenállás bekapcsolva.
  8.                 for (int i=0; i<3; i++)
  9.                 {
  10.                         //eltolom a változót eggyel balra.
  11.                         gomb_szamlalo[i]=gomb_szamlalo[i]<<1;
  12.                         if ((gomb_temp>>4)&(1<<i)) gomb_szamlalo[i]|=1// ha le volt nyomva, akkor egyet hozzáírok.
  13.                         // most jöhet az ellenőrzés:
  14.                         // ha a bitminta ilyen: 11111000, akkor volt lenyomva a gomb. ha közben prelleg, vagy bármi, akkor nem érdekel.
  15.                         if ((gomb_szamlalo[i]&0b01111111)==0b01111000)
  16.                         {
  17.                                 //találtam egy gomblenyomást felengedéssel
  18.                                 gomb[i]=1;      // majd a függvényben le lesz nullázva!
  19.                         }
  20.                 }
  21.         }
  22. }
A hozzászólás módosítva: Pé, 10:44
(#) Sick-Bastard hozzászólása Pé, 18:16 /
 
Üdv!

Globális változóimat szeretném egy tömbbe helyezni. Ezt eddig úgy próbáltam kivitelezni, hogy létrehoztam egy tömböt, majd definiáltam a tömb adott byte-jához egy nevet, valahogy így:

  1. volatile unsigned char g_reg_a[256] = {};
  2. #define global_register_0        g_reg_a[0]
  3. #define global_register_1        g_reg_a[1]
  4. #define global_debug          g_reg_a[2]


Azonban úgy tudom, hogy nagyobb változók(int, long) hozzáadása már problémás.
Ekkor találtam meg az union-t. Böngészgetéssel ezt hoztam össze:

  1. typedef struct
  2. {
  3.         volatile unsigned char sec_pre;
  4.         volatile unsigned char min_pre;
  5.         volatile unsigned char sec;
  6.         volatile unsigned char min;
  7.         volatile unsigned char hour;
  8. }time;
  9.  
  10. typedef struct
  11. {
  12.         volatile unsigned char day;
  13.         volatile unsigned char date;
  14.         volatile unsigned char month[13];
  15.        
  16.         union
  17.         {
  18.                 volatile unsigned int year_int;
  19.                 volatile unsigned char year_byte[2];   
  20.         }year;
  21. }date;
  22.  
  23. union
  24. {
  25.         volatile unsigned char rtc_reg;
  26.         time t;
  27.         date d;
  28.         volatile unsigned char date_time[24];
  29. }date_time;


A gubanc nálam ott kezdődött, amikor megpróbáltam a date_time union-ját a g_reg_a[] tömbbe beilleszteni. Ez alatt azt értem, hogy egy meglévő union-t illesztenék egy másikba, valahogy így:

  1. union
  2. {
  3.         volatile unsigned char rtc_reg;
  4.         time t;
  5.         date d;
  6.         volatile unsigned char date_time[24];
  7. }date_time;
  8.  
  9. union
  10. {
  11.         date_time;
  12.         volatile unsigned char g_reg_a[256];
  13. }g_reg_a;


Ha union helyett typedef uniont használok, akkor a fordító elfogadja, de nem kerül bele a g_reg_a[] tömbbe.
Egyáltalán lehetséges amit szeretnék? (Meglévő létező union-t egy másikba rakni.)

Még egy felmerült kérdés.
Lehetséges union-ba 2D-s tömböt rakni?
Erre gondolok:

  1. union
  2. {
  3.         volatile unsigned char global_array_r0[16];
  4.         volatile unsigned char global_array[16][16];
  5. }global_2d_array;
(#) slimtomi válasza pont hozzászólására (») Pé, 19:45 /
 
Na srácok, leírom, mi történt.
Olyan nagyon segítőkészek vagytok, hogy tùlgerjedt a téma, mint egy végfok
Szóval!
Autóvillamosságéknál(!) nagyon sok szenzor +5V referenciafeszültséggel működik.
Egy AVR mikrokontroller akár milliszekundumonként is tud mintavételezni 1 darab analóg bemeneten 10 bites felbontásban 0V és +5V között. Ez nekem nagyon tökéletes!
Így támadt az ötlet egy igazából nem valósidejű tárólós DC szkóp megépítéséhez. És készen vagyunk.
Nem tudom kihasználni a 20 meg 60 MHz-es méréstartományokat, legfeljebb a gyújtásrendszer primer- és szekunderkör vizsgálatánál.

9V-os elemről fogom akkor hajtani az áramkört, köszi a tippet
Köszönök mégegyszer mindent, mint lelkes hobbista! Ezért jó ez a fórum!
Következő: »»   743 / 743
Bejelentkezés

Belépés

Hirdetés
Frissek
2016. Jún, 29. Sze
3:49:15
Jelenleg 51 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu