|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
elektrolit Član
Pridružen-a: Sre 24 Feb 2021 21:06 Prispevkov: 161 Aktiv.: 4.18 Kraj: Kranj
|
Objavljeno: Tor Feb 20, 2024 10:39 pm Naslov sporočila: ATTINY45 - utripanje LED, pogojno |
|
|
Ž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? |
|
Nazaj na vrh |
|
|
v.j. Član
Pridružen-a: Pet 13 Feb 2015 9:47 Prispevkov: 1338 Aktiv.: 11.95 Kraj: Veldes
|
Objavljeno: Sre Feb 21, 2024 12:21 am Naslov sporočila: |
|
|
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 |
|
|
Proteus Član
Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1787 Aktiv.: 8.01
|
Objavljeno: Sre Feb 21, 2024 3:08 pm Naslov sporočila: |
|
|
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 |
|
|
SimonS Član
Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4592 Aktiv.: 20.59 Kraj: Kobarid
|
Objavljeno: Sre Feb 21, 2024 7:01 pm Naslov sporočila: |
|
|
Namig:
- komperator in ena LED, ki že sama po sebi utripa.
Bolj enostavno ne gre _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
|
elektrolit Član
Pridružen-a: Sre 24 Feb 2021 21:06 Prispevkov: 161 Aktiv.: 4.18 Kraj: Kranj
|
Objavljeno: Sre Feb 21, 2024 11:26 pm Naslov sporočila: |
|
|
Aha, že vidim, sedaj pa bo.
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Čet Feb 22, 2024 2:56 pm Naslov sporočila: |
|
|
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 |
|
|
Brusli Član
Pridružen-a: Tor 24 Nov 2020 12:10 Prispevkov: 144 Aktiv.: 3.46 Kraj: Hrastnik
|
Objavljeno: Čet Feb 22, 2024 3:59 pm Naslov sporočila: |
|
|
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 |
|
|
elektrolit Član
Pridružen-a: Sre 24 Feb 2021 21:06 Prispevkov: 161 Aktiv.: 4.18 Kraj: Kranj
|
Objavljeno: Pon Feb 26, 2024 6:03 pm Naslov sporočila: |
|
|
Hvala za odziv, ampak se mi zdi, da je imel Proteus še najbolj prav.
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Pon Feb 26, 2024 7:15 pm Naslov sporočila: |
|
|
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 |
|
|
elektrolit Član
Pridružen-a: Sre 24 Feb 2021 21:06 Prispevkov: 161 Aktiv.: 4.18 Kraj: Kranj
|
Objavljeno: Pon Feb 26, 2024 9:16 pm Naslov sporočila: |
|
|
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. |
|
Nazaj na vrh |
|
|
Proteus Član
Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1787 Aktiv.: 8.01
|
Objavljeno: Pon Feb 26, 2024 9:35 pm Naslov sporočila: |
|
|
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 |
|
|
elektrolit Član
Pridružen-a: Sre 24 Feb 2021 21:06 Prispevkov: 161 Aktiv.: 4.18 Kraj: Kranj
|
Objavljeno: Pon Feb 26, 2024 10:58 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Tor Feb 27, 2024 2:47 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.96
|
Objavljeno: Tor Feb 27, 2024 2:59 pm Naslov sporočila: |
|
|
Š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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.89 Kraj: Grosuplje
|
Objavljeno: Tor Feb 27, 2024 4:43 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 76 dni
Powered by phpBB © 2001, 2005 phpBB Group
|