No pro mě jako, nezkušeného, to nebude ani na týden ani na rok :-D, nemáte aspoň nějaký tutorial jak ten program stvořit ? :-D
Fórum › C / C++
Pomoc s programem C++
tutorialy sou i tady... v sekci elektronika (AVR)...
fast pwm je jeden z rezimu citace... vesmes jen musis nastavit port b na vstupy, zapnout pull upy, nastavit timer 0 na 8b fast pwm rezim, zapnout output compare na tom spravnym pinu (a zapnout ho jako vystup)
a pak v cyklu jednou za cas udelat: OCR0B = PINB
pripadne i tady je pekne popsano:
http://svetelektro.com/clanky/programujeme-avr-v-jazyku-c-5-cast-456.html
Fast PWM Mode str. 68 popis, od str. 73 tabulky co a do kterého registru se zapisuje, asi nejvíc je v Table 40. Asi bych začal nejdřív s PWM generovanou s pevně nastavenou šířkou a pak teprve řešil, jak z portu "nacpat" hodnotu do OCR0B.
hu
#18 Marek
DDRB = 0xFF; // vsechny piny jsou nastaveny jako vystupni...
tobe se bude hodit vic:
DDRB = 0x00; // vse jako vstupy (melo by byt tak jak tak po restartu)
PORTB = 0xFF; // zapnout pull upy na vsech pinech
Teď ještě OC0B. V popisu pinů nebo v kapitole Alternate Port Functions najdeš, kde je. Do příslušného bitu DDRx zapíšeš 1 - tím z něj bude výstup.
hu
asi večer příjdu, možná bude veselo
hu
"závratně" dlouhý....
hu
trochu víc sebevědomí.... to určitě dáš.
hu
"zavratne dlouhy" znamena v tomto pripade cca 10-15 radek, kdyz budes kazde nastaveni registru mit na samostatnem radku a bude tam par prazdnejch radku :)
cca:
#include <avr/io.h>
int main() {
// nastaveni portu B
// nastaveni portu D (hlavne pinu s OC0B - tusim PD5)
// nastaveni rezimu, force output na OC0B, nastartovat citac
while (1) {
...
}
}
a ještě to jde "vyšperkovat" uvedením procesoru do Idle Mode
hu
budu moc rád, když splním zadání tudíž : Na bránu B připojte přípravek se spínači, na bránu D připojte přípravek s LED. Použijte 8bitovou hodnotu nastavenou spínači k nastavení jasu LED, která je připojena na vývod OC0B. Jas bude řízen pomocí střídy generované na vývodu OC0B rychlým PWM generátorem.
Děkuji moc za veškerou pomoc vám oběma :-). Večer na to vlítnu, teď musím letět do posilovny :-) a snad večer něco stvořím. Popřípadě tu večer nechám screen s tím co jsem stvořil, snad se mi to nějak povede dát do kupy. Díky moc
Tak zde tedy zasílám screen co jsem teď cca za 5 min vymyslel :-D.. snad je to dobře a někam to vede... děkuji za odpověď popřípadě další rady :-)
Zadání:
Na bránu B připojte přípravek se spínači, na bránu D připojte přípravek s LED. Použijte 8bitovou hodnotu nastavenou spínači k nastavení jasu LED, která je připojena na vývod OC0B. Jas bude řízen pomocí střídy generované na vývodu OC0B rychlým PWM generátorem.
to OCR0B nastavi jen hodnotu toho PWM (teda nastavilo by, kdyby si nastavil spravnej rezim citace a povolil vystup na ten OC0B pin a hlavne spustil citac...)
proste: jeste to chce nastavit ten port D - mrknes do datasheetu na pinout (na kterem pinu ze to vlastne OC0B ma vystup, pak port D nastavis tak, aby aspon na tom konkretnim pinu mel opravdu vystup) a pak mrknes na Timer 0 a jeho registry... prectes si, co je tam za bity, co ridi a zhodnotis, jestli to potrebujes nebo ne
Lámu si nad tím zadáním hlavu a nad tím co jste mi řek, brouzdám po netu ale netuším jak jinak to nastavit ten čítač.. asi jsem fakt dost hloupý na toto..
Snad je to dobře .. celkem si věřím.. ale chtěl bych slyšet váš názor, protože tomu rozumíte.. :-) Díky, popřípadě nějaká ta rada zase jsem fakt marnej.
#42 Marek
temer.. ale (0 << COM0A1) a podobne je uplne zbytecny.. vyhodi to zase jen nulu...
krom toho je tam i COM0B0/1 a to ridi to OC0B ... force output (FOC0B) neni potreba nijak nulovat (defaultne je to vyresetovany tak jak tak)
takze spis potrebujes neco jako: TCCRA = _BV(COM0B1) | _BV(COM0B0) | _BV(WGM00) | _BV(WGM01); // _BV(x) je alias pro (1 << (x)) + WGM je na nastaveni rezimu
a pak ten citac musis taky nastartovat... a tim OCR0B pak nastavujes stridu signalu od 0 do 255
Takto by to mohlo být?
Takto by to mohlo být nastaveno ten WGM? a ten OCR0A ?
opet: (0 << COM0B0) je naprosto zbytecny.. jen to zneprehlednuje kod..
WGM02 podle me nepotrebujes.. mode 3 je pro tebe vyhodnejsi (tedy pokud nechces menit i periodu signalu - ale v zadani je jen strida, takze TOP=255 bohate staci)
a pak bys nepotreboval ten OCR0A ale stacilo by hodit delay a sem tam precist PINB a nastavit do OCR0B
+ ISR ceka blok tj, { ... } a tak jak tak je to tam zbytecny + je zbytecny zapinat preruseni
Snad jsem to tedy pochopil správně .. ale nejsem si jist stím ISR (TIMER0_compa_vect) co tam bude obsahovat atd..
#50 Marek
ma, uz je to skoro cely...
jen by bylo lepsi, kdyby si sem daval text.. tezko se edituje obrazek..
zase ti tam zahadne zmizely nastaveni WGM, ISR vubec nepotrebujes a kdyz ano, tak spis pro preteceni a beztak ho nezapinas jeste jmenovite
/*
* zp_coufal.cpp
*
* Created: 25.4.2014 19:05:18
* Author: Marek Coufal
*/
#define F_CPU 20000000UL
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB = 0x00; //brána B je nastavena jako vstupní
PORTB = 0xFF; //zapnuty pull up rezistory na všech pinech
DDRD = (1 << PD5); //PORTD.5 jako výstup (OC0B)
TCCR0A = (1 << WGM01) | (1 << WGM00);
TCCR0B = (1 << WGM03)
TOP = 255; //tady netuším jak si to myslel tím TOP = 255
_delay_ms(400)
OCR0B = PINB
sei();
while (1)
}
Tady jsem tedy skončil, moc už ani nevím jak dále abych program ukončil nebo spíše co tam ještě tak "chybí".
#53 KIIV
Aháá .. tak v tom mod 3 se tedy dost ztrácím :-D fakt se vám omlouvám za to jak vás otravuji...
TCCR0B = (1 << WGM00 = 0 1 1) takto to asi není správné, že?
WGM00 = 0 1 1 takto by to mohlo být ? nebo by tam mělo být součástí příkazu i TCCR0B
#55 Marek
jestli sem tam nic nepopletl, tak todle by melo byt kompletni:
/*
* zp_coufal.cpp
*
* Created: 25.4.2014 19:05:18
* Author: Marek Coufal
*/
#define F_CPU 20000000UL
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB = 0x00; //brána B je nastavena jako vstupní
PORTB = 0xFF; //zapnuty pull up rezistory na všech pinech
DDRD = (1 << PD5); //PORTD.5 jako výstup (OC0B)
PORTD = 0xFF; // zbytek pinu zustal jako vstupy a nemaji zadne pullupy.,. tak zapnout at to nechyta radio
TCCR0A = _BV(COM0B0) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00); // nastavit mod vystupu na OC0B a MODE 3
TCCR0B = _BV(CS00); // ale mozna se bude hodit nastavit preddelicku na mensi frekvenci nez na 20MHz
while (1) {
OCR0B = PINB; // nacteme vstup portu B a posleme na pwm...
_delay_ms(10); // rychleji to neni treba (a mohlo by to i delat problemy)
}
}
Tak teda moc děkuji za skvělou pomoc :-), moc si toho vážím, ale to ještě není celý program pro toto zadání ne ? :-) Na bránu B připojte přípravek se spínači, na bránu D připojte přípravek s LED. Použijte 8bitovou hodnotu nastavenou spínači k nastavení jasu LED, která je připojena na vývod OC0B. Jas bude řízen pomocí střídy generované na vývodu OC0B rychlým PWM generátorem.
Nebo, že by to bylo tak krátké? Každopádně moc děkuji za ochotu.
Jinak tedy, děkuji moc za vaší ochotu, konečně jsem něco pochytil a jsem rád, že jste mi to neposlal hned na začátku, takto bych nic nového nezjistil :-) Díky moc. Zítra bych chtěl zkusit tento program je skoro stejný akoráť je tam fázově korigovaný PWM režim.
Na bránu B připojte přípravek se spínači, na bránu D připojte přípravek s LED. Použijte 8bitovou hodnotu nastavenou spínači k nastavení jasu LED, která je připojena na vývod OC0B. Jas bude řízen pomocí střídy generované na vývodu OC0B fázově korigovaným PWM generátorem.
Tak kdybych nevěděl, jestli by jste mi zítra pomohl, dnes už půjdu spát, tak moc děkuji ! :-) Ale tuším, že se tam jen změní ten PWM
Takto by to mohlo fungovat? nebo je to špatně?
#define F_CPU 20000000UL
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRB = 0x00; //brána B je nastavena jako vstupní
PORTB = 0xFF; //zapnuty pull up rezistory na všech pinech
DDRD = (1 << PD5); //PORTD.5 jako výstup (OC0B)
PORTD = 0xFF; //
TCCR0A = (1 << COM0A1) | (1 << WGM00); // nastavit mod vystupu na OC0B a MODE 1
TCCR0B = (1 << CS01); // nastratování PWM
WGM2:0 = 1, and OCR0A when WGM2:0 = 5.
while (1) {
OCR0B = PINB; // nacteme vstup portu B a posleme na pwm...
_delay_ms(10); //
}
}
Atmel Studio je zdarma, stačí se registrovat. Akorát ti Atmel nepošle registrační mail na seznam, centrun... apod.
hu
Atmel studio mám stáhlé :-) .. jen sem to myslel to vyzkoušení jako, jestli to funguje tak, že ty diody se mění (jas) podle toho režimu :-) v progrmau mi to napsalo, že je to bez chyby, takže by to asi mělo jet ne ? :-)
Tak si to v simulátoru odzkoušej.
hu
Odkrokovat na simulátoru v Atmel Studiu a sledovat stavy portů a obsah registrů.
hu
#73 Marek
a proc? ciste hotovy ti to nikdo nedal, takze i kdyby na to prisel, da se to jeste zvladnout obhajit... aspon je videt snaha a mozna ses i neco naucil - treba trosku lip cist ten datasheet
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Pomoc s programem — založil Jarda
Pomoc s programem — založil Pepuna
Pomoc s programem — založil Zugi
Pomoc s programem ... — založil Bublina
Pomoc s programem — založil Janička
Moderátoři diskuze