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

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

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

#1 Příspěvek 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

}

Uživatelský avatar
monterjirka
Příspěvky: 2761
Registrován: 14 čer 2003, 02:00
Bydliště: Blížejov

#2 Příspěvek 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

Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

#3 Příspěvek 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.

hakamusai
Příspěvky: 943
Registrován: 17 dub 2007, 02:00

#4 Příspěvek od hakamusai »

Zkusil bych v hlavní smyčce řešit kdy má procesor generovat tón a kdy ne.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#5 Příspěvek 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
   }                                
  

Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

#6 Příspěvek od jade »

Díky, vyzkouším!!

Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

#7 Příspěvek 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ě?

Uživatelský avatar
msar
Příspěvky: 253
Registrován: 22 dub 2006, 02:00
Bydliště: Hradec Králové

#8 Příspěvek od msar »

Zkus přidat

Kód: Vybrat vše

#include <util/delay.h>

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#9 Příspěvek 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>

Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

#10 Příspěvek 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!

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#11 Příspěvek od FHonza »

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

Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

#12 Příspěvek 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.

Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 01:00
Bydliště: Praha

#13 Příspěvek 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í.

Uživatelský avatar
lesana87
Příspěvky: 3296
Registrován: 20 zář 2014, 02:00

#14 Příspěvek 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ě.

Uživatelský avatar
jade
Příspěvky: 962
Registrován: 28 pro 2004, 01:00
Bydliště: Brno

#15 Příspěvek 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 :)

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“