Tlačítko C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Tlačítko C – C / C++ – Fórum – Programujte.comTlačítko C – C / C++ – Fórum – Programujte.com

 

Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #1
-
0
-

Zdravím, mohl by mi tu někdo poradit s tlačítkem?  Konkrétně mám program, který generuje 2 průběhy a potřebuju, aby se při stisku tlačítka přeměnili.... tzn. z sinusovýho na trojůhelníkovej a naopak.

Je to v jazyku c

děkuju

Nahlásit jako SPAM
IP: 94.199.199.–
TheOndrap+2
Super člen
6. 6. 2012   #2
-
0
-

A používáš na to jakou grafickou knihovnu?? QTčka?

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #3
-
0
-

su v programování nováček, takže moc nevím, co je grafická knihovna, ale doufám, sem se trefil správně :)

#define F_CPU 20000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sfr_defs.h>

Nahlásit jako SPAM
IP: 94.199.199.–
KIIV
~ Moderátor
+43
God of flame
6. 6. 2012   #4
-
0
-

trosku ti uniklo zminit, ze je to pro jednocipy :)

Nahlásit jako SPAM
IP: 62.245.85.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #5
-
0
-

 konkrétně Attiny2313 :)

Nahlásit jako SPAM
IP: 94.199.199.–
TheOndrap+2
Super člen
6. 6. 2012   #6
-
0
-

takovej nepodstatnej detail :D A já jsem naivně předpokládal, že když je to v sekci C/C++ že to bude něco v Cčku :D

Ty programy na generování průběhů už máš? Pokud ano, tak musíš v procesoru povolit přerušovací systém a napsat obslužnou rutinu pro přerušení vyvolaný stiskem tlačítka. Zkus se trošku rozepsat .  .

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #7
-
0
-

Mám k tomu všechno :) ikdyž na 99% blbě :D  v hlavě vím, co to má dělat a jak to má dělat, ale neumím to zapsat :)

#define F_CPU 20000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sfr_defs.h>


unsigned char sinus  = {154, 181, 203, 223, 239, 250, 255, 255, 250, 239, 223, 203, 180, 156, 128, 101, 76, 53, 33, 17, 7};   //hodnoty sinusu

int sinus()
{
while(1){
  for(x=0;x<=max;x++){
  
  }

#define PORT PORTB
#define DDR DDRB
#define PIN PINB

Char klav. I_TEMP,O_TEMP,bit;
Unsigned char BitRot (unsigned char sinus, unsigned char trojuhelnik)


Int main (void)
{
DDR = 0xF0;
PORT = 0x70;
O_TEMP = 0xF0;
DDRD = 0xFF;
PORTD = 0xFF;
_NO()P;
_NO()P;
Do
{
  I_TEMP = PIN & 0x0F
  If (I_TEMP == 0x0F)

int trojuhelnik()
unsigned char trojuhelnik = {-2, -1,84, -1,52, -1,2, -1,04, -0,72, -0,56, -0,4, -0,24, 0,56, 0,72, 1,04, 1,2, 1.52, 1.84, 2, 1.52, 1.04, 0.56, 0.08, -0.56, -1.04, -1.52, -1.84, -2};   //hodnoty trojuhelniku

int trojuhelnik()
{
while(1){
  for(x=0;x<=max;x++){
   PORTB = trojuhelnik;
  }

Toto mám.... kamoš kterej má stejný zadaní tak už tady něco taky psal koukám, vidim část programu kterej sme dali nějak dohromady :D jestli potřebuješ ještě něco tak napiš.... mám aji vypočítanej ten sinusovej průběh a trojůhelník

Nahlásit jako SPAM
IP: 94.199.199.–
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #8
-
0
-

Jinak borci, prosimvás de mi o kejhák... propadám z toho programka a je to na zejtřek ....  popřípadě, kdyby byl někdo ochonej mi ten program napsat a vysvětlit, tak bych se vyrovnal aji finančně, protože na toto nemám prostě buňky 

snaha je, ale nějak mi to nejde...

Nahlásit jako SPAM
IP: 94.199.199.–
TheOndrap+2
Super člen
6. 6. 2012   #9
-
0
-

Promin, ale mě ten program nedává absolutně smysl. Jsem schopnej pochopit že ty funkce sinus a trojuhelnik by měly generovat vystup, potom si ale oprav:

int sinus()
{
while(1){
  for(x=0;x<=max;x++){	
	PORT = sinus[x]//doplněno 	
  }
}
int trojuhelnik()
{
while(1){
  for(x=0;x<=max;x++){
    PORT = trojuhelnik[x]; // doplněno
  }

by mělo v nekonečnym cyklu na výstup posílat hodnoty z toho pole, potom ale k tomu poli musíš přistupovat korektně přes trojuhelnik[x] .. nikde nemáš definovanou proměnnou max, takže předpokládám že je to velikost pole trojuhelník.

Dál, while(1) je nekonečnej cyklus, to asi nebude uplně OK.

#define PORT PORTB je direktiva preprocesoru, takže každý výskyt znaků "PORT" se nahradí "PORTB" .. ty někde používáš PORT a někde PORTB . .

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
TheOndrap+2
Super člen
6. 6. 2012   #10
-
0
-

dej si nahoru do programu k sobě # define a definici proměnných

Ty hodnoty funkcí máš určite dobře? Já teda nejsem žádnej matematik, ale sinus by měl bejt <-1; 1> .. ale možná to máš nějak přenásobený .. ale i tak bys tam měl mít nějaký jiný hodnoty

ten trojuelník je taky nějakej podivnej .. jaks to počítal?

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #11
-
0
-

mno nedivím se..... jsu na tom s programováním mizerně... Zkuím to nějak nadefinovat.... maximální hodnota pro 5 V je 255 já mám 4v takže by se to mělo vyšplhat něco lehce přes 200

pokusím se to napsat a pak to hodim sem

Nahlásit jako SPAM
IP: 94.199.199.–
TheOndrap+2
Super člen
6. 6. 2012   #12
-
0
-

Aha, to už je rozumější .. ale potom by trojuhelník a sinus měl mít stejný hodnoty, alespoň teda co se týče rozsahu 0-255. a ty máš u sinu celý čísla a u trojuhelníku desetinný čísla a už vůbec ne záporný.

Podle toho co říkáš ty máš 8bitový výstup

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #13
-
0
-

jsou tam jiný čísla....


začínám na 127,153,178,199,215,225,229..... a jde to do nuly a zpátky skoro na 127... to by měl být sinus....

 a zadefinovat nevim co přesně myslíš...
 

Nahlásit jako SPAM
IP: 94.199.199.–
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #14
-
0
-

Zao.celk.
127
138
150
161
173
184
203
184
173
161
150
127
tak mi vyšel trojůhelník.....

Nahlásit jako SPAM
IP: 94.199.199.–
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #15
-
0
-

   

*/

#include <avr/interrupt.h>
#include <stdlib.h>	
#include <avr/sleep.h>

	char sinetable [32];
	int  i ;	
	void ioinit (void)								// Initialize  I/O.
	
	/*
	I/O Pin assignments for AT90S8515:
	Port A is the R/2R DAC
	PORT B is Test output
	PORT C is unused
	PORT D is unused
	*/
{		
												//Initialize output ports
	
	PORTB = 0b11111111;
	PORTD = 0b11111111;
	DDRB  = 0b11111111;
	DDRD  = 0b00000000;
}




void timer0_setup (void)									
{
	TCCR0 = 0b00000001;  
	TCNT0 = 175;   
	TIMSK = 0b00000010;
}


 


ISR (SIG_OVERFLOW0)							// Counter0 Interrupt Service
{
PORTB = (sinetable[i++]);
	TCNT0 = 175;	
	if (i==32)		
	{
		i=0;
	}							
}




void arraysettup (void)

{										
	sinetable[0]=127;					// Put 32 step 8 bit sine table into array.
	sinetable[1]=152;	
	sinetable[2]=176;	
	sinetable[3]=198;
	sinetable[4]=217;
	sinetable[5]=233;
	sinetable[6]=245;
	sinetable[7]=252;
	sinetable[8]=254;
	sinetable[9]=252;
	sinetable[10]=245;
	sinetable[11]=233;
	sinetable[12]=217;
	sinetable[13]=198;
	sinetable[14]=176;
	sinetable[15]=152;
	sinetable[16]=128;
	sinetable[17]=103;
	sinetable[18]=79;
	sinetable[19]=57;
	sinetable[20]=38;
	sinetable[21]=22;
	sinetable[22]=10;
	sinetable[23]=3;
	sinetable[24]=0;
	sinetable[25]=3;
	sinetable[26]=10;
	sinetable[27]=22;
	sinetable[28]=38;
	sinetable[29]=57;
	sinetable[30]=79;
	sinetable[31]=103;	
}





int	main (void)		
{
	ioinit();
	arraysettup();
	timer0_setup();
	i = 0;
	sei();
	while (1)
	{	
		set_sleep_mode(SLEEP_MODE_IDLE);
	}	
    return (0);
}

netušíš, jestli by toto jelo, když bych to nějak smixoval, kamoš tam něco psal, jenže mu nikdo neodpověděl....toto by měl bejt sinusovej průběh, že bych to tam nějak nasmolil

Nahlásit jako SPAM
IP: 94.199.199.–
TheOndrap+2
Super člen
6. 6. 2012   #16
-
0
-

ty#15 Fíkus
tohle už vypadá že to má hlavu a patu .. ioinit() nastavuje směr portů, port B je pro tebe nastaven na výstup

arraySetup je jasný.

timer0_setup(); nastaví časovač na vzestupný čítání, s periodou (nevím jakou)

sei(); nevidím

--------

program prostě nastaví časovač procesoru na čítání (třeba do 1000, nevím, musíš zjistit) .. pokaždý když je načítáno do týhle hodnoty, tak se procesor vzbudí a vykoná obsluhu přerušení -> skočí do ISR (SIG_OVERFLOW0) ,, a tam se vykoná obslužný kód.

Tohle poběží, ale bez jakýkoli reakce na tlačítko ,, ty musíš zjistit, jaký přerušení vyvolá stisknutí tlačíka ISR(něco) !!

a potom bych viděl třeba tohle

ISR (PRERUSENI_TLACITKA-!!!musis zjistit!!!){
	//stiskne se tlacitko, zmeni se 0->1, 1->0
	if(ridici == 0) ridici++;
	if(ridici == 1) ridici--;
}

a potom přepíšeš tu rutinu na 

ISR (SIG_OVERFLOW0)	// Counter0 Interrupt Service
{
	if (ridici==0)	PORTB = (sintable[i++]);
	if (ridici==1)  PORTB = (triangletable[i++]);
	TCNT0 = 175;	
	if (i==32){
		i=0;
	}							
}

s tím že teda ještě do main musíš přidat funkci ve který inicializuješ to pole triangletable[] .. uplně stejně jako je sinetable[].

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
6. 6. 2012   #17
-
0
-

 ted už sem se do toho dostal.... do toho časovača dám svou hodnotu... potom tam nahážu hodnoty té sinusovky  a vlastně to co si napsal ty tedka, tak to zapříčiní to, že když bude tlačítko sepnuto/nesepnuto tak tam bude 1/0 to bude mět za následek ten sinus nebo trojůhelník.... ještě si to tam nějak pošmelim ty věcy, že místo sinetable(sinusovky) tam udělám druhej program co povalí ten trojůhelník

akorát nevim přesně jak to asi myslíš.... 

ISR (SIG_OVERFLOW0)							// Counter0 Interrupt Service
{
PORTB = (sinetable[i++]);
	TCNT0 = 175;	
	if (i==32)		
	{
		i=0;
	}							
}

přepíšu na ten kod co si psal místo tohoto a až zjistim co to dělá, tak to přepíšu na ten druhej?

Jinak díky moc, su Ti zavázanej!!!

Nahlásit jako SPAM
IP: 94.199.199.–
TheOndrap+2
Super člen
6. 6. 2012   #18
-
0
-

hele ... je to asi takhle .. je procesor ... ten má v sobě nějakej čítač (stopky) a ty mu nastavíš, do kolika má stopovat to se děje v timer_setup(). Od té chvíle ať se děje co se děje, jakmile stopky napočítají do stanovené hodnoty, vyvolá se přerušení => přerušení musí být obslouženo nějakým kusem kodu, v tvém případě ISR (SIG_OVERFLOW0).

To znamená, že pokud v proceduře ISR (SIG_OVERFLOW0) budeš blikat diodou, tak vždycky když stopky napočítají->vyvolají ISR (SIG_OVERFLOW0), blikne se.

V tvém případě definuješ 2 pole tringletable[] a sinetable[], v obojích budeš mít hodnoty těch funkcíí (to už máš)

a tedko, pokaždé když stopky napočítají -> zavolá se ISR (SIG_OVERFLOW0) se na PORB vypíše (v závislosti na proměnné ŘÍDÍCÍ) bud sinetable nebo triangletable.

TCNT0 znovu zapne stopky a jede se znova, s tím že se posune i=index v poli .. a ta kontrola to víš, aby si nepřetekl velikost pole

a to co ty musíš vymyslet, je reakce na to tlačítko. Protože stejně jako stopky vyvolají událost, na kterou se reaguje ISR (SIG_OVERFLOW0), tak tlačítko vyvolá událost, na kterou je potřeba zareagovat ISR (něco, to musíš někde mít, ste se museli učit) ... a v týhle funkci budeš dokola měnit (switchovat) proměnou řídící z 0 -> 1

ufffffff ... chápeš??

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
7. 6. 2012   #19
-
0
-

Tak z 90 % jo :)uvidim ve škole zachvilku :)

Nahlásit jako SPAM
IP: 94.199.199.–
KIIV
~ Moderátor
+43
God of flame
7. 6. 2012   #20
-
0
-

Každopádně existuje speciální mód čítače: CTC (Clear Timer on Compare match) - nadefinuje se akorát hodnota, při které se zresetuje čítač (v ICR0A) + vyvolá přerušení SIG_OVERFLOW0

pak je taky mnohem čitelnější, když se používají názvy jednotlivých flagů:

OCR0A = 79; // 80 cpu cycles
TCCR0A = _BV(WGM01); // WGM0=3  010 - CTC mode
TCCR0B = _BV(CS00); // start timer without prescaling

unsigned char i;
volatile unsigned char ridici;
unsigned char table[64] = {...};

/// a v ISR resis jen:
ISR (SIG_OVERFLOW0)	// Counter0 Interrupt Service
{
  // sude polozky v table budou trojuhelnik, liche sinus
  i= ((i+2) | ridici) & 0x3F; // cca 5-6 instrukci
  PORTB = table[i]; // i nemusi byt ani volatile - neni treba hlidat z venku
}

samotný vnitřek pak vyjde na 12 instrukcí + 18instukcí si vkládá samo C jako zálohování registrů a tak

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Fikus
~ Anonymní uživatel
15 příspěvků
7. 6. 2012   #21
-
0
-

už je to na mě moc informací  :D musíte na mě pomalu a jak pro někoho, kdo to vživotě neviděl :) su tedka ve škole napíšu to a zhruba za 2 hodiny budu muset už program ukazovat učitelovi... to co napišu sem hodim a dyžtak mi to trošku opravte kdyby to šlo

Jinak KIIV mohl bys to nějak zjednodušit? to tvoje moc nechápu...

Nahlásit jako SPAM
IP: 91.219.241.–
Fikus
~ Anonymní uživatel
15 příspěvků
7. 6. 2012   #22
-
0
-

   


#include <avr/interrupt.h>
#include <stdlib.h>	
#include <avr/sleep.h>

	char sinetable [32];
char triangletable [12];

	int  i ;	
	void ioinit (void)								 
{		
											
	PORTB = 0b11111111;
	PORTD = 0b11111111;
	DDRB  = 0b11111111;
	DDRD  = 0b00000000;
}


void timer0_setup (void)		// čítač							
{
	TCCR0 = 0b00000001;  
	TCNT0 = 127;   
	TIMSK = 0b00000010;
}



ISR (SIG_OVERFLOW0)	// Counter0 Interrupt Service
{
	if (ridici==0)	PORTB = (sintable[i++]);  //jestli je tlačítko zapnuto, probíhá sinus
	if (ridici==1)  PORTB = (triangletable[i++]); //jestli je tlačítko vypnuto, probíhá trojúhelník

	TCNT0 = 127;	
	if (i==25){
		i=0;
	}							
}



void arraysettup (void)

{										
	sinetable[0]=127;					// 25 kroků posílání hodnot průběhu nadefinovaných v array
	sinetable[1]=153;	
	sinetable[2]=178;	
	sinetable[3]=199;
	sinetable[4]=215;
	sinetable[5]=225;
	sinetable[6]=229;
	sinetable[7]=225;
	sinetable[8]=215;
	sinetable[9]=199;
	sinetable[10]=178;
	sinetable[11]=153;
	sinetable[12]=127;
	sinetable[13]=101;
	sinetable[14]=76;
	sinetable[15]=55;
	sinetable[16]=39;
	sinetable[17]=29;
	sinetable[18]=25;
	sinetable[19]=29;
	sinetable[20]=39;
	sinetable[21]=55;
	sinetable[22]=76;
	sinetable[23]=101;
	sinetable[24]=127;
		
}





int	main (void)		
{
	ioinit();
	arraysettup();
	arraysettup2 ();
	timer0_setup();
	i = 0;
	sei();
	while (1)
	{	
		set_sleep_mode(SLEEP_MODE_IDLE);
	}	
    return (0);
}

void arraysettup2 (void)  //12 kroků posílání hodnot průběhu nadefinovaných v array


{										
	triangletable[0]=127;
triangletable[1]=138;
triangletable[2]=150;
triangletable[3]=161;
triangletable[4]=173;
triangletable[5]=184;
triangletable[6]=203;
triangletable[7]=184;
triangletable[8]=173;
triangletable[9]=161;
triangletable[10]=150;
triangletable[11]=127;													
Nahlásit jako SPAM
IP: 91.219.241.–
TheOndrap+2
Super člen
7. 6. 2012   #23
-
0
-

1) pořád si nikde neošetřil reakci na stisk tlačítka

2) proč máš to druhý pole různě veliký? to je přece hloupost .. měls udělat pole 32 prvků a nepočíst hodnoty

Nahlásit jako SPAM
IP: 147.228.182.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
Fíkus
~ Anonymní uživatel
15 příspěvků
7. 6. 2012   #24
-
0
-

tak už je to odevzdaný.... :D sice je to blbě, ale snad mi tu 4řku dá :D

Nahlásit jako SPAM
IP: 94.199.199.–
Fíkus
~ Anonymní uživatel
15 příspěvků
7. 6. 2012   #25
-
0
-

Jinak děkuju, že ste to semnou vydrželi a pomohli mi :)

Nahlásit jako SPAM
IP: 94.199.199.–
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, 53 hostů

Podobná vlákna

Tlacitko so)t — založil gerry

Tlačítko — založil 12dawe34

Cyklus a tlacitko — založil miro1

Moderátoři diskuze

 

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