Stránka 2 z 2
Napsal: 25 dub 2013, 21:38
od ZdenekHQ
termixnator píše:ted bych chtel nejak udelat menu ze bych si sipkama vybral jednu z moznosti a po potvrzeni tlacitkem OK by se vykonala na prislusnem vystupu ale to bude asi dost orisek.
Oříšek to není, ale pak ten kód vypadá tak, že 90% kódu je navigace v menu a jen ten zbytek je samotný program jako takový.

Napsal: 28 dub 2013, 12:54
od termixnator
ja nasel tohle akorat nevim kam pridat nejakou funkci if

no skusim si stim zejtra pohrat snad neco vymyslim.
Kód: Vybrat vše
// AVR ATMEGA8 - INTERNAL 8MHz CLK
// Auhtor: Zaid Pirwani
// Developer at Ejaad
// email@zaidpirwani.com
// 21-02-2012
//
#include "template.h" // Code-Tamplate I use in my Projects
#include "lcd.h" // LCD HEADER FILE
#define MAX_OPTIONS 6
// MENU Options
char menu_opt[MAX_OPTIONS][16] = { "MENU OPTION 1",
"MENU OPTION 2",
"MENU OPTION 3",
"MENU OPTION 4",
"MENU OPTION 5",
"MENU OPTION 6",
};
unsigned char item = 0, item_old=0;
void disp_opt(unsigned char);
void chk_btns(void);
int main(void){
// LCD
lcd_init(LCD_DISP_ON);
lcd_clrscr();
// i/o Setup D.0-2 [PULLED UP]
//PREV NEXT SELECT BACK
IN(D,0); IN(D,1); IN(D,2); IN(D,3);
SET(D,0); SET(D,1); SET(D,2); SET(D,3);
// Initial LCD Text
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_opt[item][0]);
lcd_gotoxy(2,1);
lcd_puts(&menu_opt[item+1][0]);
while(1){
chk_btns(); // Poll Buttons
}
return(0);
}
// Display Options / Update LCD Display
void disp_opt(unsigned char item){
if(item>item_old){
lcd_clrscr();
lcd_gotoxy(2,0);
lcd_puts(&menu_opt[item-1][0]);
lcd_gotoxy(0,1);
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_opt[item][0]);
}
else if(item<item_old) {
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_opt[item][0]);
lcd_gotoxy(2,1);
lcd_puts(&menu_opt[item+1][0]);
}
}
// Check Buttons
void chk_btns(void){
// PRIMITIVE BUTTON POLLING
// Will detect the FIRST ACTIVE BUTTON
// One Active Signal on a single press
// Will Ignore Buttons which are checked LATER if any previously checked Button is ACTIVE
if(READ(D,0)==LOW){ // Prev Option
delay(BTBOUNCE);
while(READ(D,0)==LOW){};
item_old = item;
item -= item<1 ? 0 : 1;
disp_opt(item);
delay(BTBOUNCE);
}
if(READ(D,1)==LOW){ // Next Option
delay(BTBOUNCE);
while(READ(D,1)==LOW){};
item_old = item;
item += item>(MAX_OPTIONS-2) ? 0 : 1;
disp_opt(item);
delay(BTBOUNCE);
}
if(READ(D,2)==LOW){ // SELECT Button
delay(BTBOUNCE);
while(READ(D,2)==LOW){};
lcd_clrscr();
lcd_puts("Selected Opt: ");
lcd_putc(item+48+1); //Comvert ITEM into CHAR Number+1
lcd_gotoxy(0,1);
lcd_puts(&menu_opt[item][0]);
delay(BTBOUNCE);
}
if(READ(D,3)==LOW){ // BACK Button
delay(BTBOUNCE);
while(READ(D,3)==LOW){};
if(item<(MAX_OPTIONS-1)){
lcd_clrscr();
lcd_gotoxy(0,0);
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_opt[item][0]);
lcd_gotoxy(2,1);
lcd_puts(&menu_opt[item+1][0]);
}else{
lcd_clrscr();
lcd_gotoxy(2,0);
lcd_puts(&menu_opt[item-1][0]);
lcd_gotoxy(0,1);
lcd_putc('>');
lcd_putc(' ');
lcd_puts(&menu_opt[item][0]);
}
delay(BTBOUNCE);
}
}
Napsal: 10 kvě 2013, 21:47
od termixnator
ahoj koupil jsem si adapter do USB na RS232 a chtel jsem prubnout USART jenze program kterej sem sehnal je pro atmegu 16 coz by snad nemelo vadit ale podle me je tam spatne nastaveny krystal protoze ja mam jen interni 8MHz nejvetsi problem ej ze program je napsany v Asembleru ktery neznam a nemuzu si ho tedy upravit podle sveho tak sem se chtel zeptat jestli nekdo nedokazete prepsat program do C ? neni moc dlouhy viz :
Kód: Vybrat vše
.NOLIST
.INCLUDE "m16def.inc"
.LIST
.EQU BAUD=103 ;tj. 9600 Bd
.CSEG
RJMP RESET ;inicializace
.ORG URXCaddr
RJMP PRIJEM ;obsluha RXC
;inicializace:
RESET: LDI R16,LOW(RAMEND) ;nastav
OUT SPL,R16 ;SPL
LDI R16,HIGH(RAMEND) ;nastav
OUT SPH,R16 ;SPH
LDI R16,255 ;port C
OUT DDRC,R16 ;je výstupní
OUT PORTC,R16 ;zhasne LED
OUT PORTA,R16 ;A má pull-upy
SBI DDRD,1 ;TXD je výstup
LDI R16,HIGH(BAUD) ;nastavení
OUT UBRRH,R16 ;přenosové
LDI R16,LOW(BAUD) ;rychlosti
OUT UBRRL,R16 ;do UBRR
LDI R16,(1<<RXEN)|(1<<RXCIE)|(1<<TXEN) ;povol příjem+vysílání
OUT UCSRB,R16 ;a RXC přerušení
LDI R16,(1<<URSEL)|(3<<UCSZ0) ;8 datových bitů
OUT UCSRC,R16 ;+1 stop-bit
SEI ;I=0
RJMP PC ;čekej
;obsluha URXC:
PRIJEM: IN R16,UDR ;načti bajt
COM R16 ;negace bitů
OUT PORTC,R16 ;na LED
IN R16,PINA ;čti port A
COM R16 ;negace
OUT UDR,R16 ;odešli bajt
RETI ;konec
Tady je jeste program s kterym spolupracuje v PC hornich 8 policek slouzi k sepnuti 8mi pinu procaku spodnich 8 ukazuje sepnute piny procesoru..

Napsal: 11 kvě 2013, 13:10
od termixnator
Nikdo by nevedel ?

Napsal: 11 kvě 2013, 18:53
od Jenda_KL
Krystal se nastavuje v pojistkách, ne v programu.
Rychlost UART se nastavuje v registrech UBRR (konst.BAUD=103), pokud nechceš počítat konstantu, je v DS tabulka pro nejčastěji používané krystaly a rychlosti.
Napsal: 12 kvě 2013, 18:50
od termixnator
Nastavení Krystalu je mi jasné kde se dělá. Právě sem myslel zanesení jeho hodnoty do programu.. Ale uplně sem přehlédl tu 103jku pokud se tedy nemílím tak hodnota pro muj interní 8MHz kdystal bude 51 při rychlosti 9600.
Jinak stále by mi bylo vhod pokud by dokázal někdo přeložit ten program do C hledal jsem nějaký Convertor ale marně
