Jump to content
ELFORUM - Forumul electronistilor

C pentru ATtinny2313


criss
 Share

Recommended Posts

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Guest 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 to comment
Share on other sites

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines