criss Postat Ianuarie 31, 2008 Partajează Postat Ianuarie 31, 2008 Buna Am primit 2 controlere Attinny2313 si doresc sa invat programarea pe acestea(cum am citi pe forum este mai usor sa invat pe at decat pe pic, mai ieftine..adica mult mai ieftine si o groaza de lucruri se pot face cu ele). Am decis ca sa folosesc AvrStudio si implicit C ca limbaj de programe. Doresc sa fac ca ledul de pe portulB 3 sa se aprinda prin apasarea butonului de pe portulD1. Ledul imi sta intruna aprins si la apasarea butonului ledul se 'ilumineaza' mai puternic....deci functioneaza.. dar nu cum as dori eu. doua variante as dori sa fac 1. la apasarea butonului sa se aprinda(pe jumatate ii facut dar nui dau de cap..) 2. la apasarea butonului sa se aprinda iar la inca o apasare sa se stinga. Ce biti de setare sa folosesc,nu am setat nimica si nu stiu poate sa cauzeze probleme. Cum pot sa fac ca ledul sa ramana stins,dupa ce am setat directia ( DDRB |= (1 << 1 ) ), prin PORTB ^= (0 << 1) nu are nici un efect sau gresesc eu? Folosesc un quartz extern de 4mhz. #include <avr/io.h> #include <util/delay.h> typedef unsigned char u8;#define LEDoff PORTB |= (1<<3)#define LEDon PORTB &= ~(1<<3)int main(void) { u8 btnState; DDRB |= (1 << 3 ); while(1) { btnState = ~PIND & (1<<1); if (btnState) { LEDoff; } else { LEDon; } } } Link spre comentariu
Laci Postat Februarie 1, 2008 Partajează Postat Februarie 1, 2008 Studiaza putin:unsigned char SimpleDebounce(unsigned char SampleTick, unsigned char SampleCount){ unsigned char ret=1; unsigned char i; for(i=0;i Link spre comentariu
Vizitator AndreisS Postat Februarie 1, 2008 Partajează Postat Februarie 1, 2008 posteaza schema...... poate e ceva aiurea pe acolo :smt006 Link spre comentariu
criss Postat Februarie 1, 2008 Autor Partajează Postat Februarie 1, 2008 am desenat in graba o schema asemanatoare...eu miam facut o placa de test doar cu microcontrolerul(quartz,condensatoare) si conectorii pt iesire/intrare. pt ambele porti am pus conectori. poarta B il folosesc pt leduri iari poarta D pt intrerupatoare.. ledurile respectiv microintrerupatoarele leam inseriat cu o rezistenta de 470ohmi. am mai facut cateva teste in care am reusit sa sting(PORTB = ~0xFF; sau PORTB = 0x00;) ledurile dar cand leam vrut modifica pt partea cu intrerupator nu mia mers. #include <avr/io.h>#include <util/delay.h>int main (void){// set PORTD for outputDDRB = 0xFF;while(1) {PORTB = ~0xFF;_delay_ms(50000);PORTB = 0xFF;_delay_ms(50000);}return 1; } aici este codul pt cea cu intrerupator: #include <avr/io.h>#include <util/delay.h>typedef unsigned char u8;int main (void){u8 btnState;DDRB = 0xFF; while(1) { btnState = PIND | (0<<1); if (btnState) { PORTB = 0xFF; } else { PORTB = ~0xFF; }}return 1; } Aicea sta aprins in totdeauna si daca apas butonul se sting! iar daca inversez in partea de comparare(if) adica: if (btnState) { PORTB = ~0xFF; } else { PORTB = 0xFF; }tot aprins sta iar cand apas butonul se ilumineaza ledul mai tare. am sa ma uit peste ce mia postat @Laci. Link spre comentariu
wbg_1000 Postat Februarie 1, 2008 Partajează Postat Februarie 1, 2008 Nu mai pune bre postscript din asta ca n'am cu cel vedea.Revenind la subiect "|(0<<1)" nu face nimic.Deci tu testezi tot PORTD la care banuiesc ca ai mai multe intrari nedraivuite.Motiv pentru care probabil se evalueaza ba la FALS ba la adevat deci tzi le aprinde mai slab (un fel de PWM). :smt031 Link spre comentariu
criss Postat Februarie 1, 2008 Autor Partajează Postat Februarie 1, 2008 nu am avut cu cel transform..dar acrobat reader professional il poate converti in pdf.sub linux nu am alt program doar acesta cu ajutorul caruia am exportat din eagle. am facut un print screen. sesizeaza ca apas butonul si cand executa ok(ilumineaza ledul mai puternic...ca un pwm)...dar problema este cami sta aprins intruna(inainte sa apas butonul). si acesta doar cu o modificare: if (btnState) { PORTB = ~0xFF; } else { PORTB = 0xFF; } ps in postul meu anterior codul din partea din mijloc merge: ledul sta aprins iar cand apas butonul se stinge si ramane asa pana tin butonul. nu stiu ce sa zic....prima data mia dat impresia ca in momentul cand setez directia portului face probleme,dar dece nu face figuri cand pun sa licureasca ledul/ledurile? Link spre comentariu
wbg_1000 Postat Februarie 1, 2008 Partajează Postat Februarie 1, 2008 Shi cine izti tzine portul cand nu e butonul apasat? Cand nu apesi butonul valoarea portului e nedefinita...Schimba'l sa traga in masa shi activeaza pullupurile interne.Sau fa ceva de genu cu modificarile de rigoare Link spre comentariu
Laci Postat Februarie 1, 2008 Partajează Postat Februarie 1, 2008 wgb_1000 are dreptate , ma gandeam ca-i ceva de genul buba, dar teoretic metoda ce ti-am propus trebuie sa elimine zgomotul. Link spre comentariu
criss Postat Februarie 1, 2008 Autor Partajează Postat Februarie 1, 2008 Mersi mult! am gasit diferite scheme pe net si nu am stiut pe care sal aleg. butonul la masa sal conectez?nu la +? Schema data de @Laci nu a mers din prima a trebuit sa adaug diretia porti B. si inversat ordinea in 'if'... merge dar nu puteam sa temporizez aprinderea ledului,adica timpul cat sta aprins,doar timpul scurs de la apasarea butonului pana la aprindere merge!. #include <avr/io.h>#include <util/delay.h>unsigned char SimpleDebounce(unsigned char SampleTick, unsigned char SampleCount){unsigned char ret=1;unsigned char i;for(i=0;i<SampleCount;i++){_delay_loop_1(SampleTick); // wait for SampleTick CPU clock's if ( !(PIND&(1<<1)) ){ret = 0;break; }}return ret;}int main(void){DDRB |= (1<<3); while(1){if(SimpleDebounce(250,250)) // if buton state is 1 for 250 samples{ PORTB &= ~(1<<3); // reset led pin}else{ PORTB |= (1<<3); // set led pin _delay_ms(150000); // wait for 1 sec (nu merge!!!!!!!!!!!!!)} }} Sa inteleg daca modific schema pot folosi sursa ce am potat eu?...ii mai usor pt mine ce mia postat @Laci nu prea il inteleg.... Am atasat variatele de schema gasite pe net.care ar fi cea mai optima. Multumesc PS. cum activez pullupul? Link spre comentariu
Laci Postat Februarie 2, 2008 Partajează Postat Februarie 2, 2008 Intradevar ce am propus nu merge, dar nu din cauza mea , se pare ca functia _delay_ms() are ceva probleme, eu folosesc numai _delay_loop_1 (sau _2) Degeaba schimbi if-ul #include #include #define DELAY_TICK 65535 #define DELAY_LOOP 20 unsigned char SimpleDebounce(unsigned char SampleTick, unsigned char SampleCount) { unsigned char ret=1; unsigned char i; for(i=0;i { _delay_loop_1(SampleTick); // wait for SampleTick CPU clock's if ( !(PIND&(1<<1)) ) { ret = 0; break; } } return ret; } // unsigned char SimpleDebounce(unsigned char SampleTick, unsigned char SampleCount) int main(void) { unsigned char i; DDRB |= (1<<3); while(1) { if(SimpleDebounce(250,50)) // if buton state is 1 for 50 samples { PORTB |= (1<<3); // set led pin //_delay_ms(3000); /* In loc de _delay_ms() asteapta: 1/( F_CPU / (DELAY_LOOP*DELAY_LOOP) ) F_CPU este frecventa de ceas in Hz, momentan este setat la 3secunde */ for(i=0;i _delay_loop_2(DELAY_TICK); } else { PORTB &= ~(1<<3); // reset led pin } }//while(1) } // int main(void) Acum merge, am atasat si o schema (cum trebuia sa faci), din schemele propuse de tine recomand button2.jpg. Vezi ca si o treaba aparent simpla, cum citirea unui buton nu-i asa de simplu P.S. Varianta asta merge si fara rezistenta de 10K Link spre comentariu
criss Postat Februarie 2, 2008 Autor Partajează Postat Februarie 2, 2008 iti multumesc frumos, mai tarziu am sa modific partea cu butoane pt a adauga rezistenta si condesatorul.O nelamurire am in legatura cu schema postata de tine, pe portulB ledul este condus la masa..nu la + trebuie? Link spre comentariu
Laci Postat Februarie 2, 2008 Partajează Postat Februarie 2, 2008 Eu am facut asa, daca-l legi la + atunci setezi pinul la 0 cand vrei sa-l aprinzi Link spre comentariu
Vizitator AndreisS Postat Februarie 2, 2008 Partajează Postat Februarie 2, 2008 nu va mai chinuiti aiurea. conectati direct butoanele la masa... adica un fir la buton...si legat de la buton la masa. si activati pullupurile interne DDRx=0; PORTx=0xFF.. merge de minune, si mai faceti economie de spatiu pe placa si de piese. Link spre comentariu
Laci Postat Februarie 2, 2008 Partajează Postat Februarie 2, 2008 Nu ne chinuim aiurea, lasa-l pe om sa invete, oricum legi un contact mecanic o sa-ti genereze si zgomot, comutatie f.rapide aleatoare cand il apesi, pe asta trebuie sa-l filtrezi, se numeste debounce. Link spre comentariu
criss Postat Februarie 4, 2008 Autor Partajează Postat Februarie 4, 2008 mersi..am facut dupa schema button2.jpg recomandata de tine si merge. am si incercat codul tot de tine postat si merge #include <avr/io.h>#include <util/delay.h>unsigned char SimpleDebounce(unsigned char SampleTick, unsigned char SampleCount){unsigned char ret=1;unsigned char i;for(i=0;i<SampleCount;i++) {if ( !(PIND&(1<<2)) ){ret = 0;break; }}return ret;}int main(void){DDRB |= (1<<3); while(1){if(SimpleDebounce(250,250)) // if buton state is 1 for 250 samples{ PORTB |= (1<<3); // set led pin }else{ PORTB &= ~(1<<3); // reset led pin} }} Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum