DS18B20+atmega8+2digit 7segment/problem s algoritmom
Moderátori: psichac, Moderátori
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
DS18B20+atmega8+2digit 7segment/problem s algoritmom
Zdravím.
Akurát programujem jednoduchý teplomer, kde sa mi bude ukazovať teplota na 2 digit. 7 segmente. Hlavný program vyzerá takto:
int main(void)
{
char text[17];
DDRD=0b11111111; //nastavenie portu D na výstup
DDRB=0b11111111; //nastavenie portu B na výstup
while(1)
{
ds18b20_get_temp(text); //text bude mať nejakú hodnotu podľa teploty (napr. 12)
/*niečo niečo niečo....*/
_delay_ms(200);
}
}
Ide o to, že do poľa char text[17] mi vypľuje digitálne čidlo nejakú hodnotu. Potrebujem spraviť nejako šikovne algoritmus, ktorý spraví, že ak bude pole trebárs 12, tak mi displej vypíše 12. Lenže ak chcem vypísať napr. to číslo 12, tak musim zapisať
PORTD|=255;
PORTD&=0b11001111; // presné rozsvietenie segmentov na prvom digite podľa čísla 1
PORTB|=255;
PORTB&=0b00010011; // presné rozsvietenie segmentov na druhom digite podľa čísla 2
Pričom portd je vlastne ten prvý digit a portb je druhý digit. Ja som si spravil jednotlivo od 0-9 oba digity do podprogramov, lenže teraz by som musel robiť v hlavnom programe podmienku if 99x (pre výpis čísel od 0 až po 99) a to je hlúposť na n-tú. Viete mi nejako poradiť? Mne žiadne šikovné riešenie nenapadá.
Akurát programujem jednoduchý teplomer, kde sa mi bude ukazovať teplota na 2 digit. 7 segmente. Hlavný program vyzerá takto:
int main(void)
{
char text[17];
DDRD=0b11111111; //nastavenie portu D na výstup
DDRB=0b11111111; //nastavenie portu B na výstup
while(1)
{
ds18b20_get_temp(text); //text bude mať nejakú hodnotu podľa teploty (napr. 12)
/*niečo niečo niečo....*/
_delay_ms(200);
}
}
Ide o to, že do poľa char text[17] mi vypľuje digitálne čidlo nejakú hodnotu. Potrebujem spraviť nejako šikovne algoritmus, ktorý spraví, že ak bude pole trebárs 12, tak mi displej vypíše 12. Lenže ak chcem vypísať napr. to číslo 12, tak musim zapisať
PORTD|=255;
PORTD&=0b11001111; // presné rozsvietenie segmentov na prvom digite podľa čísla 1
PORTB|=255;
PORTB&=0b00010011; // presné rozsvietenie segmentov na druhom digite podľa čísla 2
Pričom portd je vlastne ten prvý digit a portb je druhý digit. Ja som si spravil jednotlivo od 0-9 oba digity do podprogramov, lenže teraz by som musel robiť v hlavnom programe podmienku if 99x (pre výpis čísel od 0 až po 99) a to je hlúposť na n-tú. Viete mi nejako poradiť? Mne žiadne šikovné riešenie nenapadá.
0
-
- Pokročilý člen
- Príspevky: 510
- Dátum registrácie: 15 Sep 2014, 15:56
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
ách jo, to je furt dokolečka... Hlavně že máme knihovničku na ds18b20 ale číslo vypsat neumíme. Ten svět se řítí do řiti
A v čem je jako teda problém? Že není knihovnička, která vypíše string na dvě sedmisegmentovky? Jaj, to je ale smůla...
Rozsvítit LEDky segmentovky umíš? Umíš na ně zobrazit číslici? Umíš udělat tabulku hodnot (aspoň pomocí switch-case)? Umíš převést znak na číslo?
Tak teda co nejde? Nebo to má někdo celé napsat za tebe?
A v čem je jako teda problém? Že není knihovnička, která vypíše string na dvě sedmisegmentovky? Jaj, to je ale smůla...
Rozsvítit LEDky segmentovky umíš? Umíš na ně zobrazit číslici? Umíš udělat tabulku hodnot (aspoň pomocí switch-case)? Umíš převést znak na číslo?
Tak teda co nejde? Nebo to má někdo celé napsat za tebe?
0
- rudko
- Power user
- Príspevky: 2340
- Dátum registrácie: 28 Dec 2012, 08:33
- Vek: 37
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
chces vediet ako prekodovat dec na 7seg kod?
urob si pole o velkosi 10 a na prislusne pozicie zapis cislo reprezentujuce tvoje zobrazenie na 7seg.
pre 1 si prepocitaj 0b11001111 na dec a zapis na poziciu jedna
pre 2 si prepocitaj 0b00010011 na dec a zapis na poziciu dva
a tak dalej
ps: nezabudni ze prva musi byt nula
edit: a ze mam dnes dobru naladu tak pokracovanie bude:
int tvojateplota;
PORTD|=255;
PORTD&=digit[tvojateplota/10]; // cislo deleno 10
PORTB|=255;
PORTB&=digit[tvojateplota%10]; // zostatok po deleni 10timi
kde digit je pole vyssie zmienene
samozrejme ze sa to da este vylepsit, ale na to uz pridi sam
urob si pole o velkosi 10 a na prislusne pozicie zapis cislo reprezentujuce tvoje zobrazenie na 7seg.
pre 1 si prepocitaj 0b11001111 na dec a zapis na poziciu jedna
pre 2 si prepocitaj 0b00010011 na dec a zapis na poziciu dva
a tak dalej
ps: nezabudni ze prva musi byt nula
edit: a ze mam dnes dobru naladu tak pokracovanie bude:
int tvojateplota;
PORTD|=255;
PORTD&=digit[tvojateplota/10]; // cislo deleno 10
PORTB|=255;
PORTB&=digit[tvojateplota%10]; // zostatok po deleni 10timi
kde digit je pole vyssie zmienene
samozrejme ze sa to da este vylepsit, ale na to uz pridi sam
0
Drink coffee. Do stupid things faster with more energy...
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Hinsi napísal:ách jo, to je furt dokolečka... Hlavně že máme knihovničku na ds18b20 ale číslo vypsat neumíme. Ten svět se řítí do řiti
A v čem je jako teda problém? Že není knihovnička, která vypíše string na dvě sedmisegmentovky? Jaj, to je ale smůla...
Rozsvítit LEDky segmentovky umíš? Umíš na ně zobrazit číslici? Umíš udělat tabulku hodnot (aspoň pomocí switch-case)? Umíš převést znak na číslo?
Tak teda co nejde? Nebo to má někdo celé napsat za tebe?
Samozrejme, že rozsvietiť LEDky viem, samozrejme, že zobraziť číslicu viem. Potrebujem sa len vyhnúť tomu, aby som robil 99 krát podmienku if.
Rudko díki moc! Problém je len v tom, že som dlho nerobil v C... Aspoň niekto mi poradí a nebude tu písať len nejaký potrhlý čech, čo si musí nohiť svoje ego!
0
-
- Pokročilý člen
- Príspevky: 510
- Dátum registrácie: 15 Sep 2014, 15:56
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Tohle není o nohiťění ega, ale o s prominutím absolutní tuposti a lenosti používat mozek nebo google.
To co ti radí rudko nebude navíc ani fungovat "s tím polem nahoře", protože to "pole nahoře" by sis musel prve převést na číslo a to číslo pak zas zpátky na text (jak užitečná operace), místo abys rovnou znaky z pole odečtením 48mi převedl na čísla pro jednotlivé segmentovky. Je pak jen otázkou, jak je formátovaný výstupní řetezec z té knihovničky, ale to by sis měl nastudovat a vědět, když jí používáš.
To co ti radí rudko nebude navíc ani fungovat "s tím polem nahoře", protože to "pole nahoře" by sis musel prve převést na číslo a to číslo pak zas zpátky na text (jak užitečná operace), místo abys rovnou znaky z pole odečtením 48mi převedl na čísla pro jednotlivé segmentovky. Je pak jen otázkou, jak je formátovaný výstupní řetezec z té knihovničky, ale to by sis měl nastudovat a vědět, když jí používáš.
0
- rudko
- Power user
- Príspevky: 2340
- Dátum registrácie: 28 Dec 2012, 08:33
- Vek: 37
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
vies mi prosimta vysvetlit preco by mal toto robit: ?
""s tím polem nahoře", protože to "pole nahoře" by sis musel prve převést na číslo a to číslo pak zas zpátky na text (jak užitečná operace)"
co musi prevadzat spat na text? aky text chces riesit pri 7 segmentovom displeji ? on potrebuje previest cisla od 0 po 9 na kombinaciu 7 bitov ktore priamo zapisuje na port a cisla vyjadrujuce tychto 7 bitov zapise do jednotlivych pozicii pola.
""s tím polem nahoře", protože to "pole nahoře" by sis musel prve převést na číslo a to číslo pak zas zpátky na text (jak užitečná operace)"
co musi prevadzat spat na text? aky text chces riesit pri 7 segmentovom displeji ? on potrebuje previest cisla od 0 po 9 na kombinaciu 7 bitov ktore priamo zapisuje na port a cisla vyjadrujuce tychto 7 bitov zapise do jednotlivych pozicii pola.
0
Drink coffee. Do stupid things faster with more energy...
-
- Pokročilý člen
- Príspevky: 510
- Dátum registrácie: 15 Sep 2014, 15:56
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Asi vidím blbě (a google vrátil špatné výsledky), ale fce ds18b20_get_temp() vrací textový řetězec a v tebou nabízením řešení používáš operace / a %. Ty snad fungují na řetězce?
Pro tvé řešení potřebuje číslo. Pochybuju, že sám přijde na to, jak z řetězce vyrobit číslo, aby ho mohl dělit, jak mu nabízíš. Navíc je to potom zbytečná operace, neboť ta funkce ds18b20_get_temp() z čísla vevnitř dělá řetězec a ty pak zase zpátky potřebuješ číslo.
Takže už to v tom vidíš, nebo ještě ne?
Pro tvé řešení potřebuje číslo. Pochybuju, že sám přijde na to, jak z řetězce vyrobit číslo, aby ho mohl dělit, jak mu nabízíš. Navíc je to potom zbytečná operace, neboť ta funkce ds18b20_get_temp() z čísla vevnitř dělá řetězec a ty pak zase zpátky potřebuješ číslo.
Takže už to v tom vidíš, nebo ještě ne?
0
-
- Ultimate člen
- Príspevky: 1738
- Dátum registrácie: 11 Máj 2008, 00:00
- Bydlisko: Námestovo
- Vek: 34
- rudko
- Power user
- Príspevky: 2340
- Dátum registrácie: 28 Dec 2012, 08:33
- Vek: 37
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
ja som mu poskytol odpoved na otazku ako zobrazit cisla na dvoch 7 seg bez 99x if. a ta je podla mna spravna. ako ja mam vediet co vracia jeho funkcia? ja som si pred asi 10 rokmi robil kniznicu na 1820ku a ta mi vracia cele cislo. a zhodou okolnosti sa myslim vola tak ako jeho, akurat namiesto 18b20 je v nazve iba 1820
0
Drink coffee. Do stupid things faster with more energy...
-
- Pokročilý člen
- Príspevky: 510
- Dátum registrácie: 15 Sep 2014, 15:56
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Já něřikám že je to špatně, ale že při jeho schopnestech si s tývm řešení neporadí.
0
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Chalani ja sa s tým nejako popasujem zajtra. Dík Rudko za help.
OFFTOPIC!!:
Hinsi, ty si len drzý sopliak, ktorý nevie slušne komunikovať. Máš s tým problém a všetko čo píšeš to len dokazuje. Možno by ti nezaškodilo zamyslieť sa nad sebou, ale nie som tu od toho, aby som ti dával rady. Ospravedlnenie od teba chcieť nebudem, pretože vidím ako je na tom tvoje ego, ktoré by sa za svoje chovanie neospravedlnilo. Ja ti ale odpúšťam a budem to brať len ako nevyspelú a unáhlenú reakciu na slušnú prosbu.
Ak som absolútne tupý a lenivý, navštív náš náučno-populárny youtube kanál Exsisto Sapiens čo je z latinčiny "buď múdry", alebo nájdeš pár mojich článkov na invivomagazin.sk či blogu.sme. Ak na ne budeš stačiť, pokojne tam pridaj komentár a zapoj sa do diskusie.
PS: Tu som si ťa pridal medzi ignorovaných.
OFFTOPIC!!:
Hinsi, ty si len drzý sopliak, ktorý nevie slušne komunikovať. Máš s tým problém a všetko čo píšeš to len dokazuje. Možno by ti nezaškodilo zamyslieť sa nad sebou, ale nie som tu od toho, aby som ti dával rady. Ospravedlnenie od teba chcieť nebudem, pretože vidím ako je na tom tvoje ego, ktoré by sa za svoje chovanie neospravedlnilo. Ja ti ale odpúšťam a budem to brať len ako nevyspelú a unáhlenú reakciu na slušnú prosbu.
Ak som absolútne tupý a lenivý, navštív náš náučno-populárny youtube kanál Exsisto Sapiens čo je z latinčiny "buď múdry", alebo nájdeš pár mojich článkov na invivomagazin.sk či blogu.sme. Ak na ne budeš stačiť, pokojne tam pridaj komentár a zapoj sa do diskusie.
PS: Tu som si ťa pridal medzi ignorovaných.
0
- Tribec Zacks
- Pokročilý člen
- Príspevky: 709
- Dátum registrácie: 26 Jún 2010, 00:00
- Bydlisko: Levice / Cork IRL
- Vek: 41
- Kontaktovať používateľa:
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Firen, pozri sem:
http://svetelektro.com/modules.php?name ... 85#p565985
budes na to potrebovat nejaky interrupt, skus porozmyslat aky a preco. napoveda -> aktivne segmenty pre jednotlive cislice si uloz v arrayi.
http://svetelektro.com/modules.php?name ... 85#p565985
budes na to potrebovat nejaky interrupt, skus porozmyslat aky a preco. napoveda -> aktivne segmenty pre jednotlive cislice si uloz v arrayi.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Oh jasné Tribec Zacks! To mi ešte pred skúškovým hovoril spolužiak, že to by som aj vedel urobiť a je to hospodárnejšie. Vďaka!
0
-
- Stály člen
- Príspevky: 307
- Dátum registrácie: 07 Mar 2014, 06:38
- Bydlisko: Trnava
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
tu mas hotovy projekt bez kniznice na 4 displeje
http://radioparty.ru/prog-avr/program-c ... n2-ds18b20
da sa to urobit na dva
http://radioparty.ru/prog-avr/program-c ... n2-ds18b20
da sa to urobit na dva
0
ho
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Už som to poriešil tak trochu svojským spôsobom. Len mám problém, že mi stále vypisuje chybu undefined...
Pričom keď to tam píšem, tak mi dá dokonca na výber - teda vie, že to tam je, ale keď dám build, tak vypíše chybu, že je to "undefined"...a úplne hore mám #include "ds18b20.h".
Pričom keď to tam píšem, tak mi dá dokonca na výber - teda vie, že to tam je, ale keď dám build, tak vypíše chybu, že je to "undefined"...a úplne hore mám #include "ds18b20.h".
0
-
- Stály člen
- Príspevky: 112
- Dátum registrácie: 28 Dec 2014, 01:24
- Bydlisko: okres NZ
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
vidim ze mas otvorenu kniznicu, ale nevidim ju v solution Exploreri. Ten je v pravej casti programu. Klikni pravym tl. mys na "teplomeris" (vedla tej zltej ikonky) a "add existing item" a pridaj tam .c a .h file toho DS.
EDIT: warning odstranis tak, ze zase kliknes na "teplomeris" (vedla zlzej ikonky v Solution explorer) vyberies "properties". Dalej "Symbols" a sem do prvej tabulky (Defined symbols -D ) pridas "F_CPU=1000000" (alebo inu frekvenciu, podla toho aku pouzivas)
EDIT: warning odstranis tak, ze zase kliknes na "teplomeris" (vedla zlzej ikonky v Solution explorer) vyberies "properties". Dalej "Symbols" a sem do prvej tabulky (Defined symbols -D ) pridas "F_CPU=1000000" (alebo inu frekvenciu, podla toho aku pouzivas)
0
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Veľmo ďakujem!
EDIT: Hmm spravil som to a píše to stále tú chybu. Lenže to .h asi treba dať aj do librares. Keď to tam dám, tak mi ale hádže novú chybu, "cannot find -lds18b20.h". (Tie warningy sú opravené. )
EDIT: Hmm spravil som to a píše to stále tú chybu. Lenže to .h asi treba dať aj do librares. Keď to tam dám, tak mi ale hádže novú chybu, "cannot find -lds18b20.h". (Tie warningy sú opravené. )
0
-
- Stály člen
- Príspevky: 112
- Dátum registrácie: 28 Dec 2014, 01:24
- Bydlisko: okres NZ
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
a tie ds18b20.h a ds18b20.c su fyzicky v tej istej zlozke ako teplomeris.c ?? ak nie tak ich tam nakopiruj. Inak by si musel prepisat #include
0
-
- Nový člen
- Príspevky: 52
- Dátum registrácie: 29 Okt 2010, 00:00
- Vek: 31
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
Áno, takto to tam mám. Netreba niečo dať ešte do toho libraries?
0
-
- Stály člen
- Príspevky: 112
- Dátum registrácie: 28 Dec 2014, 01:24
- Bydlisko: okres NZ
Re: DS18B20+atmega8+2digit 7segment/problem s algoritmom
hmm nic ma nenapada. Do libraries nedavam nic. Skus este "rebuild solution", pripadne sem nahraj projekt.
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 0 Odpovedí
- 1268 Zobrazení
-
Posledný príspevok od používateľa liptacik
-
- 19 Odpovedí
- 1646 Zobrazení
-
Posledný príspevok od používateľa 5ko
-
- 14 Odpovedí
- 858 Zobrazení
-
Posledný príspevok od používateľa cs001
-
- 2 Odpovedí
- 474 Zobrazení
-
Posledný príspevok od používateľa Edgar
-
- 2 Odpovedí
- 1324 Zobrazení
-
Posledný príspevok od používateľa romiadam