Sari la conținut
ELFORUM - Forumul electronistilor

Generator de impulsuri (semnale alarma)?


svsu

Postări Recomandate

  • Răspunsuri 37
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

Am vrut sa inteleg de ce nu folosesti direct delay().

 inseamna ca a fost o intamplare, eu gresisem o variabila pe-acolo.

 

nu am folosit delay(), pentru ca atunci cand dai comanda delay(), uC ingheata si nu mai executa nimic.

astfel ca...daca utilizatorul renunta la comanda, sirena ar fi continuat sa sune pana termina uC de numarat delay().

e un mecanism...de a face delay() in impulsuri sa zic asa.

 

eu nu prea folosesc tipul asta de delay, folosec milllis(), dar aici nu avea rost.

 

 

 

referitor la nokia. cred ca merge si cu un FTDI, daca nu poate sa-si faca un pcb..

Editat de Vizitator
Link spre comentariu
  • 4 luni mai târziu...

Revin cu intarziere la acel topic. Am realizat montajul, am programat ATtiny-ul. Dar am cinci nelamuriri:

 

1. Folosesc butoane pushbutton cu revenire sau cu retinere?

2. Pinul ce citeste valoarea rezistorilor este pinul fizic 3?

3. Pinul de iesire releu este pinul fizic 2?

4. La instructiunea 

const int panouPin = A3; // Attiny85: pin 2
const int outputPin = 4; // Attiny85: pin 3

 

nu trebuia 

const int panouPin = A3; // Attiny85: pin 2

const int outputPin = A4; // Attiny85: pin 3 ?

 

5. Cum calculez valorile rezistorilor? Cu ADC egal cu Vin*1024/Vref?

Editat de svsu
Link spre comentariu
  • 4 luni mai târziu...

Am incarcat hex-ul aferent schitei cu Khazama AVR programmer, dar se pare ca nu functioneaza. Nu am output pe pinul 3. Circuitul fizic este cel din attach.

 

 

Am folosit ca programator un USBASP si un bread board.

 

 

Am testat, ca sa fiu sigur, si un alt hex de aplicatie blink led.

 

Pe acela a functionat.

 

 

Deci merge programatorul si recte Khazam-ul.

 

 

How can i do?

post-233892-0-43758600-1469008613_thumb.jpg

Link spre comentariu

Am rezolvat problema facand in hex byteswap. Acum functioneaza dar cand pinul 2 este in aer pe pinul trei am niste impulsuri parazite aleatoare. Sa pun un rezistor intre pinul 2 si masa asa cum a fost sugerat? Cam ce valoare, pentru ca pe reteaua serie de rezistori am acum GND, 30k, 10k, 10k, 10k, Vcc 5V.

Link spre comentariu

nu am inteles de ce ai facut modificare in Hex cand aveai codul sursa..care de altfel e corect, nu e nevoie sa pui A4 pentru ca atiiny85 nici nu are un A4

cred ca sunt cam mari valorile de 10K pentru ca insumate ar fi vreo 30K. undeva insumate ar trebuii sa fie vreo ~15K si pentru masa e ok ceva in jurul lui 30K. trebuie testat, si modificat in soft range-urile. mai pe scurt trebuie sa compilezi sursa, nu poti incarca doar HEX-ul. sau daca vrei sa incarci doar HEX-ul atunci pui un potentiometru  in loc de cele 3 rezistente , si notezi valorile. masa ramana fixa, vreo ~30K.

 

niciodata nu lasi un PIN fizic de intrare fara masa, pentru ca e firesc sa ai citiri aiurea. asta in cazul in care nu activezi din soft pull up

Editat de Vizitator
Link spre comentariu

nu am inteles de ce ai facut modificare in Hex cand aveai codul sursa..care de altfel e corect, nu e nevoie sa pui A4 pentru ca atiiny85 nici nu are un A4

cred ca sunt cam mari valorile de 10K pentru ca insumate ar fi vreo 30K. undeva insumate ar trebuii sa fie vreo ~15K si pentru masa e ok ceva in jurul lui 30K. trebuie testat, si modificat in soft range-urile. mai pe scurt trebuie sa compilezi sursa, nu poti incarca doar HEX-ul. sau daca vrei sa incarci doar HEX-ul atunci pui un potentiometru  in loc de cele 3 rezistente , si notezi valorile. masa ramana fixa, vreo ~30K.

 

niciodata nu lasi un PIN fizic de intrare fara masa, pentru ca e firesc sa ai citiri aiurea. asta in cazul in care nu activezi din soft pull up

 

Pana la urma am folosit un ADC calculator si mi-a rezultat urmatoarea lista de valori:

ScreenShot084.jpg.bmp

Editat de svsu
Link spre comentariu

eu iti propun sa lasi calculatorul, ala e pentru valori orientative si o proportionare mai buna.  incepe si pui un potentiometru, cu notare valori, apoi pui rezistente apropiate.. sau faci din soft (best way), compilezi si incarci. de ce ? pentru simplu fapt ca poate ai noroc sa te afli la doar 1-2 puncte in ADC, ceea ce inseamna Unsure. Ba e PreAlarma, sau poate Alarma ... Intelegi tu ce zic.. Cel putin sper sa intelegi.

Editat de Vizitator
Link spre comentariu

Attiny85 8Mhz (-U lfuse:w:0xE2:m -U hfuse:w:0xD7:m -U efuse:w:0xFE:m)

 

post-235374-0-60758400-1470356190_thumb.jpg

 

Daca nu merge butonul de reset, pune R5 = 10K

R1-R4, R6 ar trebuii calculate dupa LED-urile pe care le vei folosii.

Pe C1 vroiam sa scriu 100nF, incearca sa-l pozitionezi cat mai aproape de uC, preventiv sa nu-l  bruieze sirena, sau ce e, chiar daca e separata galvanic.

Nu uita sa pui la Releul care-l vei monta dioda, si iti recomand sa folosesti un mos-fet in loc de tranzistor.

Toate Butoanele sunt fara retinere de tip PUSH (apasare scurta ~500ms)

uC functioneaza cel mai bine la Maxim 4.95-4.98V. Sa nu ai niciodata nimic peste 5V. In schema ta ai 3.3V dar nu prea e ok la 8MHz ; uC-ul s-ar bucura mai mult cu tensiunea de 4.98V

 

 

 

COD:

/*Attiny85 */#include <avr/io.h>#include <avr/wdt.h>const int outputPin = 0; // Attiny85: pin 5const int btn1Pin =   1; // Attiny85: pin 6 | ALARMA LA DEZASTREconst int btn2Pin =   2; // Attiny85: pin 7 | PREALARMA AERIANAconst int btn3Pin =   3; // Attiny85: pin 2 | ALARMA AERIANAconst int btn4Pin =   4; // Attiny85: pin 3 | INCETARE ALARMAint currentButton = 0;unsigned long cMs, lastBlink = 0;boolean stLed = 0;void setup(){  if(MCUSR & _BV(WDRF)){                MCUSR &= ~_BV(WDRF);                  WDTCR |= (_BV(WDCE) | _BV(WDE));       WDTCR = 0x00;                        }  int i=0;  for (i=0; i<5;i++) {    pinMode(i,OUTPUT);  }  for (i=1; i<5;i++) {    digitalWrite(i,HIGH);  }  delay(1000);  for (i=0; i<5;i++) {    digitalWrite(i,LOW);  }  delay(1000);  wdt_enable (WDTO_1S);}void loop(){  wdt_reset (); //wathdog !  ReadButtons();   raid(currentButton);  }void raid(int mod_functionare){  switch(mod_functionare){  case 1: //ALARMA LA DEZASTRE    for (int i=0; i<5;i++){      digitalWrite(outputPin,HIGH);	      myDelay((16*1000));      digitalWrite(outputPin,LOW);	      myDelay((10*1000));    }    currentButton = 0;    break;  case 2:	//PREALARMA AERIANA    for (int i=0; i<3;i++){      digitalWrite(outputPin,HIGH);	      myDelay((32*1000));      digitalWrite(outputPin,LOW);	      myDelay((12*1000));    }    currentButton = 0;     break;  case 3: //ALARMA AERIANA    for (int i=0; i<15;i++){      digitalWrite(outputPin,HIGH);	      myDelay((4*1000));      digitalWrite(outputPin,LOW);	      myDelay((4*1000));    }    currentButton = 0;      break;  case 4: // INCETARE ALARMA    digitalWrite(outputPin,HIGH);	    myDelay(120000L);    digitalWrite(outputPin,LOW);    currentButton = 0;       break;   } //end switch}int ReadButtons() {  if (currentButton != 0) {        return currentButton;  }  int r, sw = 0;  int t = 125;  for (int i=1; i<5;i++) {    digitalWrite(i,LOW);    sw = digitalRead(i);    if (sw == HIGH) {      sw = i;       delay(1);      goto fw;      break;    }  }fw:   switch(sw) {  case 1:    delay(t);    r=digitalRead(sw);    if (r == 1) currentButton = sw;    break;  case 2:    delay(t);    r=digitalRead(sw);    if (r == 1) currentButton = sw;		    break;  case 3:    delay(t);    r=digitalRead(sw);    if (r == 1) currentButton = sw;	    break;  case 4:    delay(t);    r=digitalRead(sw);    if (r == 1) currentButton = sw;	    break;		  } //end.sw  return currentButton;}void LedStatus(){  if (currentButton == 0) return;  if ((cMs-lastBlink) > 250UL) {    stLed = !stLed;    if (stLed == LOW)	{      for (int i=1; i<5;i++) {        digitalWrite(i,LOW);         }    }    digitalWrite(currentButton,stLed);    lastBlink = cMs;  }}void myDelay(long milis){  for (long i=0; i<milis; i++){    wdt_reset ();    delay(1);    cMs = millis();    LedStatus();   }}

alarma.hex

alarma.hex.zip

Editat de Vizitator
Link spre comentariu

mulțumesc de completare.da,corect. in teorie. in practica insa nu am idee de ce, dar sarea de "break". am testat codul pe un attiny, face exact ce trebuie, recomand sa ramana exact cum e.ceva legat de instrucțiunea GOto, ai înțeles tu ceva, dar se refera mai mult la C in software pentru calculator de exemplu unde programatorul are nevoie sa faca un debug, fiind imposibil de urmarit fluxul. ori in cazul unui avr.. nu poti face debug.

Editat de Vizitator
Link spre comentariu

@Aw Genetix: Daca iti sarea de break, ori ai gresit tu ceva, ori e compilatorul busit. Eu as miza pe prima varianta.

Legat de goto, nu este vorba de debug, ci de usurinta urmaririi codului la citit, cat si posibilitatea de a aparea niste erori mai greu de detectat pt compilator, cum ar fi folosirea de variabile neinitializate.

Debug (cred ca te referi la debug live) se poate face pe orice Atmel, chiar si Attiny, dar iti trebuie hardware. Intereseaza-te de JTAG si debugWire ;)

Editat de keenox
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