menu pro maticovou klavesnici pomoci atmega

Zdravim prave se chystam delat menu pro ovladani programu v procesoru pomoci maticove klavesnice 4x4. Pomoci klavesnice se budou zadavat hodnoty a vybyrat rezimy. Ale nikdy sem timto nezabival tak presne netusim jak na to poradi mi nekdo? Tusim ze se to bude delat vetvenim IF…ELSE popripade SWITCH…CASE ale uplnou jistotu v tom nemam. (Ovladat maticovou klavesnici umim) Poradi nekdo jak presne se dela slozitejsi menu ? Napr podobne strukture v prilozenem souboru.

Dalo by se to resit podobne?

[code]
char text];
DDRE=0x0F;
PORTE=0x0F;
while(1)
{
//prvni sloupec
PORTE =0b00001110;

//1
if (bit_is_clear(PINE, 4)) {
text]=“Uroven 1”;
PORTE =0b00001101;
if (bit_is_clear(PINE, 4)) {
text]=“Poduroven 1”;
};
PORTE =0b00001011;
if (bit_is_clear(PINE, 4)) {
text]=“Poduroven 2”;
};
PORTE =0b00001110;
if (bit_is_clear(PINE, 4)) {
text]=“Poduroven 3”;
};
};
//4
if (bit_is_clear(PINE, 5)) {};
//7
if (bit_is_clear(PINE, 6)) {};
//*
if (bit_is_clear(PINE, 7)) {};

            //druhy sloupec

            PORTE =0b00001101;

//2
if (bit_is_clear(PINE, 4)) {};
//5
if (bit_is_clear(PINE, 5)) {};
//8
if (bit_is_clear(PINE, 6)) {};
//0
if (bit_is_clear(PINE, 7)) {};

            //treti sloupec

            PORTE =0b00001011;

//3
if (bit_is_clear(PINE, 4)) {};
//6
if (bit_is_clear(PINE, 5)) {};
//9
if (bit_is_clear(PINE, 6)) {};
//#
if (bit_is_clear(PINE, 7)) {};

            //ctvrty sloupec

            PORTE =0b00000111;

//ESC
if (bit_is_clear(PINE, 4)) {};
//F1
if (bit_is_clear(PINE, 5)) {};
//F2
if (bit_is_clear(PINE, 6)) {};
//ENTER
if (bit_is_clear(PINE, 7)) {};

}[/code]

dal me napadla jeste moznost rolovat menu po displeyi pomoci 2 klaves

#define Arow_up  //2 sloupec 1 radek melo by se nejak definovat ale netusim jak :(
#define Arow_down //2 sloupec  3 radek

int uroven=0;
int key;

switch (key)
{
case Arow_down: uroven+1;break;
case Arov_up: uroven-1;break;
}
IF (uroven==1){fce1();} //samozrejme s oznamenim na LCD prislusnym textem
IF (uroven==2){fce2();}
IF (uroven==3){fce3();}
IF (uroven==4){fce4();}
IF (uroven==5){fce5();}
IF (uroven==6){fce6();}

dalo by se toto pouzit?

A jeste bych se zaroven optal pokud pouzivam 2 serva a potrebuji pomoci maticove klavesnice nastavit trasu (zadat vice hodnot natoceni do pole a potom nasledne cteni) nikdy jsem s tim nedelal tak bych potreboval poradit dik moc
LCD.zip (49 KB)
LCD_MATRIX.zip (52.4 KB)


struktura menu.doc (25 KB)
struktura menu.pdf (12.2 KB)

UZ sem zkusil opravdu vsecko ale stejne mi porad LCD nechce jit Poradi nekdo?

mam knihovny pro obsluhu z
[1]braiden.org/cgi-bin/viewvc.cgi/braiden/trunk/projects/avr/lcd/

a take sem zkousel

[2]kvetakov.net/clanky/avr/58-lcd-modul-od-pk-design.html

add.1.: hd44780.c a hd44780.h
add.2.: lcd_lib.c a lcd_lib.h

Edit: Tak uz se mi to podarilo :slight_smile: ted by me zajimalo jak udelat ukladani 3 ruznych prom do pole od 10 radcich a 3 sloupcich

tabulku udelam pomoci

int tabulka[10][3];

problem nastane kdyz chci do kazdeho radku davat promenne OCR1A,OCR1B a delay_konst

zadavane pomoci maticove klavesnice a to tak ze OCR1A mam pomoci 6 klaves(+/-1,+/-10,+/-100) stejne tak OCR1B
delay_kons mam poze 2 tlacitka (+/-1)

poradne netusim jak je tam ukladat kdyz to udelam pres

for(i=0;i>9;i++) 
  tabulka [0]*=....;

kterym menim index pole tak muzu davat jen jednu prom.

stejne tak u cteni

poradi nekdo jak na to?
ulozeni mam v umyslu klavesou ENTER*

mensi chybka :slight_smile:
pises, ze druhy rozmer pole (sloupce) je 3 a cyklem se znazis (teda nesnazis - to je dalsi chyba) o vetsi cislo - index out of range :wink:
druha chyba je, ze cyklus se opakuje, dokud je splnena podminka (za 1. strednikem) a to ve tvem pripade nebude nikdy :wink:

for(i=0;i<10;i++) //prochazi radky pole for(j=0;j<3;j++) //prochazi sloupce pole tabulka *[j]=....; } }

Jeste jedna vec - pouzivas int… Jesli dobre vidim, vsechny hodnoty se vejdou do 8b - co trochu setrit pameti a pouzit “char” :wink:
LibC manual: “int is 16 bits”
Zbytecnym vyuzivanim vetsich promennych se pripravujes o pamet (to zde sice asi problem nebude, ale jednou…) a zpomalujes program :wink:
To same plati o znamenkovych/neznamenkovych(unsigned) promennych.*

S tym int nemusi byt az taky problem.
Char sa spracuje rychlejsie ako int, to je pravda, ale ten cas pre spracovanie menu je zanedbatelny. Ved uz len kolko musi procesor cakat, kym obsluha stlaci tlacitko.
Co sa pamati tyka, ATmega nie su PIC16 :slight_smile:.
Podla toho, ze endthe pouziva port E, pamate bude mat urcite hafo.
Okrem toho endthe pise o siestich tlacitkach, zvlast na nastavenie +/-jednotiek, +/-desiatok a +/-stoviek, tak asi naozaj chce nastavovat integer (aj ked mozno skor celociselny word vzhladom na oznacenie OCR1).
Co ma ale viac prekvapilo, preco nastavuje OCR1A, co je kompare register.
Mozno nastavuje periodu generatora.

Cele je to nejako naopak.
Preco chce endthe do pola zadavat hodnoty OCR1 a delay_kons?
Nemal by si prave na zaklade vyberu z menu prednastavit hodnoty OCR1 a dealy_konst z hodnot v poli aby podla nich procesor nieco robil?
Jedna vec je vyber parametra z menu, ina vec je jeho editacia.
Ak mam v menu na vyber 10 moznosti, sipkami sa nastavim na jednu z nich (vhodne nastavene hodnoty pre OCR1 a delay_kons, podla ktorych bude program robit to co chcem) a stlacenim napr. SET sa vybrana sada hodnot vlozi do tychto premennych.
Ak chcem nejaku hodnotu editovat (nie je ich 10 ale 20 - 1x integer [OCR1], 1x byte), potom sa sipkami nastavim na tuto hodnotu a stlacenim klavesy napr. EDIT sa cislo rozblika (aby som videl, ze som v editacnom mode) a vybranymi klavesami nastavim (editujem) pozadovanu hodnotu. Ak je hodnota nastavena, potom stlacenim nar. ENTER sa hodnota zapise do pola. Je myslim evidentne, ze pri editacii needitujem obe cisla naraz, ale po jednom (zvlast 16b cislo a zvlast 8 bitove cislo), preto je tych editovatelnych hodnot 20 a nie iba 10. Okrem toho, pri editacii hodnoty by sa nemala menit priamo hodnota v poli, ale nejaka pomocna premenna, lebo este mozes chciet stlacit ESC a povodnu hodnotu chces nemenit. Okrem toho, ak nejaka ina cast programu pravidelne vybera hodnoty z pola a prednastavuje ich, nebolo by vhodne, aby sa aktualizovala prave editovana hodnota. Preto doporucujem editovat pomocnu premennu a az po nastaveni jej hodnoty stlacenim ENTERu jej hodnotu zapisat do pola.
A nezabudni na to, ze editovat 10 prednastaveni vzdy po restarte procesora by bola asi pekna otrava a preto by tie cisla po editacii mali byt zapisane do EEPROM, odkial sa po restarte vyberu a skopiruju do RAM.

jj presne tak nastavuju preriody pro generovani PWM
v mezich 1000-2000 coz je 1ms-2ms
pro servomotory

a ta casova konstanta je tam jen ze po najeti na polohu se ma tu danou dobu pockat a jet dal.
jinak pozadavek je po kazde zadavat 10 hodnot pro kazde servo a 10 delay_konst
jde o trasovani plosiny ovladane pomoci 2 serv HS422
proste trosku nedomyslene to uznavam ale ja to nevymyslel

ukazto.com/img_small/4124145~Senzoric_tower1.jpg ukazto.com/img_small/4124144~Senzoric_tower.jpg