Sari la conținut
ELFORUM - Forumul electronistilor

ATtiny24 si PWM


nickrvl

Postări Recomandate

Vreau sa misc un motor, PWM, cu ajutorul unui ATtiny24, problema e ca nu m-am jucat nici odata cu pwm-ul dintr-un Mcu, deci nu stiu cum se aplica, ceva ceva am mai incercat dar e nesemnificativ. Am o mica placa de dezvoltare la care e atasat un lcd(provizoriu) doua butoane si un potentiometru, rotind acel potentiometru sa pot regla factorul de umplere si doar cind apas unul din butoane sa am la un pin PWM. Ca sa fie si mai clar, potentiometrul e legat la PA6 (ADC6), butonul e la PB3 si un led deocamdata "clipoceste" la PB2, adica aici doresc pwm. Schema la placa cam asta ar fi:[attachment=0]pda.pdf[/attachment]Deocamdata doar pwm-ul acela m-ar interesa, sa pot sa-l reglez......Acum lucrez cu oscilator intern, 8Mhz, dupa ce reusesc sa-l misc probabil ca o sa-i pun unul extern, ce frecventa pot scoate la 8 MHz?

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

Top autori în acest subiect

  • nickrvl

    11

  • mitescu

    1

in exemplul de mai jos initializarile sunt :

ADCD-ul cu referinta interna 1,1V ( trebuie modificata rezistenta de 10K care este inseriata cu pot.), frecventa de 250khz. se utilizeaza numai 8 biti.(msb)

PWM-ul este la timer0 care are clock-ul de 1Mhz

 

In bucla valoarea citita de la potentiometru este swcoasa la pwm, acesta urmarind valoarea.

 

#include <tiny24.h>#include <delay.h>unsigned char read_adc(unsigned char adc_input){ADMUX=adc_input | 0xC0;delay_us(10);ADCSRA|=0x40;while ((ADCSRA & 0x10)==0);ADCSRA|=0x10;return ADCH;}void main{PORTB=0x00;DDRB=0x04;TCCR0A=0x81;TCCR0B=0x02;DIDR0=0x40;ADMUX=0xC0;ADCSRA=0x85;ADCSRB&=0x7F;ADCSRB|=0x10;  while (1)      {      OCR0A=read_adc(6);      };}
Link spre comentariu

:sparge: Am uitat sa specific, ma pricep doar in bascom, multumesc oricum ....

Pina acum cel mai bun rezultat l-am obtinut cu asta, "babeste" desigur:

 

$regfile = "ATtiny24.dat"$crystal = 8000000Config Portb.2 = 1Config Portb.0 = 1Dim A As WordDim Aa As WordDim B As WordDim Bb As WordDim X As WordDim Y As WordA = 0B = 0Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADCStart AdcDoBb = 1000 / 7Aa = Getadc(6)Aa = Aa / 7Bb = Bb - AaDoIncr APortb.2 = 1Portb.0 = 1Waitus 1Loop Until A => AaA = 0DoIncr BPortb.2 = 0Portb.0 = 0Waitus 1Loop Until B => Bb B = 0Loop'924End
Cu tentativa asta de program am pwm cu factor de umplere de 0 (aproape) pina la 80% (cred) si o frecventa de 914 Hz ,de asemenea cred, pentru ca nu am frecventmetru, am unul facut de mine dar nu-l am calibrat.

Ca si frecventa m-ar multumi maxim 80KHz.

Potentiometrul, RV1, l-am pus de 100k.

Mai jos poze cu oscilscopul si un led, cel galben, care se aprinde in "ritm" cu pwm-ul.

[attachment=3]DSC02963.JPG[/attachment]

[attachment=2]DSC02964.JPG[/attachment]

[attachment=1]DSC02965.JPG[/attachment]

[attachment=0]DSC02966.JPG[/attachment]

 

 

Printre altele, pe net am gasit si urmatorul exepmlu :

Dim A As WordDim B As WordConfig Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 8Config Pinb.2 = OutputDoFor A = 255 To 0 Step -1Pwm1a = AWaitms 100NextFor A = 0 To 255Pwm1a = A'Waitms 100NextLoopEnd

insa la mine nu vrea....

Link spre comentariu

Am reusit ceva ceva, cu asta obtin pwm cu factor de umplere 50% la 160Khz, acum sa vedem cum il fac reglabil.

$regfile = "ATtiny24.dat"$crystal = 8000000  Dim Dummy As Integer  Dim Potvalue As Integer  Dim A As Word  Config Pinb.1 = Output  Config Pinb.0 = Output'Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADC'Start AdcConfig Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1Start Timer1Pwm1a = 100Pwm1b = 200DoIf Pwm1a = 100 Then Portb.2 = 1 Portb.0 = 1 End IfIf Pwm1b = 200 Then Portb.2 = 0 Portb.0 = 0 End If  Loop  End
Link spre comentariu

Acum nu mai pot accesa ADC-ul, am pwm insa daca vreau sa citesc valoarea lui ADC(6) si sa o afisez pe lcd o ia razna, nici pe lcd nu-mi apare ceva, doar caractere care defileaza haotic, si nici nu ia o valoare oarecare, am testat pe osciloscop.

$regfile = "ATtiny24.dat"$crystal = 8000000  Dim Dummy As Integer  Dim Potvalue As Integer  Dim A As Word  Dim B As Word  Config Pinb.1 = Output  Config Pinb.0 = Output  Config Porta.6 = InputConfig Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , Rs = Porta.5 , E = Porta.4Config Lcd = 16 * 2Cursor OffClsConfig Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 64Pwm1a = 100Pwm1b = 200Config Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADCStart AdcDoA = Getadc(6)Cls  Locate 1 , 1  Lcd A ; "   "  'Waitms 100If Pwm1a = 100 Then Portb.2 = 1 Portb.0 = 1 End IfIf Pwm1b = 200 Then Portb.2 = 0 Portb.0 = 0 End If  Loop  End
Link spre comentariu

Acum merge si ADC si PWM in buna pace si intelegere....

Deocamdata acesta e codul si functioneaza, cu buton start si afisare adc pe lcd, sa vad mai departe cum fac...

 

Totusi am ceva necunoscute, acest "Ocr0a" e responsabil cu out pwm pe oricare port care e configurat pe out? adica daca cofigurez tot portul b pe out o sa am pwm la toti pinii b?

 

$regfile = "ATtiny24.dat"$crystal = 8000000Config Pinb.2 = Input                                       'out pwm, initial e pe input..Config Pinb.0 = Input                                       'start/stopConfig Pinb.1 = InputPortb.0 = 1Portb.1 = 1Config Porta.6 = InputConfig Timer0 = Pwm , Pwn = 8 , Compare A Pwm = Clear Up , Prescale = 8Enable Timer0Enable InterruptsConfig Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , Rs = Porta.5 , E = Porta.4Config Lcd = 16 * 2Cursor OffClsConfig Adc = Single , Prescaler = Auto , Reference = Avcc   'config ADCStart AdcDim C As WordDim B As WordDim D As WordDim Z As LongDim Salt As ByteSalt = 0DoB = Getadc(6)Locate 1 , 1Lcd B ; "  "B = B / 4D = BLocate 2 , 1Lcd D ; "   "If Pinb.0 = 0 Then   Locate 1 , 6   Lcd "START  "   B = Getadc(6)   Locate 1 , 1   Lcd B ; "  "   B = B / 4   D = B   Locate 2 , 1   Lcd D ; "  "   Ocr0a = D   Config Portb.2 = OutputEnd IfIf Pinb.0 = 1 Then   Locate 1 , 6   Lcd "STOP   "   Config Portb.2 = InputEnd IfLoop
Link spre comentariu

Pot sa dezactivez cumva reset-ul care este Pinb.3 la acest attiny24? vreau sa folosesc pinb.3 ca iesire, insa oricum l-asi configura atunci cind leg un led la acest pin reseteaza MCU.

Link spre comentariu

Pot sa dezactivez cumva reset-ul care este Pinb.3 la acest attiny24? vreau sa folosesc pinb.3 ca iesire, insa oricum l-asi configura atunci cind leg un led la acest pin reseteaza MCU.

Gresesc eu pe undeva? cumva acel pb3 trebuie sa poata fi folosit. Nu e indeajuns sa-l setez astfel "CONFIG PORTB.3 = OUTPUT/INPUT" si astfel sa am acces la el? cum am mai zis are efect doar resetul.....
Link spre comentariu

...Nu e indeajuns sa-l setez astfel "CONFIG PORTB.3 = OUTPUT/INPUT" si astfel sa am acces la el?

Nu e suficient. Daca vrei sa folosesti pinul de RESET la altceva decat RESET atunci trebuie sa umbli la fusebits. Asta se face cu ajutorul programatorului, nu din limbajul de programare. Din fabrica setarile sunt ca pinul respectiv sa aiba functia de Reset.

 

E bine ca atunci cand ceva nu iti iese sa cauti si in manual. Uite ce zice aici:

http://www.atmel.com/dyn/resources/prod ... oc8006.pdf

chiar la pagina 2:

To use pin PB3 as an I/O pin, instead of RESET pin, program (‘0’) RSTDISBL fuse.

Adica trebuie sa-l faci zero pe RSTDISBL (ReSeT DISaBLe) sau, sa programezi RSTDISBL, cum se mai spune. Din fabrica setarile sunt ca pinul respectiv sa aiba functia de Reset, adica RSTDISBL fuse este 1. Schimbarea lui RSTDISBL sau al oricarui alt fuse(bit) se face cu ajutorul programatorului, nu din limbajul de programare.

 

!!! Atentie, daca dezactivezi resetul nu mai poti sterge, citi sau reprograma MCU-ul decat cu un HIGH VOLTAGE PROGRAMMER. Daca nu ai asa ceva lasa pinul RESET sa fie reset, altfel iti tai singur craca de sub picioare. MCU-ul are nevoie de pinul RESET pentru a comunica cu programatorul.

Link spre comentariu

Nu e suficient. Daca vrei sa folosesti pinul de RESET la altceva decat RESET atunci trebuie sa umbli la fusebits. Asta se face cu ajutorul programatorului, nu din limbajul de programare. Din fabrica setarile sunt ca pinul respectiv sa aiba functia de Reset.

 

E bine ca atunci cand ceva nu iti iese sa cauti si in manual. Uite ce zice aici:

http://www.atmel.com/dyn/resources/prod ... oc8006.pdf

chiar la pagina 2:

To use pin PB3 as an I/O pin, instead of RESET pin, program (‘0’) RSTDISBL fuse.

Adica trebuie sa-l faci zero pe RSTDISBL (ReSeT DISaBLe) sau, sa programezi RSTDISBL, cum se mai spune. Din fabrica setarile sunt ca pinul respectiv sa aiba functia de Reset, adica RSTDISBL fuse este 1. Schimbarea lui RSTDISBL sau al oricarui alt fuse(bit) se face cu ajutorul programatorului, nu din limbajul de programare.

 

!!! Atentie, daca dezactivezi resetul nu mai poti sterge, citi sau reprograma MCU-ul decat cu un HIGH VOLTAGE PROGRAMMER. Daca nu ai asa ceva lasa pinul RESET sa fie reset, altfel iti tai singur craca de sub picioare. MCU-ul are nevoie de pinul RESET pentru a comunica cu programatorul.

Multumesc frumos pentru lamuriri, sint "primite" si reprosurile...asta e, daca nu ma prea pricep cer lamuriri, oricum, nu ca ar conta insa m-am uitat si in datasheet am vazut si acea rubrica insa se vede ce am priceput, o fi engleza mea de vina... nu stiu, multumesc inca o data oricum. Decind cu atmega8 (in sensul ca nu se mai fabrica) voiam sa testez si alt MC-uri relativ ieftine si sa faca si multe, ma gindeam la aplicatii gen voltmetre la care mai aveam nevoie de pini si de aici intrebarea cu pinul de reset...

Pentru aplicatia de mai sus m-am descurcat "onorabil" fara acel pin, asta in prima varianta a aplicatiei, ramine de vazut in celelalte...

Acum lamureste-ma si cu acel "HIGH VOLTAGE PROGRAMMER", se poate si programa cu el sau e folosit doar la deblocat, se poate face asa ceva sau mai bine se cumpara...

Link spre comentariu

Nu e repros, e recomandare. Altfel iti scriam doar "RTFM!" :limb: si nu mai explicam nimic. High Voltage Programmer se poate folosi si la deblocari si la programari, depinde de model. Poti sa-ti faci sau sa-ti cumperi, dupa cum preferi. Mai sunt numite si Parallel Programmer. Vezi ca daca programatorul tau foloseste portul paralel (LPT-ul sau portul de imprimanta) din calculator nu inseamna neaparat ca ai un programator paralel. Parallel Programmer inseamna ca atunci cand programatorul vorbeste cu MCU-ul o face (in paralel) pe mai multe sarme deodata, nu doar serial cum se face la programatoarele care folosesc doar CLK/MOSI/MISO/RESET/GND.Acum, ca sa intelegi cum se varsa softul scris de tine din PC in MCU.Lucrurile se intampla cam asa: mai intai se alimenteaza MCU-ul, nu? Dar daca alimentezi un MCU atunci el incepe sa ruleze ce program o avea deja in burta lui. Pai, daca ruleaza inseamna ca nu are nici timp nici chef sa vorbeasca cu programatorul. Ca sa iasa din situatia asta programatorul trebuie sa il intrerupa cumva din executie pe MCU. Si atunci ce face programatorul? Ii da un Reset MCU-ului (folosind bineinteles pinul de Reset) ca sa il opreasca din executie si sa poata incepe sa vorbeasca cu el. Pana aici toate bune si frumoase, dar ce ne facem daca pinul RESET nu mai exista pentru ca noi tocmai l-am transformat zilele trecute intr-un pin general de I/O (intrare/iesire).In cazul asta programatorul aplica o tensine de 12 V pe fostul pin de Reset. Astfel MCU-ul stie ca programatorul vrea sa vorbeasca cu el si se opreste din ce executa. Desi 12 V e mult mai mare decat tensiunea maxima de alimentare a MCU-ului totusi el nu se arde pentru ca asa a fost gandit. Nu se pune tot MCU-ul la 12V, doar pinul de RESET, care e singurul pin construit sa reziste pana la 13V.In concluzie High Voltage Programmer inseamna un programator care aplica 12V pe pinul (sau fostul pin) RESET.

Link spre comentariu

High Voltage Programmer se poate folosi si la deblocari si la programari, depinde de model....

Mai mult decit suficienta explicatia, in cazul meu, cu programator ISP, ar trebui sa ma asigur ca softul e in regula si abea in ultima instanta sa dezactivez reset-ul, deocamdata nu e cazul dar e bine de stiut.Mai departe o captura din Bascom cu setare fusebits si unde cred eu ca trebuie "umblat" pentru dezactivat reset, default e "1=External reset enable"[attachment=0]reset.jpg[/attachment]Cumva acel High Voltage Programmer "vede" si Mcu-rile blocate de noi din greseala cu programator ISP?Si de asemenea High Voltage Programmer nu cred ca e vazut de Bascom....Foloseste cineva High Voltage Programmer? ceva detalii/poze pentru a-mi face o idee?Informatii de acest gen sint aur pentru incepatori ca mine si nu numai.
Link spre comentariu
...ar trebui sa ma asigur ca softul e in regula si abea in ultima instanta sa dezactivez reset-ul, deocamdata nu e cazul dar e bine de stiut.

Mai departe o captura din Bascom cu setare fusebits si unde cred eu ca trebuie "umblat" pentru dezactivat reset, default e "1=External reset enable"

Ai inteles foarte bine.

 

Cumva acel High Voltage Programmer "vede" si Mcu-rile blocate de noi din greseala cu programator ISP?
Depinde de programator, de MCU si de modul in care a fost blocat. De obicei da.

 

Referitor la modurile in care se poate bloca un MCU, dezactivarea reset-ului este doar una dintre ele, mai exista si altele cum ar fi de exemplu sa setezi gresit optiunile pentru oscilatorul MCU-ului. Daca lasi MCU-ul fara oscilator atunci nu mai functioneaza nici interfata ISP.

 

Si de asemenea High Voltage Programmer nu cred ca e vazut de Bascom....
STK500 e un programator care poate programa si in modul high voltage. STK500 e vazut de BASCOM.

Uite ce zice manualul lui STK500 despre programarea in modul high voltage la pagina 21 din fisier:

http://www.atmel.com/dyn/resources/prod ... oc1925.pdf

Am scris eu neclar in postul anterior, programarea in modul high voltage nu inseamna neaparat programare in mod paralel. La MCU-urile cu 8 pini se foloseste 12V la reset si programarea se face serial, nu paralel.

 

Vad in captura ca folosesti un programator compatibil STK. De fapt ce programator ai?

Link spre comentariu

....Vad in captura ca folosesti un programator compatibil STK. De fapt ce programator ai?

Acesta:[attachment=0]prog.pdf[/attachment]Mai inainte am avut unul simplu, acela doar cu rezistente, care a mers binisor pina cind am avut de programat un attiny2313 pentru un frecventmetru care avea un cuartz de 20Mhz, pina mi-a-si da seama ca e de vina programatorul si de aia nu pot programa am blocat vre-o 5 attiny parca. Cu acesta nu numai ca mi-a mers din prima dar i-si face treaba cu brio mai departe, acum insa parca m-ar bate gindul la acel "High Voltage Programmer",sa nu mai am grija blocarii din cauza setarii frecventei gresit, macar...Insa am gasit ceva, daca merge ce zice acolo sa fie oare "sfintul gral" al deblocarii MCU-rilor?http://diy.elektroda.eu/atmega-fusebit-doctor-hvpp/
Link spre comentariu
  • 1 lună mai târziu...
Vizitator Metalshrine

Raspuns la o intrebare anterioara: PWM iese doar pe pinul OC1 sau 2 sau 3 sau...output. Acela este oglinda Output Compare Register, adica un registru de comparatie intre timer/counter si o valoare data din soft sau citita din hard. Cand cele 2 valori devin egale, pinul OC isi schimba starea in cea opusa. Deci nu poti scoate PWM pe orice pin doresti.Sfat pentru mai mult incepatori (printre care si eu): cititi cu atentie datasheetul ca acolo se explica absolut totul. Mai putin fineturile, dar alea se pot invata pe parcurs.

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