Sari la conținut
ELFORUM - Forumul electronistilor

C pentru ATtinny2313


Postări Recomandate

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
  • Răspunsuri 21
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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

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

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

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

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
Vizitator AndreisS

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări