Jump to content
ELFORUM - Forumul electronistilor

Frecventiometru cu atmega8 cod bascom!


Recommended Posts

  • Replies 17
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Si ce nu stii sa faci? In principiu trebuie sa citesti despre timere, moduri de lucru, configurarea lor, adaptarea nivelului semnalului pe care vrei sa-l masori. Foarte importanta este si forma semnalului pe care vrei sa il masori.+interfata cu LCD-ul+metoda de intrare (butoane?)

Link to comment

Pai nu stiu sa configurez portul respectiv, nu stiu portul care se foloseste!Este vorba de o bobina ca prin fata iei trece un magnet, provoaca un inpuls care il citesc sub forma de Hz. Bobina respectiva va da multe impulsuri de la 1kHz pana la 15khz, iar forma semnalului nu o stiu si nici nu am cum sa aflu deoarece nu am osciloscop! Acea bobina se comporta la fel ca un senzor inductiv, doar ca da un impuls in jur de 2-8V.Mersi de sfta, ma apuc sa scotocesc help-ul bascomului .Stiu sa conectez lcd-ul la atmega, de exemplu pentru citire unei tensiuni folosesc ADC,stiu sa fac asta, dar pentru a citi frecventa ce port trebuie sa folosesc? din punctul meu de vedere nu am cum sa folosesc portul ADC, acum nu stiu exact daca chiar nu merge!In jurul timerelor mam gandit si eu ca se incadreaza dar nu eram sigur, nu am folosit niciodata timerele, o sa rascolesc sa vad ce si cum, si cu ce ma mai ajuti si tu , sper ca se rezolva treaba!Bobina citeste rotatiile pe minut al unui ax, iar eu vreau sa le afisez, tinand cont ca la 1000rpm am 16.6 impulsuri pe secunda, adik 16,6hz.Ce ma intereseaza pe mine este comanda ca sa citesc portul respectiv si ce port trebuie sa folosesc, ca de afisa valoarea ma descurc eu, dar totusi un exemplu ar fi bine venit!

Link to comment

Exista mai multe metode de abordare. Dintre care doua:-Fie folosesti un pin I/O care dispune de intrerupere hardware (vezi INT0, INT1, INTx), setezi intreruperea la un front care il vrei tu (crescator/coborator) iar in intrerupere incrementezi un contor. Intr-o intrerupere periodica (la o secunda sa zicem, generata de un alt timer) citesti contorul (acesta este frecventa), il afisezi si il setezi pe 0.-Fie folosesti un timer (cel pe 16 biti?), ii setezi sursa de semnal externa (pinul T0, T1, Tx) si setezi la fel un front la care sa se faca numararea. Tot cu o intrerupere periodica (generata de un alt timer) citesti valoarea contorului (TCNTx), il afisezi si il resetezi.Varianta a 2a este mai eleganta.

Link to comment

Mersi de explicatie, dar nu am folosit deloc codurile cu timer, deci nus tiu cum sa creez un timer. De acea am zis sa dai si un exemplu de cod, ca sa stiu dupa ce ma orientez, citesc ce miai explicat tu si urmaresc codul bascom si atunci imi dau seama care si cum se leaga. :jytuiyu

Link to comment

Vechiul meu profesor, bine ai revenit in topicul meu.

Am citit tot topicul care mi lai dat , am cercetat si codul bascom, am facut mici modificari petnru atmega8 am setat pe 8mhz dar se pare ca nu citeste intrarea bine, sau vad ca mai este o comanda care nu situ cum sa o modific, adik asta:

While Ovf0 <= 75                                         'One second loop @ 20 MHz   nop   Wend

Aceasta cred ca trebuie modificata dar nu sunt sigur.

Acesta este tot codul bascom modificat de mine, sa imi ziceti daca am gresit undeva.

Afisajul merge bine, afiseaza 0hz, dar atat!

$regfile = "m8def.dat"$crystal = 8000000Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7Config Lcd = 16 * 2Cursor Off NoblinkClsConfig Pind.4 = Output'Config TimersConfig Timer0 = Timer , Prescale = 1024                     'Loop TimerConfig Timer1 = Counter , Edge = Rising                     'Frequency Counter'Config VariablesDim Temp As LongDim Ovf0 As LongDim Ovf1 As LongDim Freq As LongDim Freq1 As String * 7Dim Freq2 As String * 3Dim Freq3 As String * 4Dim Position As Byte'Config InterruptsEnable InterruptsEnable Timer0                                               'Timer interruptOn Timer0 Incr_ovf0                                         'Overflow RoutineEnable Timer1                                               'Counter interrruptOn Timer1 Incr_ovfl                                         'Overflow routine'MainClsUpperline                                                   'Clear LCD DisplayLcd " nuxieshop.com"LowerlineLcd "   Fun Count"Cursor OffWait 2'LoopDo   Portd.4 = 0                                              'LED On   Timer0 = 0                                               'Reset counts   Counter1 = 0   Ovf0 = 0                                                 'Reset overflows   Ovf1 = 0   While Ovf0 <= 75                                         'One second loop @ 20 MHz   nop   Wend   Waitus 3900   Portd.4 = 1                                              'LED Off   Disable Timer0                                           'Stop Timers   Disable Timer1   Temp = Ovf1 * 65536                                      'Calc frequency   Freq = Temp + Counter1   Cls                                                      'Clear display   Locate 1 , 1   Freq1 = Str(freq)   Select Case Freq                                         'Choose Frequency Range   Case Is >= 1000000 : Goto Mhz   Case Is >= 100000 : Goto Khzxxx   Case Is >= 10000 : Goto Khzxx   Case Is > 1000 : Goto Khzx   End Select'1-999 Hz   Position = 7 - Len(freq1)   Locate 1 , Position   Lcd Freq ; " Hz"   Goto OutputdisplayMhz:   Freq2 = Left(freq1 , 1)   Freq3 = Mid(freq1 , 2 , 4)   Lcd Freq2 ; "." ; Freq3 ; " MHz"   Goto OutputdisplayKhzxxx:   Freq2 = Left(freq1 , 3)   Freq3 = Mid(freq1 , 4 , 2)   Lcd Freq2 ; "." ; Freq3 ; " KHz"   Goto OutputdisplayKhzxx:   Freq2 = Left(freq1 , 2 )   Freq3 = Mid(freq1 , 3 , 3)   Lcd Freq2 ; "." ; Freq3 ; " KHz"   Goto OutputdisplayKhzx:   Freq2 = Left(freq1 , 1 )   Freq3 = Mid(freq1 , 2 , 4)   Lcd " " ; Freq2 ; "." ; Freq3 ; " KHz"   Goto OutputdisplayOutputdisplay:Locate 2 , 1                                                'Setup LCD cursor   Cursor Off                                                         'Restart timers   Enable Timer0   Enable Timer1Loop'Interrupt routines'*****************************************Incr_ovfl:   Incr Ovf1   Return'*****************************************Incr_ovf0:   Incr Ovf0   ReturnEnd
Link to comment

Aceasi chestie, ori e proteusul handicapat, ori gresesc eu ceva.

Nu afiseaza nimik, generatorul este setat pe 5v la 100hz.

Codul si simularea!

$regfile = "m8def.dat"$crystal = 8000000Config Lcdpin = Pin , Rs = Portb.2 , E = Portb.3 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7Config Lcd = 16 * 2Cursor Off NoblinkCls'-----------Config Timer1 = Counter , Edge = RisingDdrd.5 = 0Portd.5 = 1'-------Config Timer0 = Timer , Prescale = 1024'---------------Enable Timer1Enable Timer0Enable Interrupts'---------------------On Ovf1 Pulse_counterOn Ovf0 Displays'-------------------Dim A As Long , B As Byte , I As LongB = 0'----------------------------ClsLocate 1 , 1Lcd "Frequency meter"Locate 2 , 1Lcd "avrprojects.info"Wait 5Cls'-----------------------Start Timer0'------------DoLoopEnd                                                         'end program'--------------Displays:Incr IIf I > 30 ThenStop Timer0ClsHomeA = B * 65536A = A + Counter1Lcd "Frequency:"Locate 2 , 1Lcd A ; " HZ"B = 0I = 0Counter1 = 0Start Timer0End IfReturn'----------------------Pulse_counter:Incr BCounter1 = 0Return

post-15533-139829285897_thumb.jpg

Link to comment

Aceasi chestie, ori e proteusul handicapat, ori gresesc eu ceva.Nu afiseaza nimik, generatorul este setat pe 5v la 100hz....

Eu zic sa nu te mai bazezi atit de tare pe Proteus, fa-ti o placa de proba si "joaca-te" acolo...LE, din graba am pus exemplu cu Atmega32, totusi ar trebui sa mearga, nu-mi dau seama din imagine, la T1(PD5) de la atmega 8 generatorul de functii e legat prin rezistenta?Incearca in Proteus si cu Atmega32, vezi daca merge.
Link to comment

O sa fac si simulari exact cum este pe site sa vad daca este de vina proteusul!Mersi inca o data de ajutor!L.E. Am facut simulari si cu schema originala si hexul original nemodificat, si intradevar este de la proteus, dar schimband sursa de semnal am obtinut ceva dar decalat rau, am folosit DIGITAL CLOCK la frecventa de 100hz, iar pe display imi arata 821hz.Ramane sa fac montajul si sa experimentez in afara foi partea de frecventiometru!Mersi inca o data de ajutor!

Link to comment
  • 3 weeks later...

Am rezolvat cu frencvetiometru, cel putin indica bine in simulare, am modificat codul bascom pentru ce imi trebuie mie, adik doar sa imi afiseze cifrele fara sa scrie in coada HZ sau KHZ...etc!

Acum cea ce stiu este ca foloseste T1 ca intrare, dar vreau sa dublez afisarea si sa folosesc si T0 care va fi conectat la alta sursa de semnal, deci practiv vreau sa fie 2 frecventiometre pe acelasi display, T1 locate 1,1 , T0 locate 2,1.

Dar din cate vad eu in codul mai jos , cred ca este configurat T0 ca timer, sau Timer 0 nu este T0?

Iar atmega 8 are doar doua intrari T0,T1!

Ce solutie as mai avea ca sa afisez doua frecventiometre pe acelasi display folosind T0 si T1?

ASta daca este posibil bineinteles.

Ceva sfaturi va rog!

$regfile = "m8def.dat"$crystal = 8000000Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5Config Lcd = 16 * 2Cursor Off NoblinkCls'Config TimersConfig Timer0 = Timer , Prescale = 1024                     'Loop TimerConfig Timer1 = Counter , Edge = Rising                     'Frequency CounterDim Temp As LongDim Ovf0 As LongDim Ovf1 As LongDim Freq As Long'Config InterruptsEnable InterruptsEnable Timer0                                               'Timer interruptOn Timer0 Incr_ovf0                                         'Overflow RoutineEnable Timer1                                               'Counter interrruptOn Timer1 Incr_ovflClsDo                                                '   Timer0 = 0                                               'Reset counts   Counter1 = 0   Ovf0 = 0                                                 'Reset overflows   Ovf1 = 0   While Ovf0 <= 30                                         'One second loop @ 20 MHz   nop   Wend   Disable Timer0                                           'Stop Timers   Disable Timer1   Temp = Ovf1 * 65536                                      'Calc frequency   Freq = Temp + Counter1   Cls                                                      'Clear display   Locate 1 , 5   Lcd Freq                                                         'Restart timers   Enable Timer0   Enable Timer1LoopIncr_ovfl:   Incr Ovf1   ReturnIncr_ovf0:   Incr Ovf0   ReturnEnd
Va multumesc pentru ajutorul acordat!
Link to comment

Mersi pentru corectare :jytuiyu , vad ca la atmega128 am T1,T2,T3, nu as putea sa folosesc T1 =Timer, T2=Counter, T3= counter ?Iar T2 si T3 vor fi intrarile dar sa ma bazez pe aceasi baza de timp? :nas:In datasheet la atmega128 zice ca are 4 timer, dar nul vad pe al 4, eu vad asa PD6,PD7 si PE6, care este al 4? :nas:

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines