Se afișează postările cu eticheta atmega8. Afișați toate postările
Se afișează postările cu eticheta atmega8. Afișați toate postările

luni, 28 iunie 2010

DS1307 RTC - ceas timp real

DS1307 RTC - ceas de timp real

Am nevoie pentru un proiect de un ceas de timp real (real time clock). Cel mai accesibil a fost DS 1307+


Schema de conectare la Arduino, realizata cu Fritzing, arata cam asa:

Deocamdata l-am pus pe breadboard, urmeaza sa-l trec pe o placuta de circuit:



#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>

int rtc[7];

void setup()
{
Serial.begin(9600);
/*
RTC.stop();
RTC.set(DS1307_SEC,1);
RTC.set(DS1307_MIN,05);
RTC.set(DS1307_HR,10);
RTC.set(DS1307_DOW,2);
RTC.set(DS1307_DATE,28);
RTC.set(DS1307_MTH,6);
RTC.set(DS1307_YR,10);
RTC.start();
*/
}

void loop()
{
RTC.get(rtc,true);

Serial.print(rtc[4]);
Serial.print("-");
Serial.print(rtc[5]);
Serial.print("-");
Serial.print(rtc[6]);
Serial.print(" ");
switch(rtc[3]) {
case 1:
Serial.print("Duminica ");
break;
case 2:
Serial.print("Luni ");
break;
case 3:
Serial.print("Marti ");
break;
case 4:
Serial.print("Miercuri ");
break;
case 5:
Serial.print("Joi ");
break;
case 6:
Serial.print("Vineri ");
break;
case 7:
Serial.print("Sambata ");
break;
default:
break;
}
Serial.print(rtc[2]);
Serial.print(":");
Serial.print(rtc[1]);
Serial.print(":");
Serial.print(rtc[0]);
Serial.println();

delay(1000);
}


Pentru setare initiala data si ora se scot comentariile din setup().
Biblioteca DS1307 se gaseste aici si se copiaza, ca de obicei, in folderul libraries al kitului Arduino.

Componentele necesare pot fi gasite, de exemplu, aici:
RTC
Quartz
Suport baterie

Update - 1 iulie 2010 : am facut montajul pe o bucatica de stripboard si nu a mai pierdut nici macar o secunda in 24 de ore ;-) intarzierea era de la faptul ca se misca cristalul...

marți, 22 iunie 2010

Schema pentru Arduino "de criza"

Daca tot au trecut vreo doua luni de cand am facut montajul (si de cand il folosesc aproape zilnic) m-am gandit ca ar fi cazul sa desenez si schema lui ;-)

Neavand niciun fel de experienta in materie de CAD, cu atat mai putin in ceea ce priveste schemele electronice, am incercat mai multe programe: Eagle, TinyCAD, KiCAD etc.

Pana la urma m-am oprit la ExpressSCH, parte dintr-un program gratuit numit ExpressPCB.
Cred ca este cel mai usor de folosit, deoarece in doua ore si ceva am reusit sa fac schema de mai jos, chiar daca nu mai lucrasem cu astfel de programe...



Sper ca nu am facut prea multe greseli, daca cineva incearca sa reproduca montajul dupa aceasta schema ar face bine sa verifice de doua ori ;-)

Cateva observatii:
1. daca chipul nu este programat cu bootloader trebuie folosit un programator ISP
2. daca punem bootloader se poate utiliza cu un cablu serial realizat asa cum l-am descris aici; inainte de programarea in acest mod trebuie apasat butonul Reset cam 3-4 secunde (incercati diverse variante pana reusiti...)
3. la montajul din imagine am folosit terminale bloc (cu suruburi), dar pentru reducerea costului merge sa utilizati orice fel de conectori (bareta etc.)
4. realizarea pe placa de circuit nu e chiar la nivel profesional (hmm, hmm, hmm) ca sa zic asa ;-)



marți, 11 mai 2010

Convertor USB la Serial "de criza" pentru Arduino

Convertor USB la Serial "de criza" pentru Arduino (si nu numai...)


Am modificat un pic placa din postarea anterioara pentru a putea comunica serial cu un calculator care dispune doar de port USB.

In acest scop sunt necesare urmatoarele:
1. Cablu de date Nokia tip DKU-5 sau CA-42. Important este sa aiba mufa de USB mai lunga si/sau mai groasa decat normal, sau o cutiuta mica si neagra la mijlocul cablului ;-)
2. Trei rezistente (1K, 10K, 15K)
3. Cutter, banda izolatoare, multimetru

Ideea de baza este ca aceste tipuri de cabluri contin deja un Prolific 2303 si un MAX232. Pretul de achizitie variaza intre 9-10 RON la importatori si cca. 15-20 RON la diversi comercianti, care vor fi fericiti sa scape de ele... Cred ca de ocazie, de la cineva care a avut un Nokia mai vechi, se poate obtine mult mai ieftin :D

Un tutorial pe larg gasiti la uC Hobby
Pinout-ul pentru aceste cabluri il gasiti aici.

Procedura:
1. Se verifica prezenta circuitelor in cablu.
Se introduce cablul in mufa USB a calculatorului. In Linux (Kernel 2.4.31 sau mai nou) exista deja drivere. La Windows va cere driverele. Daca nu le-ati primit pe CD impreuna cu cablul se pot descarca de aici: PL-2303 USB to Serial Bridge (H, HX, X) Installshield Driver Setup Program
Dupa instalare ar trebui sa gasim in Control Panel un port COM cu numele "Prolific".
2. Se scoate cablul din calculator si se taie in partea dinspre conectorul pentru telefon, NU CEL USB, lasand cca. 10 cm de cablu pentru identificarea firelor.

3. Se identifica cu multimetrul 3 fire (Rx, Tx si GND) conform tutorialului din linkul de mai sus sau conform pinout-ului. Ne intereseaza firele care duc la pinii 6, 7 si 8 din imagine.
Optional se testeaza corectitudinea ca loopback (legand intre ele Rx si Tx) cu ajutorul programului Hyperterminal sau asemanantor.

4. Se conecteaza Rx cablu la Tx controller prin rezistenta de 10K.
5. Se conecteaza Tx cablu la Rx controller prin rezistenta de 1K.
6. Se conecteaza GND cablu la GND placa prin rezistenta de 15-22K.

Avertisment: verificati, verificati, verificati!!!

vineri, 7 mai 2010

Arduino "de criza" si dimensiunea sketch-urilor

Dupa ce am terminat placa de mai jos, potrivita perioadei actuale "de criza" (cost total cca. 20 RON) am incercat sa vad cat ocupa din memoria limitata (doar 8KB) acelasi program compilat cu mai multe medii de dezvoltare.
Pe placa este un ATmega8, frecventa externa 16MHz, fara bootloader (am folosit pentru programare un Pololu USB programmer, achizitionat de aici, dar merge la fel de bine si cu vechiul meu programator pe port paralel ;-)



int ledPin = 13;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop()
{
digitalWrite(ledPin, HIGH); // set the LED on
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, LOW); // set the LED off
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, HIGH); // set the LED on
delay(1500); // wait for 1.5 seconds
digitalWrite(ledPin, LOW); // set the LED off
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, HIGH); // set the LED on
delay(500); // wait for 0.5 seconds
digitalWrite(ledPin, LOW); // set the LED off
delay(1500); // wait for 1.5 seconds
}


Restul de programe sunt cam la fel, fara niciun fel de optimizare :D

Rezultate:
Arduino - 782 bytes
BASCOM - 252 bytes
WinAVR - 206 bytes

Urmeaza sa mai incerc in assembler si cu alte medii de dezvoltare pentru care am gasit versiuni demo (IAR C, FastAVR, CodeVision, AVRco, MikroC, MikroPascal, MikroBasic etc.)

Edit: Assembler - 188 bytes (cu cate o rutina pentru 0.5 si una pentru 1.5 secunde... cred ca iesea mai mic daca o apelam de 3 ori pe cea de 0.5)

Edit: IAR Embedded Workbench (programul scris in C din WinAVR transformat pentru IAR) - 158 bytes
Hmmm... se pare ca rutinele mele in limbaj de asamblare aveau nevoie de optimizare...
;-)


In concluzie incepe sa-mi placa din ce in ce mai mult IAR Embedded Workbench, mai ales ca au fost singurii dintre cei la care m-am inregistrat care mi-au trimis email sa afle cum imi place programul si ce intrebari si sugestii am :D