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
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
A používáš na to jakou grafickou knihovnu?? QTčka?
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 . .
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
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...
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 . .
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?
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
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
*/
#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
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[].
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!!!
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š??
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
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...
#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;
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
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku