www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

10 bitni AD pretvornika ATMEGA8

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
juref
Član
Član



Pridružen-a: Tor 15 Dec 2009 11:45
Prispevkov: 226
Aktiv.: 1.20
Kraj: Črnomelj

PrispevekObjavljeno: Čet Sep 29, 2011 11:48 am    Naslov sporočila:  10 bitni AD pretvornika ATMEGA8 Odgovori s citatom

Pozdravljeni!

Prosil vas bi, če bi mi kdo lahko razrožil oz podal kodo za usposobitev 10 bitnega ad pretvornika v MEGA8.

Najlepša hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
robika
Član
Član



Pridružen-a: Pon 05 Apr 2004 20:55
Prispevkov: 281
Aktiv.: 1.19
Kraj: ajdovščina

PrispevekObjavljeno: Čet Sep 29, 2011 1:09 pm    Naslov sporočila:   Odgovori s citatom

V katerem jeziku oz. okolju pišeš. Tukaj je del kode v Bascom AVR

Koda:
Config Adc = Single , Prescaler = Auto

'Now give power to the chip

Start Adc

 

'With STOP ADC, you can remove the power from the chip

'Stop Adc

 

Dim W As Word , Channel As Byte

 

Channel = 0

'now read A/D value from channel 0

Do

 W = Getadc(channel)

Print "Channel " ; Channel ; " value " ; W

Incr Channel

If Channel > 7 Then Channel = 0

Loop

End
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
juref
Član
Član



Pridružen-a: Tor 15 Dec 2009 11:45
Prispevkov: 226
Aktiv.: 1.20
Kraj: Črnomelj

PrispevekObjavljeno: Čet Sep 29, 2011 1:46 pm    Naslov sporočila:   Odgovori s citatom

robika je napisal/a:
V katerem jeziku oz. okolju pišeš. Tukaj je del kode v Bascom AVR

Koda:
Config Adc = Single , Prescaler = Auto

'Now give power to the chip

Start Adc

 

'With STOP ADC, you can remove the power from the chip

'Stop Adc

 

Dim W As Word , Channel As Byte

 

Channel = 0

'now read A/D value from channel 0

Do

 W = Getadc(channel)

Print "Channel " ; Channel ; " value " ; W

Incr Channel

If Channel > 7 Then Channel = 0

Loop

End


aja pozabil sem dopisat Very Happy v C pišem
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.41

PrispevekObjavljeno: Čet Sep 29, 2011 2:04 pm    Naslov sporočila:   Odgovori s citatom

Kje točno se ti je zataknilo?
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
blay44
Član
Član



Pridružen-a: Ned 19 Dec 2010 18:17
Prispevkov: 604
Aktiv.: 3.42

PrispevekObjavljeno: Čet Sep 29, 2011 8:44 pm    Naslov sporočila:   Odgovori s citatom

Tkole. Cja ne poznam, verjetno pa lahko znotraj njega uporabljaš asm.

Najprej v registru ADMUX :
-REFS1 do 0 izbereš referenco(željeno)
-ADLAR poravnavo rezultata
-MUX željeni kanal(pin na portu) Za kanal 5 in 4so omejitve

Register ADCSRA:

-ADEN vklop ADja
-ADSC start ADja
-ADFR neodvisno delovanje(ne porablja ti procesorskega časa!!!!!!! ZAKON)
-ADIF zastavica za prekinitev(ali pretvorba je končana)
-ADIE skok na prekinitveno rutino omogočen
-ADPS prescaler

Register ADCL in ADCH se shrani pretvorba
Prebrati moraš vedno najprej ADCL.
Dobro je pin, ki je uporabljen za AD izločiti iz digitalnega moda
Zadnji bit(low) je skoraj neuporaben. Osem bitna pretvorba pa odlična.


Podobna procedura je na Tinijih, samo manj izbirov pinov Confused

LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Čet Sep 29, 2011 9:29 pm    Naslov sporočila:   Odgovori s citatom

Koda:

#ifndef F_CPU
   #define F_CPU 11059200UL
#endif

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

int delay;
int delay1;

//This function is used to initialize the USART
//at a given UBRR value
void USARTInit(uint16_t ubrr_value)
{

   //Set Baud rate

   UBRRL = ubrr_value;
   UBRRH = (ubrr_value>>8);

   /*Set Frame Format


   >> Asynchronous mode
   >> No Parity
   >> 1 StopBit

   >> char size 8

   */

   UCSRC=(1<<URSEL)|(3<<UCSZ0);


   //Enable The receiver and transmitter

   UCSRB=(1<<RXEN)|(1<<TXEN);


}
//******************************************************************************************
int uart_putch(char ch, FILE *stream)
{
   if (ch == '\n')
    uart_putch('\r', stream);

   while (!(UCSRA & (1<<UDRE)));
   UDR=ch;

   return 0;
}

int uart_getch(FILE *stream)
{
   unsigned char ch;

   while (!(UCSRA & (1<<RXC)));
   ch=UDR; 

   /* Echo the output back to the terminal */
   uart_putch(ch,stream);     

   return ch;
}
//*******************************************************************************************

/* Assign I/O stream to UART */
FILE uart_str = FDEV_SETUP_STREAM(uart_putch, uart_getch, _FDEV_SETUP_RW);

//*******************************************************************************************



void CLK_0()
{

    PORTD = 0b00100000;
    for (delay=0; delay < 10;delay++){}
    }
void CLK_1()
{
    PORTD = 0b01000000;
    for (delay=0; delay < 5;delay++){}
    }

int beri_enkoder(){
    uint8_t i;
    uint8_t encoder=0;
     uint8_t j;

     encoder = 0;
        for(i=0;i<9;i++){
          CLK_1();
        if(PIND & (1<<PD4)){
            j = 1; }

        else {
            j = 0; }

        CLK_0();
        encoder = (encoder + j);
       if(i<8){
        encoder = (encoder << 1);
        }
   
   }
   return(encoder);
}

void ADC_init(int channel)
{
   ADMUX = channel;
   //prescaler na 1MHz/8=125khz
   ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);
   channel = ADC_Read();
}

int ADC_Read(void)
{
   char i;
   int ADC_temp;
   int ADCr =0;

//sbi(ADCSRA, ADEN);
ADCSRA |=(1<<ADSC);
   while(!(ADCSRA & 0x10));
      for (i=0;i<8;i++)
      {
         ADCSRA |=(1<<ADSC);   
         while(!(ADCSRA & 0x10));
         ADC_temp = ADCL;
         ADC_temp += (ADCH <<8);
         ADCr +=ADC_temp;
         }
      ADCr = ADCr >> 3;
//cbi(ADCSRA,ADEN);
return ADCr;
}

double Beri_tlak(void)
{
   double ADC_vrednost;
   double Vout;
   double tlak;
   
   ADC_vrednost = ADC_Read();
   Vout = (5*ADC_vrednost) / 1024;

   tlak = ((0.76+Vout) / 0.05295);
   tlak = (tlak*10)+31;
   
   return (tlak);
}



int main() {
//    double tlak;      
    int encoder;
        stdout = stdin = &uart_str; // to poveže uart z STDIO.H !!!!!
    DDRD=0b01101100; //PORTD2 in PORTD3 sta izhoda, ostalo so vhodi
      USARTInit(5);    //UBRR = 5 =11059200mhz & 115200 baud
//    fdevopen(out,0,0); //important if using stdio.h functions    
//    CLK_0();
//    for (delay=0; delay < 2000;delay++){}  // nekaj maleag zakasnitve
   
//   ADC_init(1);

   while(1)
   {
   
//   tlak=Beri_tlak();
//    printf("%f \n",tlak);
   //printf("mBar\n");

//   encoder = beri_enkoder();   
   printf("%d \n",encoder);
//    _delay_ms(10000);

   

   }
   

}



Poberi kar rabiš. Funkcija ADC_init(1) inicializira ADC kanal 1, s funkcijo Beri_tlak() pa bereš vrednost ADC (tam je še nekaj matematike, ki je ti najbrž ne boš potrebval). S funkcijo printf() pa pošlješ preko UARTa na PC.

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sadida
Član
Član



Pridružen-a: Pet 17 Apr 2009 12:53
Prispevkov: 636
Aktiv.: 3.23
Kraj: Zasavje

PrispevekObjavljeno: Pet Sep 30, 2011 10:04 am    Naslov sporočila:   Odgovori s citatom

Koda:
int ADpretvorba()
{
   int rezultat;

   ADCSRA |= 1<<ADSC;            //zaženi ad pretvorbo
   while (ADCSRA & (1<<ADSC)) {}   //poèakaj, da se pretvorba konèa
   rezultat=ADC;               //preberi rezultat
   return rezultat;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
juref
Član
Član



Pridružen-a: Tor 15 Dec 2009 11:45
Prispevkov: 226
Aktiv.: 1.20
Kraj: Črnomelj

PrispevekObjavljeno: Pet Sep 30, 2011 10:49 am    Naslov sporočila:   Odgovori s citatom

hvala lepa vsem za odgovore Very Happy Morem se malo naučiti da bom kaj pametnega naredil Very Happy

Še enkrat hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 494 dni


Powered by phpBB © 2001, 2005 phpBB Group