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ý. :D

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..

Obrázek

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ě :(