ATmega32_LED_MENU – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ATmega32_LED_MENU – Mikrokontroléry – Fórum – Programujte.comATmega32_LED_MENU – Mikrokontroléry – Fórum – Programujte.com

 

Vítek
~ Anonymní uživatel
14 příspěvků
5. 12. 2017   #1
-
0
-

Čau lidi.

potřeboval bych udělat takové menší menu, které se bude projevovat na LED HD44780. Respektive při stisknutí TL1 se mi budou točit 2 možnosti. U těchto možností by mělo jít pomocí TL3 a TL4 zvyšovat nebo snižovat hodnotu. A TL2 by mělo toto nastavení uložit.

Nevíte někdo?

Má to být dělané na projekt Termostatu, kde již mám vytvořený kód na ukazování aktuální teploty na LCD.

Díky moc za rady

Nahlásit jako SPAM
IP: 80.250.14.–
KIIV
~ Moderátor
+43
God of flame
5. 12. 2017   #2
-
0
-

Tak sem dej s cim si nevis presne rady, nebo si to mel dat do inzerce.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Vítek
~ Anonymní uživatel
14 příspěvků
6. 12. 2017   #3
-
0
-
Nahlásit jako SPAM
IP: 80.250.14.–
Vítek
~ Anonymní uživatel
14 příspěvků
6. 12. 2017   #4
-
0
-

#2 KIIV
No právě nevím jak to menu udělat. Takže to mám dát do Inzerce?

Nahlásit jako SPAM
IP: 80.250.14.–
MilanL+1
Grafoman
6. 12. 2017   #5
-
0
-

#4 Vítek

jestli ti jde jen o princip, tak:

1) definice textů : text + ukončovací znak textu, (nějak si vyřešit rotaci poslední>první)

2) proměnné index aktuální položky/textu, proměnné pro jednotlivé položky menu nastavené + 1 pracovní pro právě vybranou

3) reakce na tlačítka

    - tl.1 - změna indexu položky/textu - s rotací, do pracovní proměnné nastavit hodnotu vybrané položky a poté zobrazení
    - tl.3-4 - změna pracovní proměnné +- dle krokování a refresh zobrazení
    - tl.2 - ulož hodnotu pracovní položky do vybrané

teoreticky by stačili i 2-3 tlačítka (dlouhý/krátký stisk tl.1 Rotace menu/+, tl.2 Uložení/-)

Nahlásit jako SPAM
IP: 91.139.9.–
Vítek
~ Anonymní uživatel
14 příspěvků
6. 12. 2017   #6
-
0
-

#5 MilanL
No spíš mi jde o samotný program. Jsem začátečník v tomdle programování. Takže spíše bych potřeboval program s vysvětlením co a jak dělá. A  nejvhodnější by jsou asi ty 4 tlačítka.

Nahlásit jako SPAM
IP: 80.250.14.–
MilanL+1
Grafoman
6. 12. 2017   #7
-
0
-

#6 Vítek
ASM nebo C, komunikaci s displejem máš pořešenou?

Nahlásit jako SPAM
IP: 91.139.9.–
Vítek
~ Anonymní uživatel
14 příspěvků
6. 12. 2017   #8
-
0
-

#7 MilanL
v C, ano. Aktuálně mi čidlo DS18B20 měří teplotu a posílá pomocí dallas_one_wire.h knihovny teplotu na LCD HD44780.h .
Nyní teda potřebuji, aby když stisknu TL1 se změnil LCD na Zvolení Histereze, kde TL3 je (+) a TL4 je (-). Poté stiskem TL2 se zadaná hodnota uloží.

Následně stisknutím TL1 přejde LCD na Zvolení Žádané teploty. Zde zase budu používat (+) a (-) potvrdím/uložím TL2 

Nahlásit jako SPAM
IP: 80.250.14.–
KIIV
~ Moderátor
+43
God of flame
6. 12. 2017   #9
-
0
-

#8 Vítek

Ono je to pomerne trivialni, zacnes postupne resit jednotlive veci:

  • Zacnes nejakym spolehlivym snimanim tlacitek. Muzou vsechny 4 prepinat treba to same (treba dve ledky binarne 0-3).
  • U predchoziho zjistis, ze ti kazdy stisk nahodne namacka kdo vi kolik akci. Takze nastudujes, co jsou to zakmity a jak je softwarove osetrit. Ja volim casovac kazdych par ms a pokud je tlacitko sepnute poslednich N volani timeru, tak provedu akci. Obvykle to resim pres 8bitove bezznamenkove cislo, takze pokud vhodne zvolim interval timeru, zaroven se poresi opakovani pri drzeni tlacitka.
  • Jakmile mas osetrene zakmity, tak muzes resit jedno pocitadlo mezi stavy 0-1 pro TL1. Pokud se zmackne TL3/TL4, tak se podiva na hodnotu pocitadla od TL1, a podle toho bude pricitat/odecitat hodnotu ze dvou ruznych pocitadel. Pro zjednoduseni to muze byt pole.
  • Dalsi krok je ulozeni do EEPROM, doporucuju nejprve nacist co tam je a ulozit jen pokud se to opravdu zmenilo.
  • Pak budes resit aby se hodnoty z EEPROM nacetly po startu/restartu programu
  • A uz pomalu muzes poresit i zobrazovani na lcd. Doted se to dalo v klidu zobrazovat nejakymi ledkami binarne.

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MilanL+1
Grafoman
7. 12. 2017   #10
-
0
-

#9 KIIV
#8 Vítek
také mám dojem, že atmely s těmahle součástkama se používají celkem často, tak by se na netu mělo dát nalézt spousta vyvzorových kodů pro toto zapojení.

Zkouknout si nějaké vzorové kody a pak si podle nich udělat ten svůj program.

Nahlásit jako SPAM
IP: 185.112.167.–
Vica0
Newbie
11. 12. 2017   #11
-
0
-

#9 KIIV
Já to tam nějak nemůžu pořád zapasovat.. Popravdě tomu moc nerozumím, a  potřeboval bych to už udělat co nejdříve. :(

Nahlásit jako SPAM
IP: 195.113.127.–
KIIV
~ Moderátor
+43
God of flame
11. 12. 2017   #12
-
0
-

Nam se tu nechce delat cizi domaci ukoly o nic vic nez tobe ten tvuj. Ani k tomu neni dostatek podkladu, neni k dispozici presny hardware...

Nahlásit jako SPAM
IP: 81.30.230.–
Program vždy dělá to co naprogramujete, ne to co chcete...
12. 12. 2017   #13
-
0
-

Chceš menu o 2 hodnotách s možností inkrementovat a dekrementovat hodnotu. Nabízí se možnost udělat to objektově. Potřebuješ objekt, který obsahuje proměnnou pro popis položky menu, proměnnou pro hodnotu, parametrický konstruktor který nastaví popisku a defaultní hodnotu a metody inkrementuj a dekrementuj. Pak vytvoříš pole těchto objektů (možná lépe ukazatelů na objekty) o dvou prvcích a proměnnou index pomocí které budeš vybírat prvek v poli. Pomocí tlačítek pak měníš index a tím i volíš prvek v poli, stačí vždy vypsat jeho popisku a pro změnu jeho hodnoty volat jeho metody.

V C by sis mohl pomoci strukturou s popiskou a hodnotou a mít pole struktur a funkce pro inkrementaci a dekrementaci, které přijímají jako parametr ukazatel na proměnnou se kterou mají pracovat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
12. 12. 2017   #14
-
0
-

#13 hlucheucho
jde o to co mu nejde jestli menu nebo reakce na tlačítka, vzhledem k tomu jak je na tom s programováním bych se do struktur moc nepouštěl. já bych mu radil udělat to přes jednoduchý funkce a index

stačí 4 proměnné : 2 v EPROM - uložené nastavené hodnoty pro 2 položky menu, v RAM IndexMenu a PracovníHodnota

pak funkce pro jednotlivá tlačítka

- Tl.1 incrementace indexu, kontrola na počet položek menu - při překročení nastavit index na začátek, nastavené hodnoty dle indexu z EPROM do pracovní, zavolat funkci/e/ zobrazení

- Tl.2 a 3: +- pracovní hodnota, případně pomocí If nebo switche rozlišit kroky (např 1 položka po 0,1,  2 položka po 0,2

- Tl.4 podle indexu menu pouze uložení pracovní hodnoty do nastavených hodnot v EPROM

a funkce pro vlastní zobrazení dle indexu menu přes if nebo switch poslat na displej text a pracovní hodnotu - osobně bych ještě oddělil zobrazení hodnoty, při Tl1 zobrazit text i pracovníhodnotu, a při změně pomocí Tl 2 a 3 už jen aktualizovat hodnotu

Nahlásit jako SPAM
IP: 91.139.9.–
Vica0
Newbie
12. 12. 2017   #15
-
0
-

Nevím jak to dostat na LCD.. Zatím jsem vytvořil todle ale nefunguje to:
 

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>

#include "dallas_one_wire.h"
#include "HD44780.h"
#include "crc8.h"


void scan_button(void);// 
void switch_number(uint8_t show_number);

int button_state;
int prev_button_state;
int number;
int i;

int main ( void )
{

DDRB &= ~(1 << PINB0); 
PORTB |= 1 << PINB0; 
button_state = 1;	

	while(1)
	{		
		scan_button();// funkce pro testování stisknutého tlačítka
		_delay_ms(10);//čekání 10ms;
	}
	return 0;
 }
 
 /////////////////////////   OŠETŘENÍ ZÁKMITU TLAČÍTKA      /////////////////////////////
 void scan_button(void)
{
	prev_button_state=button_state;
	button_state=PINB;
	
	button_state &= 0b00000001;
	
	if (button_state == 0)
	{
		if (prev_button_state == 1)
		{
		_delay_ms(150);	
		}
	}	
	else
	{
		if (prev_button_state == 0)
		{
		_delay_ms(150);
		}
	}
}				
	 
	 void switch_number(uint8_t show_number)
	 {	 
		 switch(show_number)
		 {
		 case 1:
		LCD_Clear(); 
		LCD_Initalize();
		LCD_GoTo(0,0);
		LCD_WriteText("  Zadana Hodnota  ");
		break;
		
		case 2:
		LCD_Clear(); 
		LCD_Initalize();
		LCD_GoTo(0,0);
		LCD_WriteText("  Hysterze  ");
		break;
		
		default:
		LCD_Clear();  
		LCD_Initalize();
		LCD_GoTo(0,0);
		LCD_WriteText("  ASD  ");
		break;
		 
		 }
	 }
Nahlásit jako SPAM
IP: 80.250.14.–
MilanL+1
Grafoman
12. 12. 2017   #16
-
0
-

#15 Vica
v Main za scanem bys měl mít porovnání button stavů pokud se rovnají a jsou různé od 0 je stisknuto a mělo by se něco vykonat třeba number+1 a zavolání switch_number(number), následně pak znulování těch button stavů

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
12. 12. 2017   #17
-
0
-

#16 MilanL
 

while(1)
{		
        scan_button();// funkce pro testování stisknutého tlačítka
	_delay_ms(10);//čekání 10ms;
	if ((button_state==prev_button_state) && (button_state==1))
	{
		index +=1;
		switch_number(index);
	}
}

v podstatě ti tam chybí jakákoliv reakce na ten stisk tlačítka v mainu, funkce Switch_number je samostatně musíš jí zavolat

Nahlásit jako SPAM
IP: 185.112.167.–
13. 12. 2017   #18
-
0
-

Co se týče výpisu na LCD: nestačí mít funkci, která výpis provádí, je potřeba ji zavolat, např. v hlavní smyčce programu. Efektivnější je "překreslení" LCD provést jen při změně, tj. odezvě na tlačítko.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
13. 12. 2017   #19
-
0
-

#18 hlucheucho
dotaz na detail, je třeba překreslovat celej displej nebo jde od dané pozice pomocí mezer smazat jen část displeje s hodnotou  a pak jí aktualizovat?

Nahlásit jako SPAM
IP: 91.139.9.–
13. 12. 2017   #20
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
13. 12. 2017   #21
-
0
-

#20 hlucheucho
dík, tak jsem to myslel nastavit pozici + přepsat tu část se starou hodnotou mezerami a opět nastavit pozici a vložit hodnotu, možná by to šlo najednou rovnou s tou hodnotou, ale muselo by se zajistit, že obě budou mít stejný počet znaků. což by formátováním neměl být až takový problém.

Nahlásit jako SPAM
IP: 91.139.9.–
13. 12. 2017   #22
-
0
-

#21 MilanL
v C by funkce sprintf mohla udělat veškerou práci, akorát na jednočipu může být dost neefektivní (na 8051 sežrala hodně paměti, že bylo k dispozici jen 256 Byte, byl to problém). Druhý postup by mohl být založen na známém počtu znaků, které na LCD mám přepsat a známém počtu znaků zapisovaného čísla, pak v prvním cyklu vysázím potřebný počet mezer a ve druhém cyklu číslo samotné. V asm na 8051 jsem si nachytal kus paměti naplněný mezerami v délce místa na LCD a zprava do této paměti vyskládal číslo, pak zapsal do LCD. Ikdyž... mohl jsem to dělat v paměti LCD, směr zápisu lze volit. 

Ono taky záleží na tom, zda číslo zarovnává k pravému okraji LCD nebo vlevo k popisce hodnoty.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý