Stránka 1 z 3

Úprava programu "nf generátor" pro ATTiny25-20

Napsal: 07 dub 2017, 21:41
od jade
Velmi bych poprosil o úpravu programu nf generátoru pro ATTiny25-20, který slouží jako zdroj signálu pro VLF maják.
Psal mi to bývalý kolega, který už má jinou práci a jiné zájmy...
Jde o to, že výsledný tón 3720hz (odvozený z kmitočtu krystalu 3,93Mhz, v současné podobě programu nepřerušovaný)
je potřeba klíčovat, aby výsledný signál tvořil tón, přerušovaný v rytmu cca 5-8hz tak, aby tón tvořil 80% a přerušení 20% každého "pípnutí".
Toho dosahuji dalším obvodem, podle mě zbytečným, když by to hravě zvládl ten MCU.
Potřebuji celé zařízení miniaturizovat, ten přerušovač mi tam zachází.
Byl bych vděčný, kdyby se mi na ten program někdo podíval, v céčku se vůbec nevyznám.
Děkuji předem za laskavost...



Kód: Vybrat vše

/*
 *
 * Created: 9.8.2012 20:02:00
 *  Author: Michal
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>

#define F_CPU 3800000UL
//   cas = x * (1 / 3.8E+6)
//   frekvence= 3.8E+6 / x

//   x = 3.8E+6 * pozadovany cas
//   x = 3.8E+6 / pozadovana frekvence (pul periody!!!!!)
char compare = 0x80;
int i;

int main(void)
{
   
   PORTB |= (0<<DDB2) | (1<<DDB1) | (1<<DDB0);   //nastaveni pull up
   DDRB |= (1<<DDB2) | (0<<DDB1) | (0<<DDB0);   //smerovz registr
   asm( "NOP");
   PCMSK |= (1<<PCINT1) | (1<<PCINT0);         //tlacitka povoleni pcint 1,0
   GIMSK |= (1<<PCIE);                     //povoleni pcint
   asm("NOP");
   TIMSK |= (1<<OCIE0A);                  //citac  preruseni pri porovnání
   TCCR0B |= (0<<CS02) | (0<<CS01) | (1<<CS00);//preddelicka 0
   GTCCR |= (1<<TSM)|(1<<PSR0);                     //zastaveni
   OCR0A = compare;                     //zapsani komparacni hodnoty
   TCNT0 = 0x00;                        //citac=0

   GTCCR &= 01111110;                     //zapnuti
   sei();                        //vsechna preruseni
   
    while(1)
    {}                                 //SMYCKA!!!!!!
     
   
    
   return(1);
}

ISR (PCINT0_vect)
{
   for (i=0;i<10;i++)
   {
      asm( "NOP");
   }
   
   if bit_is_clear(PINB,0) compare--;
   if bit_is_clear(PINB,1) compare++;
   
}



ISR (TIMER0_COMPA_vect)
{
   GTCCR |= (1<<TSM)|(1<<PSR0);         //vypnuti
   for (i=0;i<72;i++)
   {
      asm( "NOP");
   }
   PORTB ^= (1<<PORTB2);      //zmena vystupu
   OCR0A = compare;         //zapsani komparacni hodnoty
   TCNT0 = 0x00;            //citac=0
   GTCCR &= 01111110;         //zapnuti

}

Napsal: 07 dub 2017, 23:14
od monterjirka
MCU bude dělat ještě něco jiného nebo pouze "pípat"?
Pak by se nabízelo napsat to pro "Arduino" a použít s ATtiny85

V podstatě maličkost:
zapni tón
čekej
vypni tón
čekej
vrať se na začátek

Napsal: 07 dub 2017, 23:26
od jade
Jen pípat a ještě měnit základní frekvenci tónu v krocích +-10hz pomocí tlačítek (to už umí).
V podstatě maličkost pro toho, kdo se vyzná...
S jiným MCU ne! mám hotovou osazenou desku, programátor a koupené dvacetpětky.

Jen zrekapituluji, o co mi jde: Program nyní umí nepřerušovaný tón, který se dá měnit tlačítky v krocích + - 10Hz.
Potřebuji vyvořit přerušovaný tón a zachovat přitom dolaďování pomocí tlačítek.

Napsal: 08 dub 2017, 13:41
od hakamusai
Zkusil bych v hlavní smyčce řešit kdy má procesor generovat tón a kdy ne.

Napsal: 09 dub 2017, 16:49
od AB1
Zkus toto

Kód: Vybrat vše

    
   while(1)
   {
      DDRB |= (1<<2); 
      _delay_ms(160);       // impuls 160 ms
      DDRB &= ~(1<<2); 
      _delay_ms(40);        //  mezera 40 ms
   }                               
 

Napsal: 09 dub 2017, 18:03
od jade
Díky, vyzkouším!!

Napsal: 09 dub 2017, 19:21
od jade
Omlouvám se, ale AVR Studio mi hlásí chybu... :cry:

Kód: Vybrat vše

D:\Users\Paul\Documents\default/../Majak2.c:43: undefined reference to `_delay_ms'
D:\Users\Paul\Documents\default/../Majak2.c:45: undefined reference to `_delay_ms'
make: *** [Majak2.elf] Error 1

Co s tím počít, možná něco dělám špatně?

Napsal: 09 dub 2017, 19:27
od msar
Zkus přidat

Kód: Vybrat vše

#include <util/delay.h>

Napsal: 09 dub 2017, 19:47
od AB1
Napiš začátek takto

Kód: Vybrat vše

#define F_CPU 3800000UL 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>

Napsal: 13 dub 2017, 11:09
od jade
Děkuji, naprogramovat čip už šel, ale vyskytl se problém. Místo 3720hz mám jen 2904hz a přerušování je sotva 1hz (se stejným krystalem samozřejmě)
Co s tím provésti? Externí krystal se nastavuje jen pojistkou? (v PonnyProg)
Pojistky jsem nastavil CKSEL1 na ON, zbytek OFF (SPIEN je On a nejde změnit)
CKSEL1 by mělo být nastavení pro krystalový oscilátor 3-8Mhz.
Díky!

Napsal: 13 dub 2017, 13:10
od FHonza
Pro začátek: Jaký je použitý krystal ? Na začátku píšeš 3,93MHz, ve zdrojáku je 3,8Mhz.

Napsal: 13 dub 2017, 13:25
od jade
Ve všech konstrukcích majáku, i v prototypu, byl vždycky krystal 3,932160Mhz, nejspíš ten 3,8 nebyl k dispozici.
S tímto krystalem kolega i program "ladil" přes ISP.
Vycházel jsem s toho i u přijímačů, jsou naladěné na 3720hz.

Napsal: 13 dub 2017, 13:56
od FHonza
Nemůžu se dopočítat frekvence 3720Hz ani v tom původním zdrojovém textu. Předpokládám že je ve fuse nastaven i CKDIV8 ? Ale i tak mi to nevychází.

Napsal: 13 dub 2017, 14:03
od lesana87
Jestli ten program chápu dobře, tak frekvence je hrubě daná sw smyčkou

Kód: Vybrat vše

   for (i=0;i<72;i++)
   {
      asm( "NOP");
   }

a hw časovačem se jen dolaďuje. Takže záleží, jak to překladač přeloží, jedna instrukce navíc a frekvence je jinde. Z toho plyne i to, že funkce delay_xx() nebudou fungovat správně.

Napsal: 13 dub 2017, 14:08
od jade
Taky jsme se nemohli dopočítat, možná se stalo, že nejde o poslední verzi zdrojáku. Doteď jsem totiž používal kopie z čipu prototypu, ne nové kompilace.
Údajně by měla jít frekvence zvednout snížováním čísla 72, ale jelikož vůbec netuším k čemu by se mělo vztahovat, tak asi metodou pokus-omyl.

Kód: Vybrat vše

 for (i=0;i<72;i++) 

Edit: Lesana mě předběhla :)