nickrvl Postat Decembrie 13, 2012 Partajează Postat Decembrie 13, 2012 Vreau sa transfer "date" intre doua Mc-uri si anume intre un Atmega8 si Attiny13, este posibil? Nu am incercat niciodata asa ceva, cred ca se poate doar I2C insa se pare ca Attyni13 nu are asa ceva, mai este si alta metoda? Respectivele "date" sint de fapt o variabila sau poate doua care va avea valoare de la 0 la 900 (aproximativ), aceasta valoare sa fie trimisa de Atmega8 catre Attiny13. Cu alte cuvinte intentionez sa urmaresc o tensiune pe iesirea unei surse, sursa va debita o tensiune fixa iar un "tranzistor" comandat de Mc va limita iesirea la o anumita valoare cumva in comutatie, inchis/deschis.In urma unor mici teste am reusit asta si sint chiar incintat de rezultate insa intodeauna "exista" o problema, daca Mc-ul face doar asta adica sa urmareasca tensiunea si daca e depasita cu o zecime de volt inchide tranzistorul si il deschide din nou cind e mai mica decit valoarea stabilita e Ok insa daca-l pun sa si afiseze pe un LCD pierde "pasi" (chiar daca frecventa e setata la 8Mhz) si asta se traduce prin cresterea tensiunii sau mai bine zis apar virfuri de tensiuni peste valoarea setata de cel putin 2V asa ca o solutie posibila (cred) ar fi sa pun un Mc (Attyni13) sa se ocupe strict de controlul tensiunii iar Atmega sa faca "restul" dar cum fac sa-i transmit lui Attynii valoarea variabilei....? Am schitat mai jos cea ce "vrea sa fie"Sau alta idee.....? Link spre comentariu
ramsesrr Postat Decembrie 13, 2012 Partajează Postat Decembrie 13, 2012 Nu garantez ca functioneaza dar asta cred ca ar fi o varinata:Generezi 2 PWM uri cu atmega8(2 pt ca tu ai o valoare 0 - 900 cu rezolutie 1 presupun) cu factor de umplere proportional cu valoarea transmisa(cu ajustarile de rigoare).Citesti cu attiny factorul de umplere si reconstruiesti valoarea.Alta varianta schimba micocontrollerul attiny Link spre comentariu
matache Postat Decembrie 13, 2012 Partajează Postat Decembrie 13, 2012 Poti comunica intre attiny13 si atmega8 cu ajutorul interfetei SPI: http://avrbeginners.net/architecture/spi/spi.html Link spre comentariu
script22 Postat Decembrie 13, 2012 Partajează Postat Decembrie 13, 2012 eu zic ca e mai degraba de la lcd decat de la microcontroller 8 mhz ?? fa un calcul cate instructiuni iti face tie pt comanda tensiune si vezi ce mai ramane si ne spui si noua. Link spre comentariu
matache Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Trebuie sa ma corectez. Se pare ca SPI-ul lui Attiny13 nu poate fi folosit decit pentru programare: vezi: http://www.avrfreaks.net/index.php?name ... c&t=127770 Link spre comentariu
stefan_k Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Se poate implementa partea de serial in soft, mai ales ca ai nevoie doar de receptionare. Exemplu: http://www.avrfreaks.net/index.php?name ... c&t=112374 Spre final ai si o bucata de cod, buna ca si punct de pornire. Sau, cauta pe net ceva de genul "bit-bang attiny", sigur mai gasesti exemple. Link spre comentariu
nico_2010 Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Te poti inspira si de aici: http://www.instructables.com/id/I2C_Bus ... nd_ATmega/. Oricum, inteleg faptul ca Atmega8 este "master" si Attiny13 este "slave", ceea ce face ca implementarea comunicatiei I2C prin soft sa fie simpla. Pentru a clarifica problema semnalata in postarea ta ar trebui sa ne spui ce mediu de programare folosesti. Link spre comentariu
godFather89 Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Pentru ceea ce vrei sa faci, mai bine optimizezi softul. Un alt uc nu va rezolva problema (cel putin nu asa, asteptand date de la master).Foloseste intreruperea pentru ADC. In intrerupere doar citesti valoarea si setezi pinul corespunzator (eventual o si memorezi undeva pentru afisare). In "main" faci afisarea. In felul asta o sa ai cel mai bun timp de raspuns, deoarece setarea pinului nu o sa astepte dupa afisarea pe LCD ci o sa o intrerupa. Pe langa asta, mai poti creste si frecventa uC-ului (mega8 merge pana la 16MHz din cate imi amintesc). Link spre comentariu
Vizitator beamrider Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Convertorul analog digital al unui AVR poate esantiona un semnal (o tensiune) cu maxim 15000 esantioane pe secunda. Asta inseamna ca la o frecventa de lucru de 8 MHz, intre fiecare doua esantioane, AVR-ul poate executa 8 000 000 / 15 000 = 533 instructiuni asamblare de 1 tact. Deci ar fi timp destul ca procesorul sa efectueze diverse subrutine in cei 533 tacti.Totusi, trebuie sa recunosc ca programarea devine greoaie, impractica si inflexibila. Link spre comentariu
godFather89 Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Si ca veni vorba. E mult mai rapid sa faci o comparare (pe 10 biti) si setarea bitului de pe port decat sa trimiti o valoare (poate doua) pe o interfata seriala catre un uC slave. Link spre comentariu
godFather89 Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 Convertorul analog digital al unui AVR poate esantiona un semnal (o tensiune) cu maxim 15000 esantioane pe secunda. Asta inseamna ca la o frecventa de lucru de 8 MHz, intre fiecare doua esantioane, AVR-ul poate executa 8 000 000 / 15 000 = 533 instructiuni asamblare de 1 tact. Deci ar fi timp destul ca procesorul sa efectueze diverse subrutine in cei 533 tacti.Totusi, trebuie sa recunosc ca programarea devine greoaie, impractica si inflexibila.Nu e foarte mult. 533 de instructiuni de 1 tact (sunt convins ca sunt si multe branch-uri si alte instructiuni ce dureaza 2-3 tacti) e foarte putin timp daca programul urmeaza un model secvential pentru ca se blocheaza programul des asteptand dupa tot felul de functii. Ca de exemplu trimiterea datelor catre un LCD (care e facuta de obicei cu delay-uri).Cel mai bun mod este folosirea intreruperilor. Astfel instructiunea de compararea si setare a portului se va executa mereu la fiecare valoare citita de ADC (533 tacti e extra suficient pentru asta), si restul programului, cand are timp (cand nu e executata intreruperea).LE: prin model secvential ma refer la:1: citeste ADC2: seteaza port in functie de valoare ADC3: afiseaza pe ecran4: mergi inapoi la 1model cu intreruperi:Int_Adc:1: citeste valoarea2: seteaza port3: memoreaza valoareamain:1: afiseaza valoarea memorata2: mergi la 1Dupa cum observi, Int_Adc se va executa foarte rapid si la fiecare conversie efectuata. Cateva instructiuni (aducere registru in memorie, comparare, scriere in registru (port)). In main, se vor executa operatiile care nu sunt critice. Pana la urma, pe display poti sa faci afisarea o data la 300-500 mSec. Nu ajuta cu nimic sa o faci mai repede. Link spre comentariu
nickrvl Postat Decembrie 14, 2012 Autor Partajează Postat Decembrie 14, 2012 Deocamdata sa fac mici completari, programarea o fac in Bascom (atit cit ma pricep) unde am incercat citeva variante. O sa postez doar o secventa din cod, restul deocamdata nu e concludent.1- In aceasta varianta merge bine, Mc-ul "doar" urmareste valoarea tensiunii din iesire prin ADC care impreuna cu un divizor rezistiv formeaza un Voltmetru. Valoarea tensiuni la iesire se mentine intre 1,6V si 1,7V, nu creste nu scade, semnal urmarit cu osciloscop si alt volmetru. Tensiunea debitata tranzistorului de sursa de alimentare este de 21VDoVoltcontrol = Getadc(0) If Voltcontrol > 17 Then Comtrz = 1 'tensiune maxima 1,7V If Voltcontrol < 16 Then Comtrz = 0 'tensiune minima 1,6VLoopEnd2 - In aceasta varianta merge aproape bine, in bucla "do loop" portul e citit de 100 de cicli (pentru o rezolutie mai buna, incercata la voltmetre) si in a 100-a perioada calculeaza valoarea adc etc etc si afisaza pe LCD, cind trece la calcul/afisare deja pierd controlul tensiuni, creste cu citiva volti, aceasta "intrerupere" este indeajunsa pentru a nu mai avea control asupra tensiunii.DoIncr XVoltcontrol = Getadc(0) 'pentru contol tensiuneVolt = Getadc(0) 'pentru voltmetru If Voltcontrol > 17 Then Comtrz = 1 'tensiune maxima 1,7V If Voltcontrol < 16 Then Comtrz = 0 'tensiune minima 1,6VIf X = 100 ThenVolt = Volt / 100Aratavolt = Str(volt)UpperlineAratavolt = Format(aratavolt , "00.0")Lcd " " ; Aratavolt ; " V "X = 0End IfLoop3 - In a treia varianta am incercat sa nu mai intrerup, am lasat valoarea adc sa fie afisata la fiecare ciclu, se pare ca totusi "simpla" afisare de date pe LCD este inca de indeajuns pentru a destabiliza, tensiunea pe iesire fluctueaza intre 1,6V si aproximativ 3,5VDoVoltcontrol = Getadc(0) 'pentru contol tensiune If Voltcontrol > 17 Then Comtrz = 1 'tensiune maxima 1,7V If Voltcontrol < 16 Then Comtrz = 0 'tensiune minima 1,6VVolt = Getadc(0) 'pentru voltmetruAratavolt = Str(volt)UpperlineAratavolt = Format(aratavolt , "00.0")Lcd " " ; Aratavolt ; " V "LoopUrmeaza sa analizez solutiile voastre.Banuiesc ca o solutie analogica nu stiti sau poate ca nu exista, ceva de genul PCF8591, acesta este un DAC cu comunicare I2C........ Link spre comentariu
Vizitator beamrider Postat Decembrie 14, 2012 Partajează Postat Decembrie 14, 2012 In main, se vor executa operatiile care nu sunt critice.Da, ar merge sa fie folosit doar un Atmega8 care sa execute ca program principal rutina de afisare pe LCD, aceasta urmind a fi intrerupta la fiecare 533 tacti (cifra orientativa) de o subrutina de intrerupere care sa se ocupe de achizitie semnal - generare comanda on/off catre un pin de iesire, eventual chiar si citire tastatura. Link spre comentariu
nickrvl Postat Decembrie 14, 2012 Autor Partajează Postat Decembrie 14, 2012 Am "reusit" o varianta functionala, in care initializarea citirii se face aproape de trecerea prin zero dupa care se intra intr-o bucla do loop unde se asteapta cresterea tensiunii, tocmai dupa ce sa atins pragul tensiunii si se inchide tranzistorul se trece la afisare dupa care se asteapta din nou trecerea prin zero, se pare ca astfel este timp destul si pentru afisare, codul schitat mai jos:DoVoltinit = Getadc(1) If Voltinit < 1 Then Do If Voltcontrol < Tensiunesetata Then Comtrz = 0 Voltcontrol = Getadc(0) If Voltcontrol > Tensiunesetata Then Comtrz = 1 Exit Do End If LoopVoltout = Getadc(0)Aratavolt = Str(voltout)UpperlineAratavolt = Format(aratavolt , "00.0")Lcd " " ; Aratavolt ; " V "LowerlineLcd Voltinit ; " "End IfLoopSchema modificata:Acum am alta problema, daca pun o sarcina la iesire nu stabilizeaza, sa vedem ce o mai fi..... Link spre comentariu
script22 Postat Decembrie 15, 2012 Partajează Postat Decembrie 15, 2012 dc nu incerc o varianta cu r2r , poti merge pana la 8 biti ai 254 valori diferite deci 25.4 v daca stii bine sa faci partea analogica , o sa ai o sursa de succes , eu am sa iti arat un proiect gata facut http://tuxgraphics.org/electronics/200506/article379.shtml da sa stii ca si eu am schitat ceva cod pe hartie pentru bascom cu functii de preseturi cu scrool destul de smecher deci se poate face si in bascom. eu in main loop aveam ceva de genu if tensiune dac.0=portb.0 dac.1=portb.1 dac.2=portb.2 Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum