Sari la conținut
ELFORUM - Forumul electronistilor

Transfer date intre doua Mc-uri


nickrvl

Postări Recomandate

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"post-9441-139829542037_thumb.jpgSau alta idee.....?

Link spre comentariu
  • Răspunsuri 22
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nickrvl

    6

  • script22

    3

  • godFather89

    3

  • matache

    3

Top autori în acest subiect

Imagini postate

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

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

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

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

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

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

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:post-9441-139829542731_thumb.jpgAcum am alta problema, daca pun o sarcina la iesire nu stabilizeaza, sa vedem ce o mai fi.....

Link spre comentariu

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

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