Anonymní profil Klokan – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Klokan – Programujte.comAnonymní profil Klokan – Programujte.com

 

Příspěvky odeslané z IP adresy 89.102.184.–

BlackBook
Analogová technika › Doporučte knihu o regulacích…
6. 9. 2013   #181123

Dobrý večer.

Docela mě začala zajímat problematika týkající se kolem regulací a regulátorů. Proto bych se chtěl zeptat, jestli jste někdo nečetli nějakou zajímavou knihu o tomto tématu, která by byla dobře napsána. Představa:

Základy regulace, princip,.... a jednotlivé regulátory (P, I, PID,....)?

Cloony
Mikrokontroléry › ATmega8 & ADC a přesnost
31. 8. 2013   #180928

Tak nyní pracuji na vstupní části k ADC a chtěl bych se jen zeptat, jestli by to takto mohlo být.

popis měření napětí:

Jako první je použit odporový dělič 1:10, takže max. napětí které můžu měřit je něco kolem 47V, potom už se uplatní Zenerova dioda 5,1V, která slouží jako ochranný prvek. Teda měla by. :-D

Pro oddělení měřící části a MCU je použit napěťový sledovač s RC filtrem na výstupu s f=4,8kHz, což by ADC ATmegy8 mohl hravě zvládnout.

Měření proudu spočívá v měření úbytku napětí na rezistoru obsaženým ve zdroji.

Cloony
Mikrokontroléry › ATmega8 & ADC a přesnost
28. 8. 2013   #180871

#3 KIIV
to s tím měřením jsi myslel tak, že provedu dvě měření a udělám aritmetický průměr??

Jestli jsi to myslel jinak, tak jsem to nepochopil.   

Jinak ano reference bude muset být co nejblíže MCU a ten sleep mod budu muset vyzkoušet, to jsem ještě nikdy nedělal, takže si to budu muset nastudovat.   

Cloony
Mikrokontroléry › ATmega8 & ADC a přesnost
28. 8. 2013   #180869

#1 Cloony
Upřesnění:

Ono tu Umin je vlastně citlivost AD převodníku, neboli jeden bit = 0,004V. Nahoře jsem to nenapsal moc přesně.

Cloony
Mikrokontroléry › ATmega8 & ADC a přesnost
28. 8. 2013   #180868

Ahoj kluci a holky.

Měl bych možná triviální problém, ale třeba nejsem sám, kdo si nění jistý.

Chtěl bych si postavit poměrně přesný voltmetr (na 2 desetinná místa) a jak jsem si tak šmejdil po netu, zjistil jsem, že interní reference AD převodníku u ATmegy8 není bůh ví co. Takže jsem si říkal, že bych použil přesnější externí referenci 4,096V.

Tímto bych měl být schopen měřit napětí od 0,004V že? (+- odchylka reference)

Neboli: Umin = Vref/2^n = 4,096/1024 = 0,004V

Wilik
Mikrokontroléry › Rotační enkodér
11. 7. 2013   #179069

Tak po pár hodinách namáhavé práce    se dostavil výsledek.

ISR (INT0_vect)	{	//ratační enkoder (vlevo/vpravo)

   if ((PIND & (1<<PD2))) {
      if ((PIND & (1<<PD4))) encoder++;   // B nástupní hrana
      else encoder--;                  // B sestupní hrana
   }
     
   else {
      if ((PIND & (1<<PD4))) encoder--;   // B nástupní hrana
      else encoder++;                  // B sestupní hrana
   }
}
Wilik
Mikrokontroléry › Rotační enkodér
11. 7. 2013   #179068

Dobrý večer.

Před pár jsem si napsal svůj první prográmek, kde jsem začal blikat diodou. Potom jsem zkusil tlačítka, přerušení a trošku časovače.
No nyní jsem si koupil rotační enkodér, že si s sním zkusím pohrát, ale mám problémy.

Program nic nedělá. :-D

Má to fungovat takto. Rotařním enkodérem nastavuji proměnnou encoder (0-9999) a tuto proměnnou zobrazuji na LCD. (k obsluze LCD zatím používám cizí knihovnu, na to se teprve chystám).

No a problém je, že hodnota encoder se mi nějak nehýbe. :-D

Jako MCU je použit ATmega8A s taktem 16MHz.

//ratační enkoder (vlevo/vpravo) ======= PD2 & PD4
ISR (INT0_vect)   {
   if (((PIND & (1 << PD2)) == 0x00) && (encoder < 9999)) encoder = encoder + 1;      //inc
   if (((PIND & (1 << PD2)) == (1 << PD2)) && (encoder > 0 )) encoder = encoder - 1;      //dec
    }

encoder je připojen na piny:
PD2 (INT0) = encoder A
PD4 = encoder B

Mrkev
Mikrokontroléry › Program pro ATmegu16U2 v ard…
3. 7. 2013   #178721

#6 Mrkev
http://uloz.to/xh29JyW4/avrdude-conf

Mrkev
Mikrokontroléry › Program pro ATmegu16U2 v ard…
3. 7. 2013   #178720

#5 Mrkev
A upravený konfigurační soubor můžete stáhnout zde. Pomocí něj je možné nainstalovat ATmegy 8U2 , 16U2, ...

Mrkev
Mikrokontroléry › Program pro ATmegu16U2 v ard…
3. 7. 2013   #178719

#4 KIIV
Tak to vypadá dobře a MEGA16U2 se asi podařilo nahrát.

Připojil jsem ARDUINO UNO k usb portu (zatím bez ATmega328 s bootloaderem) a přihlásilo se mi jako "Arduino Uno (COM8).

Zde přikládám i výstup a je důležité podotknout, že k naprogramování ATmegy16U2 bylo potřeba upravit configurační soubor v "C:\WinAVR-20100110\bin\avrdude.conf"

Výpis vypadá takto:

c:\WinAVR-20100110\bin>avrdude -c usbasp -p m16u2 -u -U flash:w:Arduino-us
l-atmega16u2-Uno-Rev3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0
-U lock:w:0x0F:m

avrdude: warning: cannot set sck period. please check for usbasp firmware
.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.04s

avrdude: Device signature = 0x1e9489
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be per

         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: warning: cannot set sck period. please check for usbasp firmware
.
avrdude: reading input file "Arduino-usbserial-atmega16u2-Uno-Rev3.hex"
avrdude: input file Arduino-usbserial-atmega16u2-Uno-Rev3.hex auto detecte
ntel Hex
avrdude: writing flash (4034 bytes):

Writing | ################################################## | 100% 2.87s



avrdude: 4034 bytes of flash written
avrdude: verifying flash memory against Arduino-usbserial-atmega16u2-Uno-R
x:
avrdude: load data flash data from input file Arduino-usbserial-atmega16u2
ev3.hex:
avrdude: input file Arduino-usbserial-atmega16u2-Uno-Rev3.hex auto detecte
ntel Hex
avrdude: input file Arduino-usbserial-atmega16u2-Uno-Rev3.hex contains 403
s
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 2.71s



avrdude: verifying ...
avrdude: 4034 bytes of flash verified
avrdude: reading input file "0xFF"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xFF:
avrdude: load data lfuse data from input file 0xFF:
avrdude: input file 0xFF contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xD9"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xD9:
avrdude: load data hfuse data from input file 0xD9:
avrdude: input file 0xD9 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xF4"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0xF4:
avrdude: load data efuse data from input file 0xF4:
avrdude: input file 0xF4 contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0x0F"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x0F:
avrdude: load data lock data from input file 0x0F:
avrdude: input file 0x0F contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude done.  Thank you.


c:\WinAVR-20100110\bin>
Mrkev
Mikrokontroléry › Program pro ATmegu16U2 v ard…
3. 7. 2013   #178714

#2 KIIV
jj, tak toto jsem našel taky. A teď už jenom jaké pojistky? V readMe,... o tom není ani zmíňka.

Mrkev
Mikrokontroléry › Program pro ATmegu16U2 v ard…
3. 7. 2013   #178707

Zdar a sílu.

Dneska se mi podařilo skoro dostavět vlastní ARDUINO UNO, ale problém je, že pořádně nevím, co nahrát do procesoru, který řídí komunikaci. Konkrétně jde o obvod ATmega16U2 (U3). Neví někdo, co tam nahrát? Díky moc

Mrkev
Mikrokontroléry › ATMEGA8A a ADC6 a ADC7
26. 6. 2013   #178457

#2 TheOndrap
Dík moc, nebyl jsem si moc jistý. :-)

Mrkev
Mikrokontroléry › ATMEGA8A a ADC6 a ADC7
25. 6. 2013   #178447

Ahojte, dneska už podruhé. :-)

Prosím chtěl bych se zeptat, mám ATmegu8A v SMD pouzdře. A jsou k dispozici piny ADC6 a ADC7. A jenom bych si chtěl ujasnit, jestli jsem to z datasheetu dobře pochopil.

Tyto piny slouží pouze jako vstup analogového signálu a nedají se použít jako běžné výstupní piny, že?

Mrkev
Analogová technika › Proud kroucenou dvojlinkou?
25. 6. 2013   #178442

Takže jsem si to myslel dobře, že průřez tohoto vodiče je nedostačující pro proud 0,8A a 15V. že?

Mrkev
Analogová technika › Proud kroucenou dvojlinkou?
25. 6. 2013   #178439

#2 KIIV

1A pri tomdle napeti znamena cca 3A na 15V po snizeni... plus minus ztraty

Tomuto nějak nerozumím.

Mrkev
Analogová technika › Proud kroucenou dvojlinkou?
25. 6. 2013   #178437

Zdar a sílu.

Chtěl bych se optat, jestli někdo neví, jaký maximální proud je schopna přenést kroucená dvojlinka (jeden pár) při napětí 15V??? Myslíte si, že by vpohodě snesla 0,8A? Už jsem párkrát viděl vyskočit kabel z bužírky, proto se na to ptám. :-)

Dík moc za odpověď ;-)

Jirka
Mikrokontroléry › Nastavení pojistek ATmega162
2. 5. 2013   #175693

Tak už se podařilo. Musím ještě podotknout jedno. Měl jsem i chybu v programu.

Jirka
Mikrokontroléry › Nastavení pojistek ATmega162
2. 5. 2013   #175683

Takže jsem tam našel ještě tuto možnost:

Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time: 14CK + 65 ms; [CKSEL=1111 SUT=11]

Jirka
Mikrokontroléry › Nastavení pojistek ATmega162
2. 5. 2013   #175682

ááá teď jsem se utl. omlouvám se. Nehledám CLOCK ale jak správně KIIVE píšeš tak ext. oscilator

Jirka
Mikrokontroléry › Nastavení pojistek ATmega162
2. 5. 2013   #175681

Právě že mám externí krystal, připojený mezi piny XTAL1 a XTAL2 (doplněn o kondenzátory 22pF). A chci jej používat.

Takže si myslím, že to musí být EXT. CLOCK; START-UP TIME: 6CK + 65ms

Jirka
Mikrokontroléry › Nastavení pojistek ATmega162
2. 5. 2013   #175679

Hojte.

Prosím mám dotaz. Postavil jsem si vývojový kit, a po připojení k AVR Studiu 4, jsem chtěl vybrat krystal. Ale koukám je tam toho víc než dost. U ATmegy16 to bylo v poho, ale tady si nejsem jistý. Může někdo poradit co vybrat? Používám externí krystal 16MHz.

A myslím si, že by to mělo být na tom: EXT. CLOCK; START-UP TIME: 6CK + 65ms, ale nějak mi tam zavazí to 6CK?

Klokan
Analogová technika › Rozkmitání stabilizátoru?
25. 4. 2013   #175442

No nic, tak jdu připájet chladič. A člověk by řekl, že 2W je málo. :-D

Dík za názor

Klokan
Analogová technika › Rozkmitání stabilizátoru?
24. 4. 2013   #175426

Dobrý večer,

mám malý dotaz. používám stabilizátor 5V napájený z 12V. Odběr max. 300mA. Ztráta je rovna: 2,1W. Ale stabilizátor dost topí. Nejde na něm udržet ruka a to je přišroubován k DPSce.

Tak jsem se chtěl zeptat, jestli nejde nějak poznat, jestli se nerozkmital. (Bez osciloskopu). Popř. jak snížit tepelné ztráty??

Mikrokontroléry › [C] Zobrazování nesmyslných…
22. 4. 2013   #175334

#15 KIIV
Jo takhle to je myšleno. No tak program ještě projdu a tyto proměnné odstraním. 

Ony vlastně vznikly při různých experimentech. A zapomněl jsem je vymazat.

Mikrokontroléry › [C] Zobrazování nesmyslných…
22. 4. 2013   #175332

#13 KIIV
Ojda. Tak teď jsem si to 2x přečetl, ale nějak jsem to nepochopil. Můžeš to trošku upřesnit?

Mikrokontroléry › [C] Zobrazování nesmyslných…
22. 4. 2013   #175327

Že by to byl tygr?? 

Ne teď vážně. V programu jsem měl asi špatně nastavený buffer. Měl jsem jej nastavený na hodnotu 16, ale správně má  být na 17 (páč 16+1 koncový znak). A hned to vypadá lépe. 

Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175326

A vždy se ta obrazovka zahltí nesmysly až po stisknutí tlačítka. Nikdy ne náhodně.

Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175325

Tak tento program se bude krokovat velice těžko. S tímto nemám zkušenosti. 

Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175323

No za ten kód se omlouvám. Teprve získávám nějakou štábní kulturu. Časem na to přijdu jak jej psát. :-)

No po resetu se program nastaví do původního nastavení a opět. Nastavím si velikost DPSky, vyberu jestli ji chci oboustranou a nakonec se dostanu na nastavení času. Tam si nastavuji hodiny,minuty, sekundy, ale chybné znaky se objevují stále.

Jinak LCD mám připojené takto:

#define LCD_PORT         PORTA        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    3           /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    2            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    1            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    0            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      PORTA    /**< port for RS line         */
#define LCD_RS_PIN       5            /**< pin  for RS line         */
#define LCD_E_PORT       PORTA     /**< port for Enable line     */
#define LCD_E_PIN        4            /**< pin  for Enable line     */
Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175321

Třeba tam někdo najde chybu hned při prvním ohledání. Ono jak do toho člověk hledí příliš dlouho tak tu chybu ani nevidí.

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>  

#include "lcd.h"

//DEsky
#define 	mala_dps		0
#define 	vetsi_dps		1
#define		nejvetsi_dps	6
#define		oboustrana		7
#define		viko			6
#define		tlacitko		3

//prednastaveni casu
volatile unsigned char  hodiny=0; 
volatile unsigned char  minuty=2; 
volatile unsigned char  sekundy=30;

//globalni a jiné proměnné
unsigned char temp;
char buffer[16];
int jednou=0;	//promenna pro zobrazeni upozorneni na nezavrene viko

volatile char encoder=0;		//hodnota enkoderu
volatile char rozmer_dps=0;
volatile char oboustr=0;

volatile unsigned char hod=0, min=0, sek=0, pom_h=0, pom_m=0, pom_s=0;

//============================================================================
//==============================INICIALIZACE==================================
//============================================================================
void inicializace()
{
	hod=hodiny; min=minuty; sek=sekundy;

	//nastaveni vstupnich pinu portu D
	DDRD &= ~(1 << PD0);	//enkoder	
	DDRD &= ~(1 << PD2);	//enkoder
	DDRD &= ~(1 << tlacitko);	
	DDRD &= ~(1 << viko);
		//povoleni vnitřních pull-up odporu
	PORTD |= (1 << PD0);
	PORTD |= (1 << PD2);
	PORTD |= (1 << tlacitko);
	PORTD |= (1 << viko);
		//zakazani vnitrnich pull-up odporu
	PORTC &= ~(1 << mala_dps);
	PORTC &= ~(1 << vetsi_dps);	
	PORTC &= ~(1 << nejvetsi_dps);
	PORTC &= ~(1 << oboustrana);
		//nastaveni vystupnich pinu portu D
	DDRC |= (1 << mala_dps) | (1 << vetsi_dps) | (1 << nejvetsi_dps) | (1 << oboustrana);
		//nastaveni PULL-UP odporu
	//PORTC |= (1 << mala_dps) | (1 << vetsi_dps) | (1 << nejvetsi_dps) | (1 << oboustrana);
		//nastaveni preruseni od enkoderu
	MCUCR|=(1<<ISC01)|(1<<ISC00);   //Nastaveni INT0 na "rising" signal na pinu PD2
	GICR |=(1<<INT0 );				//povoleni preruseni
		//nastaveni preruseni od citace casovace 1 (cas)
	TCCR1B |= (1 << CS12); 			//preddelička 256 (16us)
	TIMSK  |= (1 << TOIE1); 		//prerušeni pri pretečení TCNT1    
		//nastaveni preruseni od citace casovace 0 (tlacitko)
	TCCR0 |= (1<<WGM01)|(1<<CS02)|(1<<CS00); 	//CTC mode, preddelicka 1024 (64us)
	OCR0=255;						//cca 16,384ms pro kontrolu tlačítka
	TIMSK  |= (1 << OCIE0);
		//Nataveni displeje a prvni zobrazeni
	lcd_init(LCD_DISP_ON);            //Init LCD
	lcd_clrscr();

	//lcd_init(LCD_DISP_ON_CURSOR_BLINK);	//blikání kurzoru
	
	sei();    //povoleni přerušení
}

//============================================================================
//==================================PRERUSENI=================================
//============================================================================
volatile unsigned char 	tlac_prodleva,tlac_present;
volatile long int cas=0;
volatile unsigned int pomoc=5, pomoc_2=0;
volatile unsigned char flag=0, hotovo=0, zadej_cas=0;	//stisk tlacitka


ISR (INT0_vect)		//ratační enkoder (vlevo/vpravo) ======= PD0 & PD2
    {
		cli();
	if (((PIND&0x01)==0x00)&&(encoder<9999)) encoder=encoder+1;      //inc
	if (((PIND&0x01)==0x01)&&(encoder > 0 )) encoder=encoder-1;      //dec 
		sei();
    }

ISR (TIMER1_OVF_vect){ 
	TCNT1 = 3036;	//preteceni kazdou 1s
	if ( ((PIND & (1 << viko))==0) && (flag>=5)){
		if (cas!=0){cas--;} 
			else {
				void (*fn_ptr) (void) = (void (*) (void)) 0;	//reset MCU
				fn_ptr();
			}
	}
}

ISR(TIMER0_COMP_vect){ 		//přerušení od čítače časovače 0
	//ošetření tlačítka a jeho zákmitů
	  if((PIND & (1 << tlacitko))){
	        if(tlac_prodleva<20) tlac_prodleva++;
	        if(tlac_prodleva==19) tlac_present=1;  
      }
      else{	
	        if(tlac_prodleva==20){		//sem se dostane pouze pri stisku tlacitka
		    
				if (flag==0){rozmer_dps=encoder;encoder=0;}	//ulozeni rozmeru DPS
				if (flag==1){oboustr=encoder;encoder=hodiny;}	//ulozeni oboustrane DPS		
				if (flag==2){encoder=minuty;}					//resetuje hodnotu v enkoderu
				if (flag==3){encoder=sekundy;}
				if (flag==4){encoder=0;}

				flag++;		//zvyseni pri stisku tlacitka
	            }       
	        tlac_prodleva=0;
				
        }
			
			//nastaveni casu
		if (flag==2){	//nastaveni hodin
			hodiny=encoder;
			if (hodiny>=24){hodiny=0;encoder=0;}
		}
		if (flag==3){	//nastaveni minut
			minuty=encoder;
			if (minuty>=60){minuty=0;encoder=0;}
		}
		if (flag==4){	//nastaveni sekund
			sekundy=encoder;
			if (sekundy>=60){sekundy=0;encoder=0;}
		}
}

//============================================================================
//==================================FUNKCE====================================
//============================================================================


/****************************************************
****************fce pro zadani velikosti DPS*********
****************************************************/
void velikost_DPS(void)
{
	if (flag==0){	
	lcd_gotoxy(0,0);
	lcd_puts("  vyber rozmer  ");

		if(encoder==0){
			lcd_gotoxy(0,1);
			lcd_puts("1: 10x10 cm");
			}
		if(encoder==1){
			lcd_gotoxy(0,1);
			lcd_puts("2: 21x10 cm");
			}
		if(encoder==2){
			lcd_gotoxy(0,1);
			lcd_puts("3: 30x21 cm");
			}
		if(encoder>=3){
			encoder=0;
			}
	}
}
/****************************************************
****************fce pro vyber oboustrane DPS*********
****************************************************/
void oboustrana_DPS(void)
{
	if (flag==1){
	lcd_gotoxy(0,0);
	lcd_puts("oboustranou DPS?");
	
		if (encoder==0){
			lcd_gotoxy(0,1);
			lcd_puts("       NE       ");
			}
		if (encoder==1){
			lcd_gotoxy(0,1);
			lcd_puts("       ANO      ");
			}
		if(encoder>=2){
			encoder=0;
			}
	}
}
/****************************************************
***************fce pro nastaveni casu osvitu*********
****************************************************/
void nastaveni_casu(void)
{
		//hodiny
		if (flag==2){
			lcd_gotoxy(0,0);
			lcd_puts("nastaveni hodin ");
				//nastaveni sekund probiha v preruseni
			lcd_gotoxy(0,1);
			sprintf(buffer,"    %02d:%02d.%02d    ",hodiny,minuty,sekundy);
			lcd_puts(buffer);
		}
		//minuty
		if (flag==3){
			lcd_gotoxy(0,0);
			lcd_puts("nastaveni minut ");
				//nastaveni sekund probiha v preruseni
			lcd_gotoxy(0,1);
			sprintf(buffer,"    %02d:%02d.%02d    ",hodiny,minuty,sekundy);
			lcd_puts(buffer);
		}
			//sekundy
		if (flag==4){
			lcd_gotoxy(0,0);
			lcd_puts("nastaveni sekund");
				//nastaveni sekund probiha v preruseni
			lcd_gotoxy(0,1);
			sprintf(buffer,"    %02d:%02d.%02d    ",hodiny,minuty,sekundy);
			lcd_puts(buffer);

			//ulozani hodnoty hodiny,minuty, sekundy pro pozdejsi praci
				pom_h=hodiny;
				pom_m=minuty;
				pom_s=sekundy;
			//ulozani hodnoty hodiny,minuty, sekundy pro pozdejsi praci	
				hod=hodiny;
				min=minuty;
				sek=sekundy;

			cas=( 3600 * (long)hodiny) + ( 60 * (long)minuty) + (long)sekundy;	//prevod hodnot hod, min, sek na CAS
		}
}


/****************************************************
*****************fce pro rozsviceni DPS**************
****************************************************/
void rosviceni_DPS(void)
{
	if (oboustr==0){
		if (rozmer_dps==0){ 
			PORTC |= (1 << mala_dps);
			PORTC &= ~(1 << vetsi_dps);	
			PORTC &= ~(1 << nejvetsi_dps);	
		}
	
		if (rozmer_dps==1){ 
			PORTC |= (1 << mala_dps);
			PORTC |= (1 << vetsi_dps);	
			PORTC &= ~(1 << nejvetsi_dps);	
		}
	
		if (rozmer_dps==2){ 
			PORTC |= (1 << mala_dps);
			PORTC |= (1 << vetsi_dps);	
			PORTC |= (1 << nejvetsi_dps);	
		}
	}
	else{
	PORTC |= (1 << oboustrana);
		if (rozmer_dps==0){ 
			PORTC |= (1 << mala_dps);
			PORTC &= ~(1 << vetsi_dps);	
			PORTC &= ~(1 << nejvetsi_dps);	
		}

		if (rozmer_dps==1){ 
			PORTC |= (1 << mala_dps);
			PORTC |= (1 << vetsi_dps);	
			PORTC &= ~(1 << nejvetsi_dps);	
		}
	
		if (rozmer_dps==2){ 
			PORTC |= (1 << mala_dps);
			PORTC |= (1 << vetsi_dps);	
			PORTC |= (1 << nejvetsi_dps);	
		}
	}
}

/****************************************************
******************fce pro odpocitaveni***************
****************************************************/
void odpocet(void)
{
	if (flag==5){
			if ((PIND & (1 << viko))==0){
				rosviceni_DPS();
				sprintf(buffer,"nast:  %02d:%02d.%02d ",pom_h,pom_m,pom_s);
				lcd_gotoxy(0,0);
				lcd_puts(buffer);

				hod=cas/3600;
				min=(cas-((long)hod*3600))/60; 
				sek=cas%60;
				sprintf(buffer,"zbyva: %02d:%02d.%02d",hod,min,sek);
				lcd_gotoxy(0,1);
				lcd_puts(buffer);

				PORTC |= (1 << mala_dps);	//rozsviceni male DPSky
			}
			else{
				PORTC &= ~(1 << mala_dps);	//zhasnuti male DPSky	
				PORTC &= ~(1 << vetsi_dps);	//zhasnuti male DPSky
				PORTC &= ~(1 << nejvetsi_dps);	//zhasnuti male DPSky
				PORTC &= ~(1 << oboustrana);	//zhasnuti male DPSky
				
				lcd_gotoxy(0,0);
				lcd_puts("  otevrene viko ");
				lcd_gotoxy(0,1);
				sprintf(buffer,"zbyva: %02d:%02d.%02d",hod,min,sek);
				lcd_puts(buffer);
			}
		}
}
/****************************************************
*******************Restart MCU***********************
****************************************************/
void reboot(void) {
   void (*fn_ptr) (void) = (void (*) (void)) 0;

   fn_ptr();
}

/****************************************************
*************fce pro kontrolu tlacitka***************
****************************************************/
void kotrola(void)
{
	if (flag>=6){reboot();}
}
 
//============================================================================
//=====================================MAIN===================================
//============================================================================
int main(void)
{
    inicializace();           
	

while(1){	//nekonecnik
		
	//výběr velikosti DPSky
	velikost_DPS();
	
	//vyber oboustrane DPS
	oboustrana_DPS();

	//nastaveni casu osvitu
	nastaveni_casu();

	//nastaveni odpocitavani
	odpocet();

	//kontrola odpoctu (dokonceni osvitu)
	kotrola();

}//while
return 1;
}//main


Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175320

   

Ne jednou jsem ten kód kontroloval.    Ale jak to tak u mě typuju, tak to bude nějaká blbost.

Teď už jenom zjistit, kde ta chyba je.

Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175318

V přerušení je toto. A nic tam nevypisuju.

ISR(TIMER0_COMP_vect){ 		//přerušení od čítače časovače 0
	//ošetření tlačítka a jeho zákmitů
	  if((PIND & (1 << tlacitko))){
	        if(tlac_prodleva<20) tlac_prodleva++;
	        if(tlac_prodleva==19) tlac_present=1;  
      }
      else{	
	        if(tlac_prodleva==20){		//sem se dostane pouze pri stisku tlacitka
		    
				if (flag==0){rozmer_dps=encoder;encoder=0;}	//ulozeni rozmeru DPS
				if (flag==1){oboustr=encoder;encoder=hodiny;}	//ulozeni oboustrane DPS		
				if (flag==2){encoder=minuty;}					//resetuje hodnotu v enkoderu
				if (flag==3){encoder=sekundy;}
				if (flag==4){encoder=0;}

				flag++;		//zvyseni pri stisku tlacitka
	            }       
	        tlac_prodleva=0;
				
        }
			
			//nastaveni casu
		if (flag==2){	//nastaveni hodin
			hodiny=encoder;
			if (hodiny>=24){hodiny=0;encoder=0;}
		}
		if (flag==3){	//nastaveni minut
			minuty=encoder;
			if (minuty>=60){minuty=0;encoder=0;}
		}
		if (flag==4){	//nastaveni sekund
			sekundy=encoder;
			if (sekundy>=60){sekundy=0;encoder=0;}
		}
}
Mikrokontroléry › [C] Zobrazování nesmyslných…
21. 4. 2013   #175316

Ahojte.

Chtěl bych se zeptat. Napsal jsem si jednoduchý prográmek (časovač). Ale mám problém, že pouze ve funkci nastaveni_casu() se mi zobrazují nesmyslné znaky na LCD. Však video je za víc než ticíc slov.

http://www.youtube.com/watch?v=tob1o02Rk2M&feature=youtu.be

No funkce vypadá takto:

/****************************************************
***************fce pro nastaveni casu osvitu*********
****************************************************/
void nastaveni_casu(void)
{
		//hodiny
		if (flag==2){
			lcd_gotoxy(0,0);
			lcd_puts("nastaveni hodin ");
				//nastaveni sekund probiha v preruseni
			lcd_gotoxy(0,1);
			sprintf(buffer,"    %02d:%02d.%02d    ",hodiny,minuty,sekundy);
			lcd_puts(buffer);
		}
		//minuty
		if (flag==3){
			lcd_gotoxy(0,0);
			lcd_puts("nastaveni minut ");
				//nastaveni sekund probiha v preruseni
			lcd_gotoxy(0,1);
			sprintf(buffer,"    %02d:%02d.%02d    ",hodiny,minuty,sekundy);
			lcd_puts(buffer);
		}
		//sekundy
		if (flag==4){
			lcd_gotoxy(0,0);
			lcd_puts("nastaveni sekund");
				//nastaveni sekund probiha v preruseni
			lcd_gotoxy(0,1);
			sprintf(buffer,"    %02d:%02d.%02d    ",hodiny,minuty,sekundy);
			lcd_puts(buffer);

			//ulozani hodnoty hodiny,minuty, sekundy pro pozdejsi praci
				pom_h=hodiny;
				pom_m=minuty;
				pom_s=sekundy;
			//ulozani hodnoty hodiny,minuty, sekundy pro pozdejsi praci	
				hod=hodiny;
				min=minuty;
				sek=sekundy;

			cas=( 3600 * (long)hodiny) + ( 60 * (long)minuty) + (long)sekundy;	//prevod hodnot hod, min, sek na CAS
		}
}

prvně jsem zde měl i nastavování těchto hodnot. Ale přenusul jsem je do přerušení. Ale ani toto nepomohlo.

Tato funkce je stále dokola volaná z nekonečné funkce ještě s ostatníma funkcema, které fungují správně.

hodnota flag je měněná při stlačení tlačítka. Takt MCU mám 16MHz.

Jirka
Mikrokontroléry › [C] Reset ATmega16 v programu?
21. 4. 2013   #175307

Tak to nebylo ani těžké.,

void reboot(void) {
   void (*fn_ptr) (void) = (void (*) (void)) 0;

   fn_ptr();
}
Jirka
Mikrokontroléry › [C] Reset ATmega16 v programu?
21. 4. 2013   #175305

Ahojte.

Prosím mám malý dotaz. Dá se nějak resetnout program v C?? Jde o MCU ATmega16. A mě se nechce po vykonání programu vše nastavovat nanovo, tak jsem si řekl, že bych jenom vyvolal RESET MCU. Ale nevím jak. Dík moc

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175095

hlucheucho:

A PLS nemáš tam nějaký zajímavý tip na AD: 16-bit, 1 kanál třeba i se zesíkem???

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175094
Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175090

Tak jsem doplnil před začátek toho měření onu prodlevu (24x Clock + delay delší než Tconv) a nic. Program se tváří pořád stejně.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175089

tak jsem trošku popojel.

void TLC4541_init(void)
{
	static unsigned int control=0;

   PORTB &= ~(1<<SS);         //SET CS do 0
      for (int x=0;x<5;x++)
      {
      PORTB |= (1<<SCLK);
      _delay_us(2);
      PORTB &= ~(1<<SCLK);
      _delay_us(2);
      }   

   	SPDR = 0xFF;    
	_delay_ms(10);	     
	while(!(SPSR & (1<<SPIF))); //MSB           
	control = SPDR;                 
	control <<=8;               //shift to upper byte                 
	SPDR = 0xFF;   
	   
	_delay_ms(10);         
	while(!(SPSR & (1<<SPIF))); //LSB
	control += SPDR;            //add low byte
	PORTB |= (1<<SS);         	//STOP ADC

   	lcd_gotoxy(0,2);
    sprintf(buffer,"kontr: %x",control);		//zobrazi na LCD hodnotu adc_value na 4 místa (0000)
	lcd_puts(buffer);
}

Toto je funkční inicializace TLC4541. Sice občas po restartu MCU TLC4541 neinicializuje, ale na to prostě už nemůžu přijít. Ale z 90% navrátí hodnotu FF00.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175077

Tak jsem to zkusil a nic. :-D

PS: A když jsi to už zmínil, tak napiš nějaký 16-bit AD převodník, jednokanál, s OZ od analogu? Rád bych se koukl.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175075

takže jako první provedu reset.

CS do 0, pak 6x clock, CS do 1. Potom by měl vrátit hodnotu FF00h, že reset je vpořádku.

Poté by mělo následovat CS do low a 24x clock a CS do jedničky.

Potom prodlevu Tconv=2,5us.

A už jen vyčítat. No jdu to zkusit.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175073

Napájení +5V je odděleno tlmivkou 10uH od laboratorního zdroje.

Napětí z trimru je odděleno RC filtrem. Referenční napětí je použit REF02 (5V), který je filtrován 10uF a blok. 100n taky nesmí chybět. Napětí přivedeno do TLC4541 je taktéž blokováno 100n co nejblíže k čipu.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
16. 4. 2013   #175071

Takže jsem to změřil a zjistil jsem, že hodnota čtená z AD převodníku je například 16320 a tato hodnota je stejná v rozmezí 0,64V až 1,2V.

Ale přitom je tato hodnota odpovídá 1,24V.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175061

Tak jsem se pořádně zaměřil na tu hodnotu toho AD a všiml jsem si tohoto:

např. natoším hodnotu 2040, ale další není plynulá na otočení trimru, ale další je hned 4080, 8160, 16320,...... Akorát nevím, proč mi vrací tuto hodnotu.

Program je tady

/******************************************************************************
*             Program vyčítá hodnotu z 16- bit AD převodníku AD7688           *
*				a zobrazuje ji na LCD                         *
******************************************************************************/

#include <avr/io.h>  
#include <stdio.h>
#include <stdlib.h>  
#include <util/delay.h>  
#include <avr/interrupt.h> 
#include <math.h>

#include <inttypes.h>
#include <avr/pgmspace.h>

#include "lcd.h"  

// Mega16 Pinout
#define MOSI	5
#define MISO	6
#define SCLK	7
#define SS	4

char buffer[20];

void TLC4541_init(void)
{
	PORTB &= ~(1<<SS);			//SET CS do 0 
		for (int x=0;x<5;x++)
		{
		PORTB |= (1<<SCLK);
		_delay_us(1);
		PORTB &= ~(1<<SCLK);
		_delay_us(1);
		}   
	PORTB |= (1<<SS);			//SET CS do 1
	_delay_ms(2);
}

unsigned int get_adc(unsigned char adata)
{
   static unsigned int temp=0;

	_delay_ms(1);
	PORTB &= ~(1<<SS);			// SET CS to LOW (activate ADC)
	_delay_us(3);				// small dealy
	SPDR = adata;                 
	while(!(SPSR & (1<<SPIF)));	//MSB           
	temp = SPDR;                 
	temp <<=8;					//shift to upper byte                 
	SPDR = adata;                 
	while(!(SPSR & (1<<SPIF)));	//LSB
	temp += SPDR;				//add low byte
	PORTB |= (1<<SS);			//SET CS ti HIGH (stop 
	return temp;				//return 16bit value
}

void spim_init(void)
{
	// SET PORT B OUTput
	DDRB |= (1<<MOSI) | (1<<SCLK) | (1<<SS);
	// SET MISO INput
	DDRB &= ~(1<<MISO); 
	// ENable SPI, SPI Master, LSB First, SPI CLK XTAL/16)
	SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);	
	// SET function register SPI (SPCR)
	SPCR &=  ~(1<<CPOL); 	//datasheet
	SPCR |=  (1<<CPHA);		//datasheet
	//nastaveni DORD (setup LSB and MSB)
	SPCR &= ~(1<<DORD);
	// CS HIGH (STOP AD)
	PORTB |= (1<<SS);
}
  
int main(){  
	unsigned int adc_value=0;	// ADC value


	//inicializace SPI
	spim_init();
	//inicializacia displeja 
    lcd_init(LCD_DISP_ON);  

	//inicializace ADC
	TLC4541_init();

for(;;){

	adc_value = get_adc(0xFF);				//Get ADC value

	lcd_gotoxy(0,1);
	sprintf(buffer,"ADC: %05u",adc_value);		//zobrazi na LCD hodnotu adc_value na 4 místa (0000)
	lcd_puts(buffer);	

	}return 0;  
}
Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175059

Tady si dovolím ještě jeden obrázek, trošku lepší než ten minulý. Už to analyzuje i s rozhraním SPI.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175058

Kontrolní otázka za 2 bludišťáky. Pomohou nám, teda mne tyto průběhy? Je to měřeno na log. analyzátoru s obvodem CY7C68013A.

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175056

No podle mě by ta komunikace měla fungovat i při FS na +5V.

V datasheetu píší: FS: Tie this pin to VDD if not used. Takže v tomto bych problém neviděl. A s tím SCOPEM je problém. Ten opravdu nevlastním

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175054

Tak jsem to zadal takto, ale taky bezezměny:

void TLC4541_init(void)
{
	PORTB &= ~(1<<SS);			//SET CS do 0 
		for (int x;x<5;x++)
		{
		PORTB |= (1<<SCLK);
		PORTB &= ~(1<<SCLK);
		}   
	PORTB |= (1<<SS);			//SET CS do 1
}
Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175050

#9 Pinzeta
A abych nezapomněl. Zapojené to mám takto:

AVR = TLC4541

CS = SS

SDO = MISO

SCK = SCK

a pin FS je napojen na +5V (takže jej nepoužívám).

Pinzeta
Mikrokontroléry › Signály CS a FS u TLC4541
15. 4. 2013   #175047

Ahoj. Tak jsem se dneska vrhl na ten TLC4541. Ale nedaří se.

Podle všeho, ten TLC4541 potřebuje před měřením RESET PULZ. A to atk, že položí CS signál do 0 po dobu nejméně jednoho SCLK pulzu (sestupné hrany) ale ne víc než 8 SCLK pulzů. Takže jsem si chtěl udělat fci, kterou bych v mainu zavolal.

void TLC4541_init(void)
{
	PORTB |= (1<<SS);			//SET CS do 1 
	for (int i;i<4;i++)
	{
	if(SS==1)
          {}
	}   
	PORTB &= ~(1<<SS);

}

Ale problém je, že nevím, jak kontrolovat SCLK sestupnou hranu. Ale podle mě to je blbě, páč se nic nestalo. :-D Co si o tom myslíte? Jak to kontrolovat?

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
14. 4. 2013   #174993

Tak mi to nedalo a musel jsem si to vyzkoušet na simulátoru. Použil jsem Multisim a tady jsou 2 průběhy. Pro simulaci jsem použil OPA129 a TL072, protože s těmato OZ mi toto zapojení funguje nejlépe.

UV fotodioda byla nahrazena zdrojem proudu. Proud 315nA bylpoužit proto, že podle mých výpočtů jedna dioda z urč. vzdálenosti by měla být schopna vygenerovat.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
14. 4. 2013   #174990

Jo omlouvám se. Jsem to blbě pochopi. :-) Tak jsem se chopil Mutlimetru a měřil.

Schválně jsem diodu vypájel a vstup OZ připojil na 0V (gnd) a na vstupu AD převodníku jsem najednou měl něco mále přes 6V. Jak to možné?

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
14. 4. 2013   #174989

No tak s tím multimetrem mě to napadlo. Ale on AD převodník je podle mě o něco více přesnější než můj multimetr (UNI-T UT54). No nad tou statikou jsem taky přemýšlel, proto jsem diodu přikryl víčkem z alobalu, ale výsledek stejný.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
13. 4. 2013   #174949

Nikdo nic?

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
12. 4. 2013   #174899

Tak jsem to dokončil. Výsledek docela dobrý, ale problém je, že když onu diodu zakryju, tak na výstupu AD mám hodnotu blízkou 65536. Jak tam nastavit 0? A jak to vůbec možné? poradí někdo?

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
2. 4. 2013   #174323

Jasné. Pár jsem jich už udělal. ;-) Teď experimentuju se suchým fotorezistem.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
2. 4. 2013   #174310

No mě jde o to, že DPSku si dělám doma. A na prokovy nemám vybavení. A hold zde musím mít konektor ze strany TOP. Takže jinak to zde udělat nejde. :-(

Teda pokud nechci pájet ten konektor z této strany. Už jsem to zkoušel, ale vypadá to potom divně.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
2. 4. 2013   #174307

Tak eagle je verze 6.1.0 ve verzi Freeeee. ;-)

Ty prokovy u toho konektoru jsou proto, že se pod ním velice špatně pájí. Takže radši jsem si navrhl hned u něj prokov, já ten konektor chci mít na straně TOP. Zbylé prokovy jsou už nezbytné. Např. u toho ADčka jsem vycházel z Datasheetu.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
2. 4. 2013   #174299
Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
1. 4. 2013   #174232

A ještě bych se chtěl zeptat. Při návrhu DPS používám vylítí mědi (GND), je to možné i tohoto, nebo bych tím mohl celý obvod "zarušit"? A jestli to možné je, tak jakou zem vlasně můžu vylít?

A jako návrh oboustranné DPSky, tak u této vylívám pouze vrstvu TOP.

Můj názor: Signálovou typuju, že ne, referenční taky. Takže jestli bych já něco "vylíval", tak by to byla napájecí.?

Toto jsou věci, kterýma jsem se nikdy nezabýval. Proto se na ně ptám. Ono to jsem možná "prkotiny", ale dokážou určitě nadělat víc škody než užitku.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
1. 4. 2013   #174229

No tak co mám ověřeno tak při osvícení jednou LED to dělá 162nA. A rezistor tam mám zatím pouze 1M. Ale ten budu upravovat. Ale to až po nějakém tom měření.

Ale jinak jsem si to spočítal a vyšlo:

Při 125kHz/2 mi Cf vyšlo cca 2,5pF.

Při 125kHz/3 je Cf = 3,8pF.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
1. 4. 2013   #174224

#13 hlucheucho
No ohledně toho R1, C8 a IC4C se musím obhájit. Vycházím ze zapojení z Datasheetu a hodnoty neupravil.    Jinak už jsem si to dopočítal. Pro těch 125kHz mi to vyšlo R=33R & C=38nF (zvolím nejbližší hodnotu). Jinak ten operák IC4C (jako napěťový sledovač je z datasheetu). Ale taky jsem přemýšlel na co tam vlastně je. Takže jej odstraním.

A měnit AD převodník už v plánu nemám. Musím to udělat z toho, co mám. A ano to zesílení by šlo udělat i na prvním OZ, ale hodnota Rf by byla v řádech Mohm až Gohm. A tohoto se snažím vyhnout. Proto jsem volil toto řešení, kde Rf bude v řádek Kohm max jednotky Mohm a zesílení na druhém OZ si nastavím dle libosti.

Jenom jestli bych mohl poprosit, jak volit ten kondenzátor Cf?

jinak schema jsem opravil.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
1. 4. 2013   #174214

Tak jsem to zkusil upravit podle tvé rady, ale nejsem si jistý, jestli je to OK. Myslíš, že bys mohl říct, že jsem to dobře pochopil? Tady přikládám schema. oddělil jsem napájecí zem od druhé a ty pak spojím pomocí 0R na DPS.

Napájení jsem oddělil pomocí trumivek 10uH. Blokovací kondenzátory 100n.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
1. 4. 2013   #174208

No ty tlumivky jdu zapojit. Ale mám doma je 10uH, takže lepší než nic a potom koupím a dopplním většími. :-)

Ale jestli se můžu optat, to zapojení systému zemí?

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
31. 3. 2013   #174177

#7 hlucheucho
Tak na toto jsem krátký. :-D Myslíš, že bys mohl ukázat jak to myslíš??

Jinak ohledně toho lítání té hodnoty. Tak mám použit 16-bit AD převodník a přes nějaké operáky snímám intenzitu UV světla. Takže to lítání hodnot jsem tak trošku očekával. Ale jsem bez osciloskopu, takže nejsem schopný řísi, co se děje na napájecí smyčce. Proto to ještě zkusím trošku poladit.

Já mám napájení řešeno tak, že mám přivedeno +9V a GND a zápornou větev pro operáky získávám z ICL7660 a to asi není moc dobré. Ale doma jsem našel trafíčko 2*9V, takže jdu navrhovat a zítra řeknu rozdíl.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
30. 3. 2013   #174134

Tak musím říct, že jsem na to šel blbou cestou. :-D Toto mi poradili jinde.

uint32_t suma;
uint16_t adc_value;

suma = 0;
for(uint8_t i=0; i<16; i++)
suma += get_adc();
adc_value = suma / 16;
Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
30. 3. 2013   #174127

Tak jsem nad tím přemýšlel a napadlo mě, že bych si vytvořil pole, do kterého bych vždy uložil 16 hodnot a ty bych potom jen vydělil 16. Ale jak je to s tím rozsahem hodnot??

Protože když sečtu 16 šestnácti bytových čísel, tak dostalnu hodnotu odpovídající 1 048 576 a nejsem si jistý, jestli je 8-bitové AVR schopné počítat s takovou hodnotou.

Maty
Mikrokontroléry › [C] Průměrování ADC 16-bit h…
30. 3. 2013   #174123

Ahoj,

chtěl bych se zeptat, jak nejlépe průměrovat 16-bitové hodnoty z AD převodníku. Jde mi o to, že hodnoty mi moc lítají, tak bych chtěl udělat třeba 10 měření a potom to zprůměrovat. Ale jde mi o to, že mám strašně moc velké čísla. Program píšu v C a jako MCU mám ATmega16. Děkuji

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý