Prosím o pomoc s programem v Jazyce C. Psaný v programu AVR studio 4 pro mikrokontroler attiny 2313.
Zadání programu:
Budu všem moc vděčný kdo by mi s tímto programem poradil. Jsem totiž v koncích.
Předem děkuji.
tak prvni asi budes muset udelat to pocitani 15sekund... pak obdelnik... to je menit na portu 0 a 255... pak uz akorat sinus... mozna nejaka aproximace... par hodnot a dopocitat neco mezi ...
na to staci pole par hodnot... treba pro 0-90 stupnu s krokem po 10 stupnich ... kdy se bude predpokladat ze neco mezi je na primce - samozrejme hodnoty od 0 do 127 ... takze napriklad 0=0 10=22 20=43 30=64 40=82 50=97 60=110 70=119 80=125 90=127
a kdyz chces pak hodnotu pro 6stupnu tak vis ze to bude v 6/10 mezi 0 a 22 => cca 13 (a vypocet: sin(pi*6/180)*127 = 13,27511483499199086778) stejne o vetsinu presnosti prijdes osekavanim ...
a 88 stupnu: 125+2*8/10 => 126 a vypocet dava: 126,92263503142515771079 (proste osekavaci chyba...)
#4 KIIV
Stejně jsem z toho jak se říká jelen. Nevypočítal by jste mi tenhle příklad celý? :) Jak pro sinus tak obdelník? :) Protože tomu vůbec nerozumím. A nebo nenapsal by jste mi rovnou ten program, protože vidím že tomu rozumíte a mě by to strašně pomohlo.
Předem velmi děkuji :).
mozna to nebude s tou aproximaci moc horky... 60khz ti dava priblizne 333 instrukci pro 20MHz krystal... pokud budes delat preruseni tak sezeres 30 instrukci jak nic... a to jeste skoro nic nestihas .. takze budes rad, kdyz zvladnes preruseni aspon na 720kHz tak nebudes delat vesmes nic jinyho (a bude chtit pouzit 12 vzorku - pro uhly 0 30 60 90 .. 300 330) - vic z toho stejne nedostanes
tak udelat neco takovyho:
unsigned char[] hodnoty = {127,}
while (1) {
unsigned int i;
// obdelnik
for ( i=0; i<40000; i++) {
PORTB = 0; // 0V?
_delay_loop_1(100); // tady bude chtit vypocitat podle frekvence oscilatoru -ted cca 16MHz
PORTB = 255; // nastavit spravnou hodnotu - ted asi 5V
_delay_loop_2(300-20); // for cyklus ma taky nejaky zpozdeni takze cca 20instrukci odecteme at je to co nejblize 60kHz
}
//sinus
for ( i=0; i<60000; i++) {
for (char j=0; j<12; j++) {
PORTB=hodnota[j];
_delay_loop_1(10); // hodne hodne od oka
}
}
}
Jojo, no on nám ucitel říkál co si pamatuju že musime vypociat T, pak to N což jsou ty čisla od 0 do 255 a pak z toho vseho nejak vypocitat pocet dílků a ten pocet dílku vydšlit 360 u sinusovek a vyjdou nám časti na ose kde je 360 stupnu co si pamatuju, . Ale to si pamatuju jen tak teoreticky a nevím jak to vypočítat no :)
na to abys dal 60kHz mas zatracene pomalej procesor... uz jen na 12vzorku cely sinusovky (to je kazdejch 30 stupnu) mas pokazdy mezi nima presne 22 cyklu oscilatoru tj maximalne 22 instrukci ( 16000000/(60000*12) )
proste zadna sinusovka se nekona... je to spis takovej stan
Dobrý den přikládám zde program který jsem dnes vytvořil a odzkoušel ve škole. Program na obdélníkový průběh jel bez problémů, ten byl jak jsem zjistil velmi lehký, ale již jsem nedokázal přijit na to jak k tomu přidat sinusový průběh, který se po 15 s změní na ten obdelníkový. Prosím pomohl by jste mi tento program dodělat?
#include <avr/io.h>
//#include <avr/iotn2313.h>
#define F_CPU 20000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/cpufunc.h>
#include <avr/sfr_defs.h>
unsigned char a=0,klav=0,hodnotatl=0;
unsigned char pole [20] = {0x97,0xAD,0xBD,0xC9,0xCD,0xC9,0xBD,0xAD,0x97,0x80,0x68,0x53,0x42,0x37,0x33,0x37,0x42,0x53,0x68,0x80}; //hodnoty sinusového průběhu
void zobraza(unsigned char a) //funkce pro zobrazení na 7seg
{
PORTB = pole[klav]; //vybrání pole podle hodnoty
}
int main(void)
{
DDRB = 255; //smĚr toku dat je nastaven na samých 1 => je jako výstupní
DDRD = 0; //Led diody se zhasnou, jelikož jsou zapsány samé 1
PIND = hodnotatl;
while(1) //nekonečná smyeka pro obdélník
{
PORTB = 0xCD;
_delay_us(12);
PORTB = 128;
_delay_us(4);
/* if (hodnotatl>0)
{
zobraza(klav);
hodnotatl=0;
}*/
}
}
Zde jsou ještě obrázky tabulky vypočítaných hodnot k sinusovému a obdelníkovému průběhu:
sinusový průběh
obdelníkový průběh
Budu velmi vděčný za každou pomoc.
Předem mnohokrát děkuji :)
nacrt sem uz daval.. uz musis akorat bud vedet kolik period si udelal a po mnozstvi dostatecnem na 15sekund prepnout...
nebo na to vyuzit casovac (za cenu ze ti bude delat zpozdeni v prubehu)
EDIT: a 20 hodnot skoro nemas sanci nijak uridit - je to na to prilis pomaly
jedna perioda sinusovky ma byt 1,67 mikrosekundy a kdyz to chces jeste rosekat na 20 casti tak mas 833nanosekund ... a pri 20MHz krystalu trva jedna instrukce 50 nanosekund - mas jen 16instrukci na to, abys vubec neco stihl udelat to muze stacit na vypisovani dat z pole.. ale ne na nejakou kontrolu kde a jak dlouho ses...
+ attiny 1 neexistuje ... jestli je to tiny 13 tak je to mala mrcha a jeste maximalne 10MHz
tiny 2313 uz mas sanci aspon na tech 20MHz
Je to tiny 2313. No prej o jde rikal ucitel. Rikal ze tento program rozpracovanej je dobrej jen potrebuji doresit realizaci te sinusovky a spozdeni... Ale nevim jak . Slo by to tak ze bych zadefinovane hodnoty posilal jednotlive pomoci portb? Ae jak udelat zpozdeni? A to prepnuti na obdelnik? A vsechno by melo byt ve smicce while??
Zasláno z mobilního telefonu.
vubec nevim proc sem pisu pac tomu prd rozumim, ale po 3 minutach hledani na googlu
http://cappels.org/dproj/1_kHz_Signal_Source/1_KHz_Sine_Wave_Generator.html
#define F_CPU 20000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sfr_defs.h>
#include <util/delay.h>
unsigned char sinus [20] = {151, 173, 189, 201, 205, 201, 189, 173, 151, 128, 104, 83, 66, 55, 51, 55, 66, 83, 104, 128}; //hodnoty sinusu
int max = 19, x = 0, stav = 1,sec = 0;
ISR(TIMER1_COMPA_vect){
sei();
if(sec == 14){
sec = 0;
if(stav == 1){
stav = 2;
sin();
}else if(stav == 2){
stav = 1;
obdelnik();
}
}else{
sec++;
}
}
int sin()
{
while(1){
for(x=0;x<=max;x++){
PORTB = sinus[x];
}
}
}
int obdelnik()
{
while(1){ // cyklus pro obdelník
PORTB = 51;
_delay_us(47); // spoždění
PORTB = 205; // hodnota obdelníku
_delay_us(47); // spoždění
}
}
int main(void)
{
DDRB = 0xFF;
PORTB = 0x80;
TCCR1B = (1 << WGM12)|(5 << CS10);
TIMSK = (1 << OCIE1A);
OCR1A = 19531;
sei();
obdelnik();
}
Tak tohle jsme vymyslely s kamošem a jede to, jenže to co vymyšlel on tak neumím okomentovat protože tomu moc nechápu tak bych chtěl poprosit někoho z vas jestli by mi to neokomentoval ty radky ktere nejsou okomentovane? Předem moc děkuji :)
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku