 |

|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 07 22, 15:59. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Elektronika žaliems » nereguoja realiu laiku adc
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
 |
 |
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 11, 23:57 |
|
|
|
sveiki, pasirasiau programa su avr studio ir man ji neveikia taip kaip turetu. Iskylanti problema: ijungus mikrovaldikli ir sukinejant potenciometra isejime uzsifiksuoja pirmoji potenciometro reiksme, kol mikrovaldiklis dirba sukinejant potenciometra isejimuose niekas nesikeicia, taciau isjungus mikrovaldikli ir tuo metu pasukus potenciometra, po to vel ijungus mikrovaldikli isejime buna ta reiksme, kuri buvo nustatyta kai mikrovaldiklis buvo isjungtas. Tai kur beda ? Pridedu programos koda:
Kodas: |
#include<avr\io.h>
#include<util/delay.h>
#include<avr\interrupt.h>
#define tarpas _delay_ms(1)
int main(void)
{
//////kintamieji/////
unsigned char i, n=8;
///////Isejimu registrai/////
DDRB=0b11111111;
DDRC=0b11111111;
/////ADC registrai/////
ADMUX=(1<<REFS0)|(1<<ADLAR);
ADCSRA=(1<<ADEN)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2);
ADCSRA|=(1<<ADSC);
//// skaiciuosim iki 16,tada iki 32, tada iki 64 ir iki 128. Ir viska suksim amzinai
while(n<128)
{
n=n*2;
for(i=0; i<16; i++)
{
//// pirmi 4 portai skaiciuojami dvejetaine sistema
PORTC = (PORTC & 0xf0) | i;
tarpas;
}
//// kiti 4 portai desimtaine sistema
PORTC = (PORTC & 0x0f) ^~ n;
////////////////////isejimu ir adc valdymas///////////
if(n & 16)
{
if(ADCH<100)
{
PORTB = 0b1;
}
else if(ADCH>100 && ADCH <200)
{
PORTB = 0b11;
}
else if(ADCH>200 )
{
PORTB = 0b111;
}
}
else if(n & 32)
{
if(ADCH<100)
{
PORTB = 0b1111;
}
else if(ADCH>100 && ADCH <200)
{
PORTB = 0b11111;
}
else if(ADCH>200 )
{
PORTB = 0b111111;
}
}
else if(n & 64)
{
if(ADCH<100)
{
PORTB = 0b101;
}
else if(ADCH>100 && ADCH <200)
{
PORTB = 0b1001;
}
else if(ADCH>200 )
{
PORTB = 0b10001;
}
}
else if(n & 128)
{
if(ADCH<100)
{
PORTB = 0b10101;
}
else if(ADCH>100 && ADCH <200)
{
PORTB = 0b1010101;
}
else if(ADCH>200 )
{
PORTB = 0b11111111;
}
}
/////////////////////////////////////////////////////
//////////////nreiksmes grazinimas i 0///////////////
if(n == 128)
n=8;
}
}
|
|
|
|
|
|
 |
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 08:18 |
|
|
|
Kita karta kodo talpinimui geriau naudok pastebin.com.
Siaip kodo labai nenagrinejau, bet kur amzinas ciklas? Jis viena karta apsisuko ir viskas. |
|
|
|
|
 |
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 11:14 |
|
|
|
tau reikia FreeRunning rezimo ir nepamirsti nors pirma karta inicializuoti ADC
#include <avr/io.h>
int main (void)
{
DDRE |= (1 << 2); // Set LED1 as output
DDRG |= (1 << 0); // Set LED2 as output
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescalar to 128 - 125KHz sample rate @ 16MHz
ADMUX |= (1 << REFS0); // Set ADC reference to AVCC
ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading
// No MUX values needed to be changed to use ADC0
ADCSRA |= (1 << ADFR); // Set ADC to Free-Running Mode
ADCSRA |= (1 << ADEN); // Enable ADC
ADCSRA |= (1 << ADSC); // Start A2D Conversions
for(; // Loop Forever
{
if(ADCH < 128)
{
PORTE |= (1 << 2); // Turn on LED1
PORTG &= ~(1 << 0); // Turn off LED2
}
else
{
PORTE &= ~(1 << 2); // Turn off LED1
PORTG |= (1 << 0); // Turn on LED2
}
}
}
o jei nori didesnio tikslumo, tai renkiesi kaskart inicijuojama ADC, tada nustatai reikiama kanala bei daznio dalikli, susitvarkai su pertraukimu dorokle, inicijuoji ADC, darai sleep. pertraukime iseini is sleep, nuskaitai reiksme.
#include <avr/io.h>
#include <avr/interrupt.h>
int main (void)
{
DDRE |= (1 << 2); // Set LED1 as output
DDRG |= (1 << 0); // Set LED2 as output
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescaler to 128 - 125KHz sample rate @ 16MHz
ADMUX |= (1 << REFS0); // Set ADC reference to AVCC
ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading
// No MUX values needed to be changed to use ADC0
ADCSRA |= (1 << ADFR); // Set ADC to Free-Running Mode
ADCSRA |= (1 << ADEN); // Enable ADC
ADCSRA |= (1 << ADIE); // Enable ADC Interrupt
sei(); // Enable Global Interrupts
ADCSRA |= (1 << ADSC); // Start A2D Conversions
for(; // Loop Forever
{
}
}
ISR(ADC_vect)
{
if(ADCH < 128)
{
PORTE |= (1 << 2); // Turn on LED1
PORTG &= ~(1 << 0); // Turn off LED2
}
else
{
PORTE &= ~(1 << 2); // Turn off LED1
PORTG |= (1 << 0); // Turn on LED2
}
} |
|
|
|
|
 |
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 19:48 |
|
|
|
Socrates rašo: |
Kita karta kodo talpinimui geriau naudok pastebin.com.
Siaip kodo labai nenagrinejau, bet kur amzinas ciklas? Jis viena karta apsisuko ir viskas. |
tai jis ir sukasi amzinai, kadangi kodo pabaigoje n reikse nustatoma i 8, todel skaiciavimas niekados nesibaigia |
|
|
|
|
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 20:02 |
|
|
|
Saulius18 rašo: |
antatmegos16 nera free runing rezimo |
221 datasyto puslapis, sfior registro bitai 7-5, adts2-0, lentele paskaityk ir rasi free runnig |
|
|
|
|
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 20:32 |
|
|
|
Saulius18 rašo: |
Socrates rašo: |
Kita karta kodo talpinimui geriau naudok pastebin.com.
Siaip kodo labai nenagrinejau, bet kur amzinas ciklas? Jis viena karta apsisuko ir viskas. |
tai jis ir sukasi amzinai, kadangi kodo pabaigoje n reikse nustatoma i 8, todel skaiciavimas niekados nesibaigia |
Tada kodas kazkoks neitiketinai kreivai parasytas  |
|
|
|
|
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 22:04 |
|
|
|
kaip neitiketinai?, pasibandyk ir pamatysi viskas sukama ratu, nes while reiksme niekad netampa 0 |
|
|
|
|
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 12, 23:04 |
|
|
|
pabandyk taip
//// skaiciuosim iki 16,tada iki 32, tada iki 64 ir iki 128. Ir viska suksim amzinai
while(n<255)
jei suveiks, tada susitvarkyk logika taip, kad pats suprastum ka priburei |
|
|
|
|
 |
nereguoja realiu laiku adc |
Parašytas: 2011 09 13, 15:10 |
|
|
|
Saulius18 rašo: |
kaip neitiketinai?, pasibandyk ir pamatysi viskas sukama ratu, nes while reiksme niekad netampa 0 |
Kad sukama ratu tai gerai, bet kad tavo kodo skaityt neimanoma ir ji supranti tik tu vienas, tai cia nieko gero. Nesulauksi pagalbos, jei laikysies tokio stiliaus. |
|
|
|
|
|
 |
Google paieška forume |
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |