www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

ATTINY45 - utripanje LED, pogojno
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
elektrolit
Član
Član



Pridružen-a: Sre 24 Feb 2021 21:06
Prispevkov: 161
Aktiv.: 4.28
Kraj: Kranj

PrispevekObjavljeno: Tor Feb 20, 2024 10:39 pm    Naslov sporočila:  ATTINY45 - utripanje LED, pogojno Odgovori s citatom

Že dolgo časa imam v planu projekt, ki ga kar ne morem in ne morem dokončat. Zmeraj se nekje ustavi...

Želim zgraditi povsem preprosto vezje, ki bi na vhodu merilo napetost in pogojno po določeni napetosti (večje ali enako) vklopilo izhod (utripanje LED).

Izbral sem se vezje ATTINY45.

Ali je kdo pripravljen sodelovati pri zagonu in dokončanju projekta? Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
v.j.
Član
Član



Pridružen-a: Pet 13 Feb 2015 9:47
Prispevkov: 1324
Aktiv.: 11.92
Kraj: Veldes

PrispevekObjavljeno: Sre Feb 21, 2024 12:21 am    Naslov sporočila:   Odgovori s citatom

Ustavilo se je že pri podrobnostih, ki jih nisi predstavil.

Definiraj "določeno napetost"
Definiraj "utripanje LED"

Utripanja LED je "malo morje", lahko si izmisliš več različnih načinov.

Pred leti sem naredil termometer na zelo podoben način z ATtiny45 in DS1820. Termometer je bil namenjen nadzoru temperature za pasterizacijo jabolčnega soka. Kot izhodni signal ni bila LED ampak piezo zvočnik. Piski so bili periodični, en pisk 71°C, 2 piska 72°C, 3piski 73°C, 4 piski 74°C, 5 piskov 75°C, neprekinjen pisk pri 76°C in višje. Poleg števila piskov je bilo treba generirati signal cca 1kHz

Ne vem kakšne so tvoje želje in zahteve, ampak z različnim številom zaporednih utripov, lahko signaliziraš več različnih informacij. Če uporabljaš počasne utripe in hitre utripe, lahko s tem prikažeš desetice in enice, tako da je to lahko ogromno stanj.

Trenutno največ teh mini projektov rešujem z ATtiny13A, pin kompatibilna z več periferije, spomina in funkcijami sta Attiny45 in ATtiny85, mogoče še kakšen, nisem prepričan.

Program boš verjetno pisal v arduino IDE ?

.

_________________
Kontakt na e-mail, za več informacij klikni gumb 'www', na ZS ne odgovarjam!
Ne mi pisat zasebnih sporočil na forumu! NIKOLI ne boste dobili odgovora na ZS !
Če vam moji odgovori niso všeč, nihče vas ne sili, da jih berete! uporabite gumb 'ignore'
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1781
Aktiv.: 8.02

PrispevekObjavljeno: Sre Feb 21, 2024 3:08 pm    Naslov sporočila:   Odgovori s citatom

Za začetek, kje se je zadeva "zaustavila", a sploh znaš napisati kakršenkoli delujoč program, ga prevesti in naložiti na ATTINY45?

Mimogrede, jaz bi raje uporabil ATTINY412, novejši čip, lažje programiranje in še serijski izhod imaš za debagiranje.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4581
Aktiv.: 20.63
Kraj: Kobarid

PrispevekObjavljeno: Sre Feb 21, 2024 7:01 pm    Naslov sporočila:   Odgovori s citatom

Namig:
- komperator in ena LED, ki že sama po sebi utripa.
Bolj enostavno ne gre

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektrolit
Član
Član



Pridružen-a: Sre 24 Feb 2021 21:06
Prispevkov: 161
Aktiv.: 4.28
Kraj: Kranj

PrispevekObjavljeno: Sre Feb 21, 2024 11:26 pm    Naslov sporočila:   Odgovori s citatom

Aha, že vidim, sedaj pa bo. Very Happy

Glede podrobnosti projekta:
S procesorjem bi rad meril napetost akumulatorja in ko bo napetost akumulatorja prenizka, bo v sekundnem intervalu utripala LED.
Rešitve:
- za merjenje napetosti bi uporabil precizen uporovni delilnik, ki bi napetost ustrezno znižal in pripeljal na vhod ADC procesorja
- za utripanje (močnostne) LED bi uporabil tranzistor, ki bi bil povezan na izhodni pin procesorja, sekundni interval bi določil časovnik procesorja (prekinitve)

Sicer imam že izdelano vezje iz LM339 + NE555, ampak mi ni všeč zaradi cele množice dodatnih pasivnih komponent. Poleg tega bi rad točno in enostavno nastavljal prag napetosti (samo z vpisom konstante v program).

Enkrat sem na sejmu dobil razvojni komplet s procesorjem ATtiny104. S programom Atmel Studio je zadeva super delovala, programiral sem v C. Potem sem program poskušal prilagodil za ATtiny45, ampak kar ni in ni delovalo... mogoče sem preveč zakompliciral program z vključevanjem raznih knjižnic, časovnika ipd.

Toliko zaenkrat.
Danes sem na hitro ponovno sestavil program za ATtiny104, sicer zgolj malenkost - pritisk tipke in vklop LED. V naslednjih dneh pretvorim na ATtiny45, potem naprej (na ADC in timer).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Čet Feb 22, 2024 2:56 pm    Naslov sporočila:   Odgovori s citatom

Saj bo... Najprej si odpri njegov datasheet. Poglavje 17, ADC. Najprej preberi, kaj zmore in preglej s katerimi registri boš to nastavljal. Ti so opisani na koncu poglavja

Potem se moraš odločit, kateri pin boš uporabil za merjenje napetosti. Definirati ga moraš kot AD vhod v registru.
Potem se moraš odločiti, kakšen delilnik ti bo ustrezal. v povezavi z izbiro referenčne napetosti. Tudi v enem od registrov.
Nato bo eden pomembnejših podatkov, kakšno točnost potrebuješ. tudi to v registrih nastaviš.
Potem se moraš odločit, ali ti meritev izvaja neprekinjeno, ali jo vsakič sam prožiš s programom. Tudi to nastaviš v registrih.

Potem je pa to že (skoraj) vse. Ko se meritev izvede, po gornjih nastavitvah, jo iz registra prebereš in spraviš v neko najverjetneje int spremenljivko.
izmerjeno vrednost lahko izračunaš po datasheetu, kjer najdeš enačbo.

potem pa z nekim delom programa to ovrednotiš, in če je izven želenih meja, to signaliziraš z LEDico na pinu, ki si ga čisto na začetku programa definiral kot izhod.

Navadno LEDico lahko krmili že sam Tiny, seveda moraš uporabit predupor. Če pa nameravaš uporabit nekaj močnejšega, bo pa treba res uporabit dodaten tranzistor.

Torej, predlagam, da si najprej malo skiciraš vezje, prilepiš tukaj in potem boš dobil tudi točnejše odgovore.

Branko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Brusli
Član
Član



Pridružen-a: Tor 24 Nov 2020 12:10
Prispevkov: 139
Aktiv.: 3.42
Kraj: Hrastnik

PrispevekObjavljeno: Čet Feb 22, 2024 3:59 pm    Naslov sporočila:   Odgovori s citatom

Ti rabiš najprej delilnik napetosti, ki bo vhodno napetost iz 12V znižal na neko razumno vrednost (npr 3.3V ali 5V). Težava pa je, ker ADC na AVR mikrokrmilniku ponavadi zahteva maksimalno impedanco izvora 10kOhm (glej datasheet), zato imaš tukaj dilemo. Če bo upornost tvojega delilnika napetosti dovolj nizka, bo ADC deloval normalno, slaba stran pa bo, da ti bo delilnik konstantno praznil akumulator (ali pa baterijo), saj bo preko njega vedno tekel nek tok (par mA). Na akumulatorju ne vem, če bo to težava, pri manjših baterijah pa seveda je. Če pa uporabiš večjo vrednost upornosti na delilniku (>100kOhm), se ti bo praznjenje bistveno upočasnilo, vendar pa boš imel na ADC-ju dosti večjo napako meritve (saj ADC požre nekaj toka ob meritvi). Zato se ponavadi uporabi delilnik napetosti v rangu mekaj megaohmov, za njem pa se namesti še operacijski ojačevalec (unity-gain), ki potem napaja ADC.

Sicer pa lahko namesto ADC uporabiš tudi komparator, vendar ti bo ta povedal le, če je napetost manjša ali večja od neke vrednosti, ne pa tudi točne meritve. AC-ji imajo ponavadi bolj mile zahteve o impedanci izvora (ponavadi je "leakage current" na AC pinu le 5 nA)

lp.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektrolit
Član
Član



Pridružen-a: Sre 24 Feb 2021 21:06
Prispevkov: 161
Aktiv.: 4.28
Kraj: Kranj

PrispevekObjavljeno: Pon Feb 26, 2024 6:03 pm    Naslov sporočila:   Odgovori s citatom

Hvala za odziv, ampak se mi zdi, da je imel Proteus še najbolj prav. Rolling Eyes

Nikakor mi ne uspe postaviti enega izhoda (PB3) na "1" ali "0". Verjetno sem naredil kakšno povsem začetniško napako... ampak je ne najdem.

Analiza:
- predvidevam, da je vezje OK
- napajalne napetost so OK
- vpis hex datoteke je OK
- ukaze sem si sposodil s spleta, tako da bi morali biti OK

Ali je možno, da mi prevajalnik ne izdela ustrezne hex datoteke?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pon Feb 26, 2024 7:15 pm    Naslov sporočila:   Odgovori s citatom

Citiram: "- ukaze sem si sposodil s spleta, tako da bi morali biti OK "
Dokler malo ne zastopiš programiranja,, spletu ni brezpogojno za verjeti.


Kaj pa če bi C program, ki ga prevedeš v hex, prilepil semkaj?

Glede na to da ti ne gre čista osnova, bo že prvi odgovor po prilepljenju programa rešitev kako spreminjat izhod.... Potem pa počasi naprej.

PS, s temle forumom (in internetom) sem se jaz naučil programiranja iz 0.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
elektrolit
Član
Član



Pridružen-a: Sre 24 Feb 2021 21:06
Prispevkov: 161
Aktiv.: 4.28
Kraj: Kranj

PrispevekObjavljeno: Pon Feb 26, 2024 9:16 pm    Naslov sporočila:   Odgovori s citatom

Program, ki vklopi LED, če je pritisnjena tipka (tipka je povezana na PB3, LED na PB4):

Koda:
#include <avr/io.h>
#define LedPin 4
#define SwitchPin 3
void setup() {
 DDRB &= ~(1<< SwitchPin); //set switchPin as input
 DDRB |= (1<< LedPin); //set ledPin as output
 }
void loop() {
 if (PINB &(1<< SwitchPin)){ //check if switch ON
  PORTB |= (1<< LedPin); //Turn Led ON
  }
 else {
  PORTB &= ~(1<< LedPin); //Turn Led Off
  }
}


Če uporabim primer iz Datasheet-a, lahko postavim izhod PB3 na "1":

Koda:
#include <avr/io.h>
   PORTB = (1<<PB3);
   DDRB = (1<<DDB3);
void main() {
}


Opazil sem, da se takoj po končanem programiranju izhod PB3 sicer postavi na 4 V ampak takoj pade na 0,6 V. Think
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1781
Aktiv.: 8.02

PrispevekObjavljeno: Pon Feb 26, 2024 9:35 pm    Naslov sporočila:   Odgovori s citatom

Z ozirom, da uporabljaš Arduino okolje ti manjka pinMode oz. tako lažje prideš do cilja.
Takole nekako, nisem preverjal na HW.

Koda:
#define LedPin 4
#define SwitchPin 3

void setup() {
  pinMode(SwitchPin, INPUT); // Nastavi SwitchPin kot vhod
  pinMode(LedPin, OUTPUT);   // Nastavi LedPin kot izhod
}

void loop() {
  if (digitalRead(SwitchPin) == HIGH) { // Preveri, če je stikalo vklopljeno
    digitalWrite(LedPin, HIGH);          // Vklopi LED
  } else {
    digitalWrite(LedPin, LOW);           // Izklopi LED
  }
}
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
elektrolit
Član
Član



Pridružen-a: Sre 24 Feb 2021 21:06
Prispevkov: 161
Aktiv.: 4.28
Kraj: Kranj

PrispevekObjavljeno: Pon Feb 26, 2024 10:58 pm    Naslov sporočila:   Odgovori s citatom

Hvala za opombo, Arduino okolje je Arduino okolje in ne C okolje. Bom malo knjigo pregledal, mogoče mi z Arduino okoljem uspe.

Sicer mi ne deluje ArduinoISP način programiranja, bom samo izdelal hex in ga vpisal z drugim programatorjem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Feb 27, 2024 2:47 pm    Naslov sporočila:   Odgovori s citatom

Eno vprašanje glede na kodo...
Ali imaš "switch" vhod vezan proti masi ali proti plusu? (običajno ga vežemo med pin in maso). V glavnem, poskrbeti je treba da ima vhodni pin stikala/tipke definirano stanje, ki ga stikalo po pritisku spremeni.
Nimaš pa vklopljenega internega pullup upora na switch pinu ki definira stanje pina 5V pri NEpritisnjenem stikalu. Že zato sumim v delovanje. No ja, če imaš dodane zunanje pullup/pulldown upore, to ne velja v celoti.

Takole v void setup funkcijo dodaj med obe DDRB definiciji, v drugo vrstico:

PORTB |= (1<<SwitchPin); //vklopi pullup na pinu

In priklopi stikalo med vhodni pin in GND.
Potem pa veš, da je stikalo pritisnjeno, ko je pin na nivoju 0V. In to je treba z if stavkom preveriti.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Feb 27, 2024 2:59 pm    Naslov sporočila:   Odgovori s citatom

Še dodatno,

če imaš direction register DDRx za neki pin postavljen na 0, to pomeni da je ta pin VHOD.
Če na taistem pinu s komando PORTx tega enkrat kasneje postaviš na 1, vklopiš interni pullup vhoda. Vgrajen v mikrokontrolerju. Če je s PORTx ta pin postavljen na 0 (defaultno stanje), tega pullupa ne aktiviraš.

Če je DDRx komanda uporabljena za postavitev nekega pina na 1, pomeni da je ta IZHOD.
In potem s PORTx komando ne tem pinu postavljaš izhod na 1 ali 0.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Tor Feb 27, 2024 4:43 pm    Naslov sporočila:   Odgovori s citatom

elektrolit je napisal/a:
Hvala za opombo, Arduino okolje je Arduino okolje in ne C okolje. Bom malo knjigo pregledal, mogoče mi z Arduino okoljem uspe.......
V katerem okolju je pisan program, ki si ga prilepil?
Proteus ti je napisal program za tvoj trivialen problem, ki je lepo berljiv predvsem pa enostaven.

Kaj pa je Arduino si lahko prebereš tukaj, da ne boš v temo brcal s C okoljem!

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group