Programovani AVR a LCD displej

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
ZdenekHQ
Významný člen
Příspěvky: 25519
Registrován: 21 črc 2006, 00:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#16 Příspěvek 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
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]
Uživatelský avatar
termixnator
Příspěvky: 94
Registrován: 17 říj 2009, 00:00
Bydliště: Praha

#17 Příspěvek 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);
   }
}
 
Uživatelský avatar
termixnator
Příspěvky: 94
Registrován: 17 říj 2009, 00:00
Bydliště: Praha

#18 Příspěvek 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
Uživatelský avatar
termixnator
Příspěvky: 94
Registrován: 17 říj 2009, 00:00
Bydliště: Praha

#19 Příspěvek od termixnator »

Nikdo by nevedel ? :)
Jenda_KL
Příspěvky: 1173
Registrován: 10 zář 2008, 00:00
Bydliště: Kadaň
Kontaktovat uživatele:

#20 Příspěvek 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.
Uživatelský avatar
termixnator
Příspěvky: 94
Registrován: 17 říj 2009, 00:00
Bydliště: Praha

#21 Příspěvek 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ě :(
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“