Arduino platforma

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

nikorenic1
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 22-04-2013, 19:39

Re: Arduino platforma

Post by nikorenic1 »

Da lakše je pisat na port, ali port (konkretno portD) ima 8 bitova. A moj dac je 10 bitova, tako da trebam koristiti 10 bitova (10 pinova).

Netreba biti sinus, može biti i pila ili nešto drugo. Samo da vidim da dobivam dobar oblik na izlazu.
Ovo sa potenciometrom štima.
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Arduino platforma

Post by Maki »

Nešto mi je sinulo, trebalo bi raditi

Code: Select all

if((dac<512 && dac>255) || (dac>767))
           portx.y=1;
if(dac>511)
           portx.z=1;
Gdije ti je dac vrijednost koju želiš "ispisati" na izlazu konvertera...

Edit:
y je 9bit, a z10bit
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Arduino platforma

Post by pedja089 »

Zar u tom c-u nema nesto za rad sa bitovima direktno. Npr dac.9.
U pic basicu se to resava PORTB.1=dac.9, i to su 4 asemblerske instrukcije. Mnogo brze nego ovo...
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Arduino platforma

Post by Maki »

Nisam baš radio u C-u (konkretno Arduinu), možda postoji mogućnost, neka proba.
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: Arduino platforma

Post by InTheStillOfTheNight »

pedja089 wrote:Zar u tom c-u nema nesto za rad sa bitovima direktno. Npr dac.9.
U pic basicu se to resava PORTB.1=dac.9, i to su 4 asemblerske instrukcije. Mnogo brze nego ovo...
U C-u je vrlo jednostavno raditi s bitovima, samo izgleda malo čudno i nejasno kada se tipka... Za rad s bitovima najbolje je koristiti pomak lijevo, pomak desno, i operacije AND, OR, XOR, Prvi komplement...

U C-u nema ništa za direktan rad s bitovima, ali mi inače impolementiramo nešto ovakvo:

Code: Select all


// 1 guras lijevo za broj bita i radis ILI operaciju s registrom
#define SetBit(reg, bit) (reg |= (1<<bit)) 

// 1 guras lijevo za broj bita, napravis prvi komplement da okrenes stanje 
// bitova i izvrsis AND operaciju s registrom
#define ClearBit(reg, bit) (reg &=~(1<<bit))

Ako imaš neku varijablu tipa unsigned int (16 bites) i u nju pohraniš 10 bitnu vrijednost ADC-a, onda na razini bitova radiš ovo:

Code: Select all


// Uzmeš varijablu u kojoj je pohranjen 
// ADC i izvršiš AND operaciju sa 0xFF da dobiješ 
// samo 8 desnih bitova koje upisuješ na PORTA
PORTA = (my_adc & 0xFF);

// Sada uzmeš istu varijablu, ali poguraš bitove za 8 mjesta udesno 
// te izvršiš AND operaciju sa 0x03 kako bi na port upisao samo 2 desna bita
PORTC = ((my_adc >> 8) & 0x03);
Ono što će te dalje mučiti je pitanje:
Kako koristiti ostalih 6 linija PORTC-a jer ćeš drugom naredbom svih 6 bitova postaviti na nulu.

Code: Select all

//........
#define SetBit(reg, bit) (reg |= (1<<bit)) 
#define ClearBit(reg, bit) (reg &=~(1<<bit))

void WritePorts(unsigned int my_adc){
    PORTA = (my_adc & 0xFF);
    if((my_adc >> 8) & 0x01) 
        SetBit(PORTC, 0);
    else
        ClearBit(PORTC, 0);

    if((my_adc >> 8) & 0x02) 
        SetBit(PORTC, 1);
    else
        ClearBit(PORTC, 1);
}
Nisam čitao sve što ste pisali, ali mislim da vas je ovo zanimalo, valjda... :azdaja:

PS, mislim da AVR ima implementirane neke pretprocesorske naredbe za dizanje i spustanje jednog bita, ali ja koristim ove svoje SetBit() i ClearBit()
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: Arduino platforma

Post by InTheStillOfTheNight »

I evo još jedan način da ne moraš raditi if else

Code: Select all

void WritePorts(unsigned int my_adc){
    unsigned char my_port;
    // ako slučajno pišeš po portu u ISR-u, obavezno iskljuci globalne prekide
    cli();

    // upišeš prvih 8 bitova u PORTA
    PORTA = (my_adc & 0xFF);

    // učitaš stanje porta u varijablu
    my_port = PORTC;               

    // u varijabli porta C staviš 2 desna bita na 0 da ih možeš dići
    // ILI operacijom
    my_port &= ~(0x03);                     

    // napraviš update ona 2 bita u varijablu porta C (ILI operacija)
    my_port |= ((my_adc >> 8) & 0x03); 

    // vratiš varijablu u port C
    PORTC = my_port; 

    // uključiš globalne prekide
    sei();
}
Nisam testirao niti jedan primjer, ali mislim da se nisam zeznuo nigdje.
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: Arduino platforma

Post by InTheStillOfTheNight »

I evo i pretprocesorska naredba u kopiranje jednog bita:

Code: Select all

#define Copy(to, bit, from, bit1) if((from>>bit1)&0x01) \
                     to |= (1<<bit); else to &=~(1<<bit);

// kopiraj 9 bit iz varijable my_adc u PORTC na lokaciju 0
Copy(PORTC, 0, my_adc, 9);

// kopiraj 10 bit iz varijable my_adc u PORTC na lokaciju 1
Copy(PORTC, 1, my_adc, 10);
Može se i sa funkcijom napraviti, ali evo, dosta primjera na način kako se to radi u C-u.
InTheStillOfTheNight
nikorenic1
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 22-04-2013, 19:39

Re: Arduino platforma

Post by nikorenic1 »

Hvala svima na komentarima ;)
Uspio sam generirati signal u arduinu i postaviti ga na DAC i on dobro radi.

No kad hoću pročitati ulazni signal (10 bit ADC) te ga postaviti na DAC onda stvar ne šljaka.

Koristim dva porta, u jednoga upisujem 6 a u drugoga 4 bita..
Evo koda.

Code: Select all

int val = 0;
int analogPin_signal = 0;

void setup() 
{ 
        
  /*
 * pinovi 2-7 PORTD, pinovi 8-11 PORTB
 * pinovi 0,1 se koriste za serisku komunikaciju
*/
  
     pinMode(2, OUTPUT);        
     pinMode(3, OUTPUT);         
     pinMode(4, OUTPUT); 
     pinMode(5, OUTPUT); 
     pinMode(6, OUTPUT);
     pinMode(7, OUTPUT); 
     pinMode(8, OUTPUT);
     pinMode(9, OUTPUT); 
     pinMode(10, OUTPUT);
     pinMode(11, OUTPUT); 
        
} 

void loop() 
{ 

          val = analogRead(analogPin_signal);    
                 // ulaznu vrijednost pohranjujem u varijablu 
                 // vrjednost 10 bita  0000 00xx xxxx xxxx   
                                                   
          PORTD=(val << 2);                     
              //pomak 2 mjesta u ljevo 0000 xxxx xxxx xx00
              // u portD upisujem 6 bita
              // I operacija nije potrebna jer su ostali bitovi prazni 

                                      
          PORTB =(val >> 6);                     
                 // pomak 2 mjesta u desno xx00 0000 xxxx xxxx
                // u portB upisujem 4 bita 


          delayMicroseconds(10);        
   
}
Evo kako izgleda sinus na 100 Hz.
http://postimg.cc/image/f1rpp9s7j/
Evo ga na 1kHz.
http://postimg.cc/image/c6emieo7j/

Evo i simulacijska shema u proteusu.
http://speedy.sh/tw4r3/ADC-DAC.rar
nikorenic1
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 22-04-2013, 19:39

Re: Arduino platforma

Post by nikorenic1 »

Znam u čemu je stvar. Kad se koristi analogRead funkcija, maksimalna frekvencija uzorkovanja je 9 kHz.
(što se vidi i na signalu od 1kHz)

Meni bi to bilo i dosta da samo učitavam jedan analogni ulaz, ali trebam najmanje 2 analogna ulaza čitati (Setpoint, Input) i onda još vrtit PID algoritam..

Ima ovdje način da se postigne uzrokovanje od 40kHz. Ali onda se može koristiti samo jedan analogni ulaz..
http://www.instructables.com/id/Arduino ... -of-40kHz/

Ima ko kavu ideju kak to izvesti ?
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: Arduino platforma

Post by InTheStillOfTheNight »

I operaciju uvijek radis, bez obzira jel potrebna ili ne, čisto da napomeneš compileru što radiš... ne brini, nece ti compiler to napraviti kao I operaciju nego ce koristiti asm instrukcije sbi i cbi tako da od vise teksta glava ne boli.

Uglavnom, ako hoces dirati po freq ADC-a trazi po datoteci u
Arduino/hardware/arduino/cores/arduino/wiring.c ili tako nesto....
Potrazi funkciju init, ako se ne varam na kraju se podešava freq ADC-a, a ako nije tu mozes probati u wiring_analog.c

Inace AVR-ov ADC mozes clockati sa 1 Mhz i dobro ce citati, dakle samo to podesi u initu. Nisam sada doma pa ti iz glave govorim datoteke jer sam prosao citav taj arduino lib pa mi je dosta poznat.
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: Arduino platforma

Post by InTheStillOfTheNight »

Evo, provjerio sam,

Code: Select all

#if defined(ADCSRA)
	// set a2d prescale factor to 128
	// 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
	// XXX: this will not work properly for other clock speeds, and
	// this code should use F_CPU to determine the prescale factor.
	sbi(ADCSRA, ADPS2);
	sbi(ADCSRA, ADPS1);
	sbi(ADCSRA, ADPS0);

	// enable a2d conversions
	sbi(ADCSRA, ADEN);
#endif
File se zove: wiring.c i na kraju se podešava clock ADC-a... Kao što vidiš arduino je podesio 125khz clock, a AVR-ov ADC ce raditi i na 1 Mhz. Ako ne znas to podesiti na 1 Mhz pitaj pa cemo i to napisati.

Sto se tice proslog posla vidim da izjednacavas citave portove sa mjerenjem ADC-a. U tome programu te portove ne mozes za nista vise koristiti jer ih stalno prepisujes... Ima 3 primjera gore kako to pravilno napraviti, a i onima koji tipkaju u c-u daleko će biti jednostavnije snaći se ako je sve dobro šiftano i maskirano AND operacijom. Odaberi koji hoces od moja 3 primjera i koje hoces portove pa ti i to natipkam pravilno...

Još jedna stvar. U datasheetu je većinom navedeno da ADC radi do 200 ili 250 kHz, ali ako malo bolje kopaš po ATMEL-ovoj stranici pronaći ćeš dosta teksta o tome da može raditi i na 1 kHz. Probao sam podići freq na 1 khz i adc mi radi dobro...

LP
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: Arduino platforma

Post by InTheStillOfTheNight »

Code: Select all

#if defined(ADCSRA)
	sbi(ADCSRA, ADPS2);		// set a2d prescale factor to 16 (16 MHz / 16 = 1 MHz)
	sbi(ADCSRA, ADEN);		// enable a2d conversions
#endif
Evo za ADC clock 1 Mhz... U arduino-u ne mozes napraviti save jer je file zasticen pa napravi cut wiring.c na desktop, postavi gornju konfiguraciju umjesto one stare Arduino, napravi save i vrati file u arduino/core
InTheStillOfTheNight
nikorenic1
Pocetnik na forumu
Pocetnik na forumu
Posts: 25
Joined: 22-04-2013, 19:39

Re: Arduino platforma

Post by nikorenic1 »

Imao sam nekih obaveza pa me nije bilo dosta dugo na forumu.

@InTheStillOfTheNight, hvala na objašnjenju uspio sam povećat frekvenciju ;)
User avatar
morski_pas
Odlično uznapredovao
Odlično uznapredovao
Posts: 639
Joined: 07-03-2011, 23:58
Location: Rijeka

Re: Arduino platforma

Post by morski_pas »

evo možda će nekome trebati simulacija ARDUINO platformi u PROTEUSU
Attachments
arduino.jpg
arduino.jpg (78.7 KiB) Viewed 14846 times
ArduinoLibrary for Proteus.rar
(4.59 KiB) Downloaded 497 times
User avatar
morski_pas
Odlično uznapredovao
Odlično uznapredovao
Posts: 639
Joined: 07-03-2011, 23:58
Location: Rijeka

Re: Arduino platforma

Post by morski_pas »

ujedno mi treba mala pomoć ,pokušavam upogoniti ovaj kontroler za akvarij ali ni na proto board niti u proteusu simulaciji ne rade tipke za kontrolu u prilogu je arduino fajl i simulacija u proteusu
Attachments
simulacija.zip
(12.32 KiB) Downloaded 474 times
aquarium.zip
(7.15 KiB) Downloaded 487 times
kontroler akvarij.jpg
kontroler akvarij.jpg (73.72 KiB) Viewed 14844 times
User avatar
bob4
Stariji član
Stariji član
Posts: 2572
Joined: 31-01-2010, 16:12
Location: Kutina

Re: Arduino platforma

Post by bob4 »

Vidim ja; starci :lol: krenuli na Arduino......i ja ga naručio :wink: .
Sad kad Noćni krene ; :roll: ima svi da ga slušamo ovako :shock:
User avatar
morski_pas
Odlično uznapredovao
Odlično uznapredovao
Posts: 639
Joined: 07-03-2011, 23:58
Location: Rijeka

Re: Arduino platforma

Post by morski_pas »

a hebi ga moraš biti u trendu ja svoj dobio pa što da skuplja prašinu :lol: , i naravno noćni spremi se na jedno predavanja ako treba dolazim kod tebe u ZG :wink:
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1627
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: Arduino platforma

Post by WhiteHead »

Ma ima da vas ispraši.....
Ako kaniš pobijediti, ne smiješ izgubiti
User avatar
morski_pas
Odlično uznapredovao
Odlično uznapredovao
Posts: 639
Joined: 07-03-2011, 23:58
Location: Rijeka

Re: Arduino platforma

Post by morski_pas »

inače cijeli projekt je na ovoj stranici
http://wiki.flav.com/wiki/Aquarium_Controller
Cosa
Napredujem
Napredujem
Posts: 177
Joined: 09-08-2009, 10:55
Location: Hrvatska

Re: Arduino platforma

Post by Cosa »

Što se tipki tiče, treba spojiti AREF na +5V .
Valjda ti je nekako promaklo, jer imaš na shemi koja je na ovoj stranici.

Piše i tamo gdje je opisan rad senzora TMP36: "The supply voltage is used as reference for the Arduino AD converter".
Također u samome kodu imaš
// If you want to set the aref to something other than 5v
analogReference(EXTERNAL);
Post Reply