|
|
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 2024 10 08, 12:42. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » Dvieju ADC kanalu nuskaitymas AVR
|
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
|
|
|
Puslapis 1 iš 2 Pereiti prie 1, 2 Toliau |
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 04 16, 00:28 |
|
|
|
Sveiki gal galite padeti nuskaityti du ADC kanalus ant atmegos8. Viena kanala kaip ir nuskaito bet kito niekaip t.y. rodo nulius . Stai programele
Kodas: |
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <stdio.h>
#include <util/delay.h>
const unsigned char segs[] =
{
_BV(2) | _BV(1) | _BV(5) | _BV(6) | _BV(3) | _BV(7), //0
_BV(2) | _BV(1), //1
_BV(7) | _BV(2) | _BV(0) | _BV(6) | _BV(5), //2
_BV(0) | _BV(1) | _BV(2) | _BV(5) | _BV(7), //3
_BV(3) | _BV(0) | _BV(2) | _BV(1), //4
_BV(0) | _BV(1) | _BV(3) | _BV(5) | _BV(7), //5
_BV(0) | _BV(1) | _BV(3) | _BV(5) | _BV(6) | _BV(7), //6
_BV(7) | _BV(2) | _BV(1), //7
_BV(0) | _BV(1) | _BV(2) | _BV(3) | _BV(5) | _BV(6) | _BV(7),//8
_BV(0) | _BV(1) | _BV(2) | _BV(3) | _BV(7),//9
_BV(5),//-
};
void InitADC(void)
{
ADMUX=(1<<REFS0)|(1<<REFS1);
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS2);
}
int ReadADC(int ch)
{
ch=ch&0b00000111;
ADMUX&=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);
ADMUX|=ch;
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
return(ADC);
}
int ReadADC2(int ch)
{
ADMUX&=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3);
ch=ch&0b00000111;
ADMUX|=ch;
ADCSRA|=(1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
return(ADC);
}
volatile int a,b,c,d;
void Print(int num)
{
if(num>9999) return;
a=num%10;
num=num/10;
b=num%10;
num=num/10;
c=num%10;
num=num/10;
d=num;
}
unsigned char ciklas=0;
ISR(TIMER0_OVF_vect)
{
if(++ciklas==4) ciklas=0;
switch(ciklas)
{
case 0:
PORTC = (1<<3);
PORTD = (~segs[b]);
break;
case 1:
PORTC = (1<<4);
PORTD = (~segs[c]);
//_delay_us(50);
break;
case 2:
PORTC = (1<<2);
PORTD = (~segs[a]);
//_delay_us(50);
break;
case 3:
PORTC = (1<<5);
PORTD = (~segs[d]);
//_delay_us(50);
break;
default:
ciklas = 0;
break;
}
return;
}
int main(void)
{
int adc_value,adc_value2;
TCCR0|=(1<<CS01)|(1<<CS00);
TIMSK|=(1<<TOIE0);
TCNT0=0;
DDRD=0XFF;
DDRC=0b0111100;
sei();
InitADC();
while(1)
{
adc_value=ReadADC(0);
adc_value2=ReadADC2(1);
Print(adc_value);
_delay_ms(300);
Print(adc_value2);
}
}
|
|
|
|
|
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 24, 17:33 |
|
|
|
Kodas: |
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdarg.h>
#define bitas(PIN,BIT) (PIN &(1 << BIT))
#define sbi(PORT,BIT) (PORT |= (1<<BIT))
#define cbi(PORT,BIT) (PORT &= ~(1<<BIT))
#define lcd_dp_ddr DDRD
#define lcd_cp_ddr DDRC
#define lcd_dp PORTD
#define lcd_cp PORTC
#define E 2
#define RW 1
#define RS 0
//******************************************************
void lcd_cmd(unsigned char cmd){
cbi(lcd_cp,RS);
lcd_dp = cmd;
sbi(lcd_cp,E);
cbi(lcd_cp,E);
_delay_ms(5);
}
void lcd_dat(unsigned char dat){
sbi(lcd_cp,RS);
lcd_dp = dat;
sbi(lcd_cp,E);
cbi(lcd_cp,E);
_delay_us(100);
}
void lcd_init(void){
lcd_dp_ddr = 0xFF;
sbi(lcd_cp_ddr, E);
sbi(lcd_cp_ddr, RW);
sbi(lcd_cp_ddr, RS);
_delay_ms(200);
lcd_cmd(0x38);
lcd_cmd(0x08);
lcd_cmd(0x01);
lcd_cmd(0x0C);
lcd_cmd(0x06);
}
//******************************************************
void IntToStr(unsigned int va){
int i,s;
volatile char mas[5];
for(i=0; i<5; i++){
mas[4-i] = (va % 10)+48;
va = va / 10;
}
s = 0;
for(i=0; i<4; i++){
if(mas[i] != '0') break;
s++;
}
for(i=s; i<5; i++){
lcd_dat(mas[i]);
}
}
//******************************************************
void lcd_text(int line, char *st, ...){
unsigned int s, n;
if(line == 1){
lcd_cmd(0x80);
}else{
lcd_cmd(0xC0);
}
n = 0;
va_list vaList;
va_start(vaList,0);
while(st[n] != 0){
if((st[n] == '%') && (st[n+1] == 'd')){
s = va_arg( vaList, unsigned int);
IntToStr(s);
n = n + 2;
}
if(st[n] == 0) break;
lcd_dat(st[n]);
n++;
if(n == 16) return;
}
while(n < 16){
n++;
lcd_dat(' ');
}
va_end(vaList);
}
void ADCInit(void) { ADMUX = (1<<REFS0) | (0<<REFS1) | (1<<MUX0) | (1<<MUX1) | (0<<MUX2) | (0<<MUX3) | (1<<ADLAR);
ADCSRA = (1<<ADEN) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADSC); //bitai nustatyti pagal datasheeta
ADCSRB = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0) ; //freerunig rezimas
}
void ADCInit2(void) { ADMUX = (1<<REFS0) | (0<<REFS1) | (1<<MUX0) | (0<<MUX1) | (1<<MUX2) | (0<<MUX3) | (1<<ADLAR);
ADCSRA = (1<<ADEN) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADSC); //bitai nustatyti pagal datasheeta
ADCSRB = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0) ; //freerunig rezimas
}
void ADCstop(void) {
ADCSRA = (0<<ADEN ) | (1<<ADIF) ; //bitai nustatyti pagal datasheeta
//freerunig rezimas
}
//******************************************************
int main( void ){
DDRB = 0x00000011; //0,1 iejimai
PORTB = 0x00001100;;
lcd_init();
int a;
int x;
while(1){
ADCInit();
a=ADCH;
lcd_text(2,"Bukle son : %d",a);
lcd_text(1,"Bukle : %d",x);
ADCstop();
_delay_ms(10);
ADCInit2();
x=ADCH;
ADCstop();
_delay_ms(10);
}
return 0;
}
|
kodel man gaunasi 2 tie patis adc ?
P.s Ce prirasiau visokiu stopADC del to kad paskaites datasheeta viliausi kad sustabdysiu viena adc matavima . |
|
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 24, 18:47 |
|
|
|
cia tik kaip pvz:
Kodas: |
void readX(void)
{ADMUX=0b01000111; //ADC7 X
ADCSRA|=(1<<ADSC);
loop_until_bit_is_set(ADCSRA, ADIF);
adc_val=ADCL;
adc_val += (ADCH<<8);}
void readY(void)
{ADMUX=0b01000110; //ADC6 Y
ADCSRA|=(1<<ADSC);
loop_until_bit_is_set(ADCSRA, ADIF);
adc_val=ADCL;
adc_val += (ADCH<<8);}
.
.
.
readX();
value_x=adc_val;
readY();
value_y=adc_val; |
|
|
_________________ Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau |
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 24, 18:49 |
|
|
|
beje reik nustatyt ir ADC:
Kodas: |
////ADC INIT////
ADCSRA=0b10000110;//ON ADC, FCPU=8M, ADC_CLK=125K |
|
|
_________________ Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau |
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 24, 23:06 |
|
|
|
o kodo nekeiciant neimanoma ?
taip ir nepasakei kodel man 2 tie patis adc , nors portus tai pakeiciu . |
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 10:07 |
|
|
|
Per daug skaitymo tam tavo kode
Be to pradejus adc skaityma iskart skaitai adch reiksme, gal adc nespeja pamatuoti, tuomet reikia sekti ADIF reiksme.
Bandyk mano naudoti, i tavo koda iterpti nesunku, tik pasikeisk ADMUX reiksmes pagal norimus kanalus, kodas 100% veikiantis. |
|
_________________ Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau |
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 12:13 |
|
|
|
didshirshis rašo: |
Per daug skaitymo tam tavo kode
Be to pradejus adc skaityma iskart skaitai adch reiksme, gal adc nespeja pamatuoti, tuomet reikia sekti ADIF reiksme.
Bandyk mano naudoti, i tavo koda iterpti nesunku, tik pasikeisk ADMUX reiksmes pagal norimus kanalus, kodas 100% veikiantis. |
Kaip ir kur tu deklaruoji adc_val ? neranda man jo . |
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 12:28 |
|
|
|
pacioj pradzioj po "includu"
unsigned int adc_val; |
|
_________________ Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau |
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 12:31 |
|
|
|
didshirshis rašo: |
pacioj pradzioj po "includu"
unsigned int adc_val; |
dekuij susikompiliavo , pareguliuoji bitus ir lekiu bandyti |
|
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 13:52 |
|
|
|
didshirshis rašo: |
cia tik kaip pvz:
Kodas: |
void readX(void)
{ADMUX=0b01000111; //ADC7 X
ADCSRA|=(1<<ADSC);
loop_until_bit_is_set(ADCSRA, ADIF);
adc_val=ADCL;
adc_val += (ADCH<<8);}
void readY(void)
{ADMUX=0b01000110; //ADC6 Y
ADCSRA|=(1<<ADSC);
loop_until_bit_is_set(ADCSRA, ADIF);
adc_val=ADCL;
adc_val += (ADCH<<8);}
.
.
.
readX();
value_x=adc_val;
readY();
value_y=adc_val; |
|
O jusu neuzhknisa prirasyt tokia kruva kodo, kur viskas eina tas pats per ta pati? Skaityt ta koda po to darosi tragedija...
Kodas: |
unsigned int readX(unsigned int channel) {
unsigned int adc_val=0;
ADMUX=(0b01000000 | channel); // Nezinau kam tas 7 bitas=1, tai palieku
ADCSRA|=(1<<ADSC);
loop_until_bit_is_set(ADCSRA, ADIF); // tokie macro traumuoja programuotoja!
adc_val=ADCL;
adc_val += (ADCH<<8);
return adc_val;
}
.
.
.
value_x=readX(6);
value_y=readX(7);
|
O ir isvis, naudojant pertraukti, tai nuskaityme butu gal 2 eilutes kodo... |
|
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 15:39 |
|
|
|
dekuj isbandysim ir sita
ir beje ka tiksliai daro tas "return" adc_val? Kad su juo veikia zinau bet ka konkreciai reiskia? |
|
_________________ Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau |
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 16:08 |
|
|
|
didshirshis rašo: |
dekuj isbandysim ir sita
ir beje ka tiksliai daro tas "return" adc_val? Kad su juo veikia zinau bet ka konkreciai reiskia? |
funkcija, skirtingai nuo proceduros, pati is saves yra kintamasis. return grazina funkcijos reiksme, o veliau ta reiksme tu jau naudoji kaip nori. |
|
|
|
|
|
Dvieju ADC kanalu nuskaitymas AVR |
Parašytas: 2011 06 25, 16:44 |
|
|
|
vienu zodziu kai yra return galima rasyt:
value_y=read(6); ir nereikia rasyti:
read(6);
value_y=adc_val; ane?
ir kodel rasoma tavo funkcijos pavadinime ne "void", o unsigned int? Suprantu kad kvailu klausimu klausineju, bet norisi zinoti |
|
_________________ Aš pažeidžiau forumo taisykles ir reklamavau paraše. ...Bet uz reklama tai susimokejau |
|
|
|
|
|
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 |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
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 |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods |
|
|
|