Rabu, 19 Maret 2014

7 segment interfacing



7 segment display adalah salah satu yang biasa digunakan sebagai display dalam dunia elektronik. Pengoperasiannya mudah dan visual indikasi yang bagus yang digunakan dalam rangkaian berbiaya rendah, seperti aplikasi untuk timer, counter, speedometer dll.

Display 7 segment display adalah kumpulan dari 7 led dalam satu paket, Masing masing led dihubungkan dengan satu terminal ke pin nya sendiri di luar dari package dan terminla led yang lain terhubung common dengan semua led lainnnya. Pin common akan membuat satu semua katoda ( negative terminal ) atau semua anoda ( positive terminal ) dari led di dalam 7 segment. Jadi akan bergantung kontruksinya bisa "common cathode" atau " common anode"



Bagaimana mengaplikasikan polarity ke common pin 7 segment dengan benar . Kebutuhan pin 7 segment low atau high bergantung dari type displaynya.
dibawah ini table yang mewakili untuk menampilkan angka dari 0-9 dalam nilai hexadecimal.



Interfacing 7 segment display ke microcontroller, awalnya menggunakan decoder IC dan mengirim dalam BCD. Tetapi microcontroller telah menghilangkan  metode tersebut dan digantikan dengan program untuk kemudian dikirim ke display 7 segment.
Display common anode adalah yang paling biasa untuk interfacing dengan microcontroller 8051. Hubungkan pin a sampai g dan pin dot 7 segment display ke 8 bit port microcontroller. kirim hex data ke display yang mewakili angka. beri delay dan ulangi jika ingin menampilkan angka yang lain.



Tapi bagaimana jika ingin menghubungkan 4 seven segment ke microcontroller, tentunya akan menghabiskan IO apabila satu satu. Kalau dihitung jumlahnya 4 X 8 jalur data = 32 IO. Untuk menghemat IO disini akan digunakan model serial dan scanning system sehingga jumlah IO yang digunakan 4 jalur scanning dan 3 jalur untuk serial. Cukup menghemat bukan, cuma akan timbul kendala di pemrogamannya yang rumit. Rangkaiannya seperti dibawah ini :



Konsep dari serial scanning system sebenarnya sederhana. Pertama kita kirim data yang akan ditampilkan ke 7 segment secara serial kemudian bersamaan dengan itu hidupkan 7 segment yang dituju untuk data tersebut. Hal ini dilakukan secara cepat sehingga seolah olah 7 segment menyala terus. Apabila dilakukan secara lambat scanningnya maka akan terlihat 7 segment hidup mati.

Dibawah ini ditampilkan rngkaian serial scanning 7 segment yang telah dikombinasikan dengan 2 switch untuk setting up/down,1 switch untuk simulasi input counter up, 1 switch untuk reset 0 apabila actual telah mencapai nilai setting. Dan buzzer sebagai outputnya. Jadi totalnya 7 OUT 7 segment+ 4 IN switch + 1 OUT buzzer.



Diskrisipsi rangkaian ini adalah counter up 2 digit. 2 digit untuk setting dan 2 digit untuk actual. Pertama tama disetting nilai counternya settingnya mis: 6 . Apabila input counternya masuk ( diwakili oleh PB SW ) dan kemudian mencapai nilai setting = 6 maka input setting selanjutnya akan diabaikan dan buzzer akan ON selama 3 detik. Untuk mereset kembali nilai actualnya tekan PB SW reset. Penyetingan nilai setting nya hanya bisa dilakukan pada saat nilai actualnya masih 0, apabila sudah ada nilai actualnya setting up/down tidak berfungsi lagi. Rangkaian ini bisa di expand sesuai kebutuhan misal: 4 digit setting dan 4 digit actual dan masih perlu penambahan memory agar nilai setting tidak kembali ke 0 apabila power OFF ataupun penambahan lainnya sesuai aplikasinya.

















Senin, 17 Maret 2014

Koneksi Arduino dengan program Stamplot




Stamplot adalah aplikasi untuk ploting, indikator, data logging, dan serial data control dari microcontroller. Konfigurasi penuh dari microcontroller atau melalui PC berbasis macro files.

Basic stamp dari parallax sangat favorite, hampir dengan semua microcontroller yang berkomunikasi dengan PC menggunakan serial port.



Stampplot sangatlah serbaguna :

1. 8 sample yang siap digunakan untuk monitoring dan kontrol

2. Mem plot sampai 10 analog input

3. Mem plot 8 chanel digital

4. Men Save file plot dan jpg image.

5. Template data ke dalam ducument lain

dll. bisa dibaca sendiri di situs resminya disini.

Disini saya mencoba untuk menghubungkan Arduino severino dengan Stampplot, karena arduino mendapat julukan stampplot killer.
Dari situs stampplot/makerplot ada beberapa program sample yang sudah bisa langsung dipakai ke arduino
filenya dalam bentuk .txt. Caranya tiggal di copy dan dipaste kan ke arduino program. Dibawah ini programnya :

/*
MP_BasicInteractiveControl
Performs basic interaction with MakerPlot Interactive Interface to
read the slider for the setPoint and control virual LED0 if alarming.

Plots analog values of input and setpoint and 
digital values of switches and LED state.
 
 The circuit:
 * potentiometer connected to A0.
   Center pin of the potentiometer goes to the analog pin.
   side pins of the potentiometer go to +5V and ground
 * LED connected from digital D9 to ground
 * Pushbutton swithes on D2 and D3 going to ground.
 
 created July 2012
 by Martin Hebel, SelmaWare Solutions
 
 This example code is in the public domain.
*/

const int analogInPin = A0;   // Analog input pin that the potentiometer is attached to
const int LEDpin = 9;         // Analog output pin that the LED is attached to
const int SW1pin = 2;         // Pushbutton switch, raise setpoint
const int SW2pin = 3;         // Pushbutton switch, lower setpoint

int sensorValue = 0;         // value read from the pot
int setPoint = 500;          // Initial value of setPoint
int SW1state = 0;            // Store state of SW1
int SW2state = 0;            // Store state of SW2
int LEDstate = 0;            // Store state of LED

void setup() {
  // configure hardware
  pinMode(SW1pin, INPUT_PULLUP);  // Enable pull-ups on switches
  pinMode(SW2pin, INPUT_PULLUP);  
  pinMode(LEDpin, OUTPUT);        // set LED to be an output pin
  // initialize serial communications at 9600 bps:
  Serial.begin(9600); 
  config_MP();                    // function to configure MakerPlot
}

void loop() {
  measureData();       // measure values
  read_MPSlider();     // Read slider value from MakerPlot
  buttonControl();     // Use buttons to also adjust setpoint
  control();           // control based on settings
  plotData();          // diplay/plot values  
  // wait 100 milliseconds before the next loop
  delay(100);                     
}

void measureData()
{
   // read the analog in value
  sensorValue = analogRead(analogInPin);            
 
void read_MPSlider()
{
  flushBuffer();                    // Ensure buffer empty
  Serial.println("!READ (Slider)");   // Request the slider's value
  setPoint = Serial.parseInt();     // Accept returned data
}

void buttonControl()
{  // Check states of pushbuttons, it pressed change setpoint up or down    
  SW1state = digitalRead(SW1pin);
  if (SW1state == 0) 
  {
    setPoint+=10;                // add 10 to setPoint
    Serial.print("!O Slider= "); // Update slider with new setpoint
    Serial.println(setPoint);
  }
  SW2state = digitalRead(SW2pin);  
  if (SW2state == 0) 
  {
    setPoint-=10;                // subtract 10 from setPoint
    Serial.print("!O Slider= "); // Update slider with new setpoint
    Serial.println(setPoint);       
  } 
}

void plotData()
{
  // print the analog values formatted for MakerPlot
  Serial.print(sensorValue);  // send 1st value      
  Serial.print(",");          // send comma delimiter
  Serial.println(setPoint);   // send 2nd value with carriage return
  
  // print the digital values formatted for MakerPlot
  Serial.print("%");          // send binary indicator
  Serial.print(SW1state);     // send 1/0 for SW1
  Serial.print(SW2state);     // send 1/0 for SW2
  Serial.println(LEDstate);   // send 1/0 for LED with carriage return 
}

void control()
{
   // Check pot value against setpoint, if above light LED, take snapshot
  if (sensorValue > setPoint)
     LEDstate = 1;
  else
    LEDstate = 0;
   
  digitalWrite(LEDpin,LEDstate);
  Serial.print("!O LED0=");              // set up to control virtual LED0
  Serial.println(LEDstate);              // send value with CR
}
void config_MP()
{
  delay(2000);                             // allow connection to stabilize
  Serial.println();                        // send in case garbage in queue
  Serial.println("!RSET");                 // Reset the plot
  Serial.println("!O txtSW*= ");           // Clear all switch text boxes 
  Serial.println("!O txtLED*= ");          // Clear all LED text boxes 
  Serial.println("!O txtSlider=SetPnt");   // Label slider
  Serial.println("!O Slider.Max=1000");    // Set slider max to 1000
  Serial.println("!O txtLED0=Alarm");      // Label LED0 for alarm
  Serial.println("!O LED*=0");             // Turn all LEDs off
    // clear constant drawings and place constant text on plot
  Serial.println("!CLRC(CR)@TEXT 30A,105A,1.5A,(Blue),Basic Interaction with Arduino!");
}

void flushBuffer()
  Serial.flush();              // flush serial buffer (may not always flush?)
  while (Serial.available())   // manually empty as well, read as long as bytes in there
    Serial.read();
}

dari keterangan progamnya ;
 * potensio dihhubungkan ke A0.
   Center pin dari potensio ke analog pin.
   sisi kanan dan kiri  potensio ke +5V and ground
 * LED dihubungkan ke digital pin 9 to ground ( bisa dirubah programnya ke pin 13, jadi sudah tdk perlu           wiring LED lagi )
 * Pushbutton switch ke D2 and D3 com ground.
seperti ini :




Kemudian kita upload programnya ke arduino. Ternyata cukup mudah, tidak ada hambatan sama sekali rangkaian dan program bekerja sangat baik. Tidak salah jika arduino dijuluki stampplot killer.

Sample programnya tidak hanya satu, kemudian juga ada video tutorialnya. thanks Arduino & Stampplot








Sabtu, 15 Maret 2014

Membuat Arduino Severino


Arduino severino adalah board yang berbiaya rendah cocok untuk pelajar, hobbyists dan membuat project sederhana.Berikut adalah project membuat arduino sendiri. Pertama tama download arduino severino s3v3 project di : http://arduino.cc/en/Main/ArduinoBoardSerialSingleSided3#.UyR3Tz-Sz9c . Semua document dari manual , schematic dan PCB dalam eagle dan softwarenya ada.

Buatlah PCB nya jika tidak bisa membuat sendiri bisa memesan ke pcb maker kemudian beli komponennnya. kira-kira biaya yang diperlukan sekitar 102 rb rupiah ( bergantung dari dapat harga komponennya )

Setelah komponen semua terpasang tinggal memasukkan bootloadernya ke microcontroller. Disini kita bisa menggunakan ICSP terminal yang ada di board menggunakan kabel paralel. uploadernya bisa menggunakan PonyProg atau IspPgm atau bisa atmega8 nya di flash ke programer lain. berikut caranya :


  1. Buka Ponyprog kemudian open file :



   2. Pilih yang ATmegaBOOT-prod-firmware-2009-11-07.hex
   3. Write All
   4. Setting fuse bit, Disini harus hati hati. Untuk bootloader atmega8 setting fusebitnya ada di file readme.txt

untuk di Ponyprog nya :

  5. Write
  6.  Finish, Tinggal dicheck apakah arduino severinonya berfungsi / tidak
  
buka software arduino exe yang telah didownload

buka file example basic : blink


Pilih file-Upload : Jika proses transfer berhasil akan muncul tulisan  " Done Uploading ". tanpa ada  error message.

Apabila rangkain dan bootloader yang tertanam berhasil maka led yang terpasang di pin13 ( kaki 19 dari atmega8) akan berkedip flip flop 1s. Untuk proses uploadnya sudah menggunakan board arduino sendiri dengan rs232 cable straight 4 kable di kaki 2,3,4,5 ( bisa dibuat sendiri ), dihubungkan ke comm1 dari PC.
disini kita sudah tidak perlu mensetting fuse bitya lagi, jadi hanya membuat program  di arduino kemudian compile dan upload.

Aplikasi:
Untuk arduino ini bisa digunakan bersama software stamplot/makerplot, dimana input autput dari arduino dapat dimonitor dan dicontrol dari PC sebagai HMI/SCADA.

0pen Source
Hardware maupun software Arduino adalah open source. Artinya kita bisa membuat tiruan atau clone atau board yang kompatibel dengan board Arduino tanpa harus membeli board asli buatan Italy. Kalaupun kita membuat board yang persis dengan desain asli, kita tidak akan dianggap membajak (asalkan tidak menggunakan trade mark ‘Arduino’).

Tidak memerlukan chip programmer
Chip pada Arduino sudah dilengkapi dengan bootloader yang akan menangani proses upload dari komputer. Dengan adanya bootloader ini kita tidak memerlukan chip programmer lagi, kecuali untuk menanamkan bootloader pada chip yang masih blank.

Koneksi USB
Sambungan dari komputer ke board Arduino menggunakan USB, bukan serial atau parallel port. Sehingga akan mudah menghubungkan Arduino ke PC atau laptop yang tidak memiliki serial/parallel port.

Fasilitas chip yang cukup lengkap
Arduino menggunakan chip AVR ATmega 168/328 yang memiliki fasilitas PWM, komunikasi serial, ADC, timer, interupt, SPI dan I2C. Sehingga Arduino bisa digabungkan bersama modul atau alat lain dengan protokol yang berbeda-beda.

Ukuran kecil dan mudah dibawa
Ukuran board Arduino cukup kecil, mudah di bawah kemana-mana bersama laptop atau dimasukan ke dalam saku.

Bahasa pemrograman relatif mudah
Walaupun bahasa pemrograman Arduino adalah bahasa C/C++, tetapi dengan penambahan library dan fungsi-fungsi standar membuat pemrograman Arduino lebih mudah dipelajari dan lebih manusiawi. Contoh, untuk mengirimkan nilai HIGH pada pin 10 pada Arduino, cukup menggunakan fungsi digitalWrite(10, HIGH); Sedangkan kalau menggunakan bahasa C aslinya adalah PORTB |=(1<<2);

Tersedia library gratis
Tersedia library yang sangat banyak untuk menghubungkan Arduino dengan macam-macam sensor, aktuator maupun modul komunikasi. Misalnya library untuk mouse, keyboard, servo, GPS, dsb. Berhubung Arduino adalah open source, maka library-library ini juga open source dan dapat di download gratis di website Arduino.

Pengembangan aplikasi lebih mudah
Dengan bahasa yang lebih mudah dan adanya library dasar yang lengkap, maka mengembangkan aplikasi elektronik relatif lebih mudah. Contoh, kalau kita ingin membuat sensor suhu. Cukup membeli sebuah IC sensor suhu (misalnya LM35) dan menyambungkan ke Arduino. Kalau suhu tersebut ingin ditampilkan pada LCD, tinggal membeli sebuah LCD dan menambahkan library LCDpada program yang sama, dan seterusnya.

Komunitas open source yang saling mendukung
Software Linux, PHP, MySQL atau WordPress perkembangannya begitu pesat karena merupakan software open source dimana ada komunitas yang saling mendukung pengembangan proyek. Demikian juga dengan Arduino, pengembangan hardware dan software Arduino didukung oleh pencinta elektronika dan pemrograman di seluruh dunia. Contoh, interface USB pada Arduino Uno mengambil dari LUFA project. Library dan contoh-contoh program adalah sumbangan dari beberapa programmer mikrokontroler, seperti Tom Igoe, dsb.

untuk yang kurang jelas, bisa ditanya ke saya, goodluck
Atau kalau ada yang mau dibuatkan bisa dengan biaya 145 rb + ongkir 20rb untuk area pulau jawa.
ISI package : Arduino Severino Board ( atmega8 )
                      CD sofware
                      Kabel Serial ( board ke PC )
                      Aksesoris 1 project ( 1 LED, 1 potensio 50K, 1 PB Switch, cable conector )






Kamis, 13 Maret 2014

PWM basic teory



Adalah mudah bagi microcontroller untuk membuat Led ON dan Off ataupun membuat berbagai variasi jika memakai beberapa buah Led. Tetapi itu hanya ON dan OFF saja.Kemudian bagaimana jika ingin mengontrol kecerahan dari Led, Masalah yang sama juga dalam pengontrolan robot, dimana jika ingin mengontrol kecepatan motornya dengan menggunakan microcontroller. Tidak cukup hanya dengan meng-ON dan OFF kan motornya. Untuk mengontrol kecerahan dari Led atau speed dari motor harus dikontrol jumlah arus yang melaluinya. Satu solusi yang bisa dilakukan adalah dengan meng ON dan OFF kan Led atau motor dengan sangat cepat .Arus hanya mengalir ketika output Low ( Untuk rangkaian Led dengan microcontroller com + ). Output dari microcontroller akan terlihat seperti gelombang kotak.




Apabila membuat Led dan motor ON dan OFF dengan cukup cepat maka akan tampak seperti normal menyala atau berputar tidak terlihat hidup-mati. Karena arus yang melaluinya kurang maka Led akan menyala kurang cerah atau motor berputar kecepatan rendah. Dengan solusi ini kita dapat membuat Led flash on dan off lambat 30/detikatau lebih lambat lagi dan kita start maka akan terlihat led blinking hidup-mati, tentunya bukan ini yang diharapkan. Atau untuk motor akan hilang kehalusannya dan tampak tersendat sendat. Solusi ini tidak bekerja dengan baik karena led masih terlihat cerah pada 30/s.

Dari pada merubah frekwensi ON dan OFFnya, bagaimana merubah panjang output tetap on dan off. mari kita lihat lebih dekat pada satu output cycle. sebuah output cycle terdiri dari low period,tlow dan high period, thigh. tlow+thigh=T, dimana T adalah perioda ( panjang waktu ) untuk satu output cycle. thigh juga dinamakan output pulsa.



Kita akan jaga T tetap sama jumlah per detiknya. Jika kita tingkatkatkan lebar dari thigh maka kita harus menurunkan tlow untuk menjaga T tetap sama. begitupun sebaliknya. Untuk gambar dibawah thigh lebih kecil.

Terlihat bahwa output 0 waktunya paling panjang dan led atau motor akan lebih cerah dan cepat untuk motor. Untuk kasus lainnya thigh dibuat lebih panjang seperti dibawah



Output Vcc waktunya paling panjang yang mana membuat led off. Arus mengalir melalui led dalam waktu singkat.Karena masih menyalakan led on dan off sangat cepat

( misal sekitar 600/s ). kita tidak akan melihat lednya blinking dan akan terlihat kecil kecerahannya. Total arus yang melalui led rendah. Untuk motor akan burputar palan secara halus.

Jadi kita dapat mengontrol kecerahan dari led dan atau kecepatan motor dengan merubahpanjang dari thigh-nya. Ini adalah rahasia dari PULSE WIDTH MODULATION

Dibawah ditampilkan source code PWM yang diadjust secara digital dan ditampilkan melalui LCD, digunakan untuk mengontrol motor dc, bisa juga untuk mengatur kecerahan LED.

Install Led di output PWMPIN = P3.0

$include(reg51.inc)
;8 bit LCD routines with check busy flag before sending data, command to LCD      
;*************************************************************
LCD DATA P2 ;define LCD data port on port 1
BUSY BIT LCD.7 ;define LCD busy flag
RS BIT P0.0 ;define LCD register select pin on port 2.0
RW BIT P0.1 ;define LCD read/write pin on port 2.1
E BIT P0.2 ;define LCD enable pin on port 2.2
;*************************************************************
        ORG      00H
     
MOV P3,#0FFH ; Reset P3
MOV P1,#0FFH ; force P1 high state
PWMPIN EQU P3.0 ; Output PWM pulse
MOVELEFT EQU P3.1 ; Output indikator lamp motor putar kiri
MOVERIGHT         EQU P3.2 ; Output indikator lamp motor putar kanan
SWLEFT         EQU P1.0 ; Switch motor putar kiri
SWRIGHT EQU P1.1 ; Switch motor putar kanan
SPEEDDOWN EQU P1.2 ; Switch setting speed/ kecerahan jika output LED
SPEEDUP EQU P1.3 ; Switch setting speed/ kecerahan jika output LED
MOV TMOD,#00H ; Timer0 in Mode 0 ( untuk PWM frekuensi )
MOV R3,#0FAH ; Default untuk nilai pertama power ON ( 0 - 255 )
MOV R0,#00H
ACALL LCD_INIT

STARTUP:
        MOV A,#80H ;Force text di line1 kiri              
      ACALL COMMAND
      MOV     DPTR,#TEST
      ACALL   DISP_STRING
        MOV     A,#0C0H ;Force text di line2 kiri              
      ACALL COMMAND
      MOV DPTR,#TEST1
      ACALL   DISP_STRING

GESER :
          ACALL DELAY3
 ACALL DELAY3
 ACALL DELAY3
          MOV    A,#18H              
          ACALL  COMMAND
           INC R0
 CJNE R0,#0FH,GESER
 ACALL LCD_INIT
 ACALL DELAY3

; Main Program
MAIN:
MOV R4,#0FFH ; Force isi R4= 0FFH/255
MOV P3,#0FFH ; Reset P3
MOV P1,#0FFH ; force P1 high state
MOV   A,#80H ;Force text di line1 kiri              
      ACALL COMMAND
      MOV     DPTR,#TEST5
      ACALL   DISP_STRING
MOV     A,#0C0H ;Force text di line2 kiri              
      ACALL COMMAND
      MOV DPTR,#TEST4
      ACALL   DISP_STRING
ACALL TAMPIL
      JNB SWLEFT,LEFT ; Tunggu Swleft ditekan lanjut ke routine LEFT, jika tidak lanjut ke bawah
      JNB SWRIGHT,RIGHT  ; Idem diatas
      JNB SPEEDDOWN,DOWN ; Tunggu SPEEDDOWN ditekan lanjut ke routine DOWN, jika tidak lanjut ke bawah
      JNB SPEEDUP,UP ; Idem diatas
      JMP MAIN ; loop ke main

DOWN: ; Routine speed down
MOV   A,#80H ;Force text di line1 kiri              
   ACALL COMMAND
   MOV     DPTR,#TEST7
   ACALL   DISP_STRING
MOV     A,#0C0H ;Force text di line2 kiri              
   ACALL COMMAND
   MOV DPTR,#TEST4
   ACALL   DISP_STRING
   ACALL TAMPIL ; Menampilkan kecepatan di LCD
MOV A,R3
CJNE A,#0FFH,MAX
MOV R3,#0FFH
ACALL   DELAY
JNB         SPEEDDOWN,$
AJMP     MAIN

UP: ; Routine speed up
   MOV   A,#80H ;Force text di line1 kiri              
   ACALL COMMAND
   MOV     DPTR,#TEST6
   ACALL   DISP_STRING
   MOV     A,#0C0H ;Force text di line2 kiri              
   ACALL COMMAND
   MOV DPTR,#TEST4
   ACALL   DISP_STRING
   ACALL TAMPIL ; Menampilkan kecepatan di LCD
MOV A,R3
CJNE A,#00H,MIN
MOV R3,#00H
ACALL DELAY
JNB         SPEEDUP,$
AJMP MAIN
MAX: ; Routine speed down
INC A
ACALL DELAY
JNB          SPEEDDOWN,$
MOV R3,A
AJMP MAIN
MIN: ; Routine speed up
DEC A
ACALL DELAY
JNB         SPEEDUP,$
MOV R3,A
AJMP MAIN

LEFT:
   CLR         MOVELEFT ; Output lampu putar kiri ON
   MOV         A,#80H ;Force text di line1 kiri              
   ACALL COMMAND
   MOV     DPTR,#TEST2
   ACALL   DISP_STRING
    MOV     A,#0C0H ;Force text di line2 kiri              
   ACALL COMMAND
   MOV DPTR,#TEST4
   ACALL   DISP_STRING
   ACALL TAMPIL ; Menampilkan kecepatan di LCD
JMP PWM
   
RIGHT:
CLR MOVERIGHT ; Output lampu putar kanan ON
MOV   A,#80H ;Force text di line1 kiri              
   ACALL COMMAND
   MOV     DPTR,#TEST3
   ACALL   DISP_STRING
MOV     A,#0C0H ;Force text di line2 kiri              
   ACALL COMMAND
   MOV DPTR,#TEST4
   ACALL   DISP_STRING
   ACALL TAMPIL ; Menampilkan kecepatan di LCD

PWM:
JB         F0, HIGH_DONE ; the high section of the cycle so Jump to HIGH_DONE
MOV A,P1
CPL         A
JZ PWM_END
  MOV A,R3
SUBB A,R4
JZ LOW_DONE
DEC R4
     
LOW_DONE:
SETB F0 ; Make F0=1 to indicate start of high section
CLR  PWMPIN ; Make PWM output pin High
MOV  TH0,R4 ; Load high byte of timer with R4
SETB TR0
WAIT:
JNB TF0,WAIT
CLR TF0 ; Clear the Timer 0 interrupt flag
CLR TR0
JMP PWM ; Return from Interrupt to where
; the program came from
HIGH_DONE:
CLR F0 ; Make F0=0 to indicate start of low section
SETB PWMPIN ; Make PWM output pin low
MOV A, #0FFH ; Move FFH (255) to A
CLR C ; Clear C (the carry bit) so it does
; not affect the subtraction
SUBB A, R4 ; Subtract R7 from A. A = 255 - R4.
MOV TH0,A ; so the value loaded into TH0 + R4 = 255
SETB TR0
WAIT1:
JNB TF0,WAIT1
CLR TF0 ; Clear the Timer 0 interrupt flag
CLR TR0
JMP PWM ; Loop

PWM_END: AJMP MAIN


TAMPIL:
MOV     A,#0CBH ;Force text di line2 kiri              
      ACALL COMMAND
      MOV A,R3 ; Pindahkan data speed ke Acc
      CPL A ; Inverse Acc
      ANL A,#11110000B ; Masking Acc dengan #0F0H, disimpan di Acc
CJNE A,#00H,D1 ; Compare isi A dengan#00H, jika tidak sama lompat ke D1
      MOV A,#'0' ; Isi A #00H, Pindahkan karakter huruf 'A' Ke Acc
      ACALL DISPLAY ; Tampilkan huruf A ke LCD
      JMP NEXT
D1:
     CJNE         A,#10H,D2
     MOV A,#'1'
     ACALL DISPLAY
     JMP NEXT
D2:
     CJNE A,#20H,D3
     MOV A,#'2'
     ACALL DISPLAY
     JMP NEXT
D3:
     CJNE A,#30H,D4
     MOV A,#'3'
     ACALL DISPLAY
     JMP NEXT
D4:
     CJNE A,#40H,D5
     MOV A,#'4'
     ACALL DISPLAY
     JMP NEXT
D5:
     CJNE A,#50H,D6
     MOV A,#'5'
     ACALL DISPLAY
     JMP NEXT
D6:
     CJNE A,#60H,D7
     MOV A,#'6'
     ACALL DISPLAY
     JMP NEXT
D7:
     CJNE A,#70H,D8
     MOV A,#'7'
     ACALL DISPLAY
     JMP NEXT
D8:
     CJNE A,#80H,D9
     MOV A,#'8'
     ACALL DISPLAY
     JMP NEXT
D9:
     CJNE A,#90H,DDA
     MOV A,#'9'
     ACALL DISPLAY
     JMP NEXT
DDA:
     CJNE A,#0A0H,DDB
     MOV A,#'A'
     ACALL DISPLAY
     JMP NEXT
DDB:
     CJNE A,#0B0H,DDC
     MOV A,#'B'
     ACALL DISPLAY
     JMP NEXT
DDC:
     CJNE A,#0C0H,DDD
     MOV A,#'C'
     ACALL DISPLAY
     JMP NEXT
DDD:
     CJNE A,#0D0H,DDE
     MOV A,#'D'
     ACALL DISPLAY
     JMP NEXT
DDE:
     CJNE A,#0E0H,DDF
     MOV A,#'E'
     ACALL DISPLAY
     JMP NEXT
DDF:
     MOV A,#'F'
     ACALL DISPLAY

NEXT:
     MOV A,R3
     CPL A
     ANL A,#00001111B
     CJNE A,#00H,DA1
     MOV A,#'0'
     ACALL DISPLAY
     JMP NEXT1
DA1:
     CJNE A,#01H,DA2
     MOV A,#'1'
     ACALL DISPLAY
     JMP NEXT1
DA2:
     CJNE A,#02H,DA3
     MOV A,#'2'
     ACALL DISPLAY
     JMP NEXT1
DA3:
     CJNE A,#03H,DA4
     MOV A,#'3'
     ACALL DISPLAY
     JMP NEXT1
DA4:
     CJNE A,#04H,DA5
     MOV A,#'4'
     ACALL DISPLAY
     JMP NEXT1
DA5:
     CJNE A,#05H,DA6
     MOV A,#'5'
     ACALL DISPLAY
    JMP NEXT1
DA6:
     CJNE A,#06H,DA7
     MOV A,#'6'
     ACALL DISPLAY
     JMP NEXT1
DA7:
     CJNE A,#07H,DA8
     MOV A,#'7'
     ACALL DISPLAY
     JMP NEXT1
DA8:
     CJNE A,#08H,DA9
     MOV A,#'8'
     ACALL DISPLAY
     JMP NEXT1
DA9:
     CJNE A,#09H,DAA
     MOV A,#'9'
     ACALL DISPLAY
    JMP NEXT1
DAA:
     CJNE A,#0AH,DAB
     MOV A,#'A'
     ACALL DISPLAY
    JMP NEXT1
DAB:
     CJNE A,#0BH,DAC
     MOV A,#'B'
     ACALL DISPLAY
    JMP NEXT1
DAC:
     CJNE A,#0CH,DAD
     MOV A,#'C'
     ACALL DISPLAY
    JMP NEXT1
DAD:
     CJNE A,#0DH,DAE
     MOV A,#'D'
     ACALL DISPLAY
     JMP NEXT1
DAE:
     CJNE A,#0EH,DAF
     MOV A,#'E'
     ACALL DISPLAY
     JMP NEXT1
DAF:
     MOV A,#'F'
     ACALL DISPLAY
NEXT1:  
NOP
RET  

DELAY: ; Routine delay
MOV R5,#001H
MOV R6,#001H
DELAY1:
DJNZ R5,DELAY1
DJNZ R6,DELAY1
RET

DELAY2: ; Routine delay
MOV R5,#0FFH
MOV R6,#0FFH
DELAY3:
DJNZ R5,DELAY3
DJNZ R6,DELAY3
RET



; Routine inisialisasi untuk LCD
;**************************************************************
LCD_INIT:
        MOV      A,#38H                ;2 line 5x7
        ACALL    COMMAND  
        MOV      A,#0CH                ;LCD on cursor off
        ACALL    COMMAND
        MOV      A,#01H                ;clear LCD
        ACALL    COMMAND
        MOV      A,#06H                ;shif cursor right
        ACALL    COMMAND
Ret

;=============================================================
COMMAND:
        ACALL READY ;is LCD ready?
        MOV LCD,A ;issue command code
        CLR RS ;RS=0 for command
        CLR RW ;R/W=0 to write to LCD|
        SETB E ;E=1 for H-to-L pulse
        CLR E ;E=0 ,latch in
        RET
;=============================================================
DISPLAY:
        ACALL READY ;is LCD ready?
        MOV LCD,A ;issue data
        SETB RS ;RS=1 for data
        CLR RW ;R/W=0 to write to LCD
        SETB E ;E=1 for H-to-L pulse
        CLR E ;E=0 ,latch in
        RET
;=============================================================
READY:
        SETB BUSY ;make P0.7 input port
        CLR RS ;RS=0 access command reg
        SETB RW ;R/W=1 read command reg
;read command reg and check busy flag
BACK:
        CLR E ;E=1 for H-to-L pulse
        SETB E ;E=0 H-to-l pulse
        JB BUSY,BACK ;stay until busy flag=0
        RET
;=============================================================
DISP_STRING:
   CLR A ;A=0
MOV R7,#00H ;R7=0
NEXT_CHAR:
INC R7 ;R7+1
MOVC A,@A+DPTR
ACALL DISPLAY
  MOV A,R7
CJNE R7,#0FH,NEXT_CHAR
RET          
;=============================================================
TEST: DB "PWM BASIC TEORI"
TEST1: DB "  MICROTECH    "
TEST2: DB "  PUTAR KIRI   "
TEST3:    DB "  PUTAR KANAN  "
TEST4:    DB "KECEPATAN :    "
TEST5:    DB " TUNGGU INPUT  "
TEST6: DB "    SPEED UP   "
TEST7: DB "  SPEED DOWN   "
 ;=============================================================


END


Menghitung Duty Cycle :



           
           




           
            

Rabu, 12 Maret 2014

AT89S52 sebagai CPU Unit

Merupakan rangkaian minimum system menggunakan microcontroller AT89S52, sehingga bisa langsung diprogram menggunakan parallel cable dengan IspPgm atau  UsbAsp dengan ProgIsp172 sebagai Uploader /Downloadernya. Karena modul ini menggunakan Header female sebagai penghubung dengan modul yang lain, oleh karena itu bisa dikombinasikan untuk berbagai macam project bergantung dari modul slavenya. contoh : modul I/O untuk PLC micro, Modul DC PWM motor controller dengan lcd display untuk control speed dc motor, Modul Jam dengan RTC tampil di LCD, Moduls serial communication dan lain lain
dibawah ini adalah drawing schematicnya :



dan ini adalah untuk koneksi cable parallelnya :

Untuk pemrogramannya bisa menggunakan bahasa assembly, C atau menggunakan ldmicro.

Selasa, 11 Maret 2014

Mengirim text ke LCD 8 bit mode




 LIQUID CRYSTAL DISPLAY

LCD biasanya digunakan dengan microcontroller,yang mana tidak bisa digunakan dengan standard rangkaian IC. LCD untuk menampilkan karakter, pesan teks dll.



model disini adalah yang murah, bagus capabilitasnya dan sering digunakan yaitu m1632 series yang menampilkan 2 line dengan 16 karakter per-linenya. Dapat menampilkan huruf , symbol matematika malahan bisa menampilkan symbol yang dibuat sendiri. kegunaan lainjuga ada feature automatis message geser kanan atau kiri, menampakkan kursor, LED backlight dll.

LCD pin

berikut adalah table dari aplikasi 16 pin pada LCD :
Screen pada LCD

Tiap karakter terdiri dari 5x8 atau 5x11 dot matrix. display contrast bergantung pada supply tegangan yang diatur trimer potensiometer . beberapa lcd terdapat built in backlight seperti hijau atau biru.


LCD memory

LCD display berisi 3 memory block;

> DDRAM display data RAM
> CGRAM character generator RAM
> CGROM character generator ROM


DDRAM Memory

Digunakan untuk menyimpan karakter yang akan ditampilkan. kapasitas memory ini adalah 80 karakter

Cara kerjanya sederhana.konfigurasikan display increment address automatis geser kanan, dan set start address untuk message yang akan ditampilkan ( contoh dari 00H + 80H = 80h ) untuk line 1, untuk line 2 40h+80h=C0h. Setelah itu kirim karakter melalui d0-d7.jika mengirim lebih dari 16 karakter, hanya 16 yang pertama yang tampil, sisanya menggunakan shift command.

CGROM Memory
 Berisi default karakter map dengan semua karakter dapat ditampilkan di screen. Alamat dari CGROM adalah sama dengan karakter dari ASCI. berikut tablenya :



CGRAM Memory

Bagian dari standard karakter, LCD display menampilkan symbol yang didefinisikan sendiri dapat berupa symbol apa saja dalam size 5x8 pixel. RAM memory CGRAM sizenya 64 bytes.
memory register lebar 8 bits, tetapi hanya 5 bit lower yang digunakan. logic 1 dalam setiap register mewakili dimmed dot. sementara 8 lokasi digroup bersama mewakili1 karakter. ilustrasinya seperti ini:


LCD BAsic Command
Semua data ditransfer ke LCD melalui d0-d7 akan diartikan sebagai command atau data itu tergantung dari RS logic state.

RS=1 -bits d0-d7 diartikan sebagai data
RS=0 -bits dd0-d7 dartikan sebagai command yang menentukan display mode.


Busy flag

dibandingkan dengan microcontroller, lcd adalah componen yang sangat lambat . jadi penting untuk menyediakan signal yang mengindikasikan lcd siap menerima data baru. signal inni dapat dibaca dari d7. saat BF bit =0 lcd siap menerima data baru.


Koneksi LCD

bisa mengunakan 4 bit atau 8 bit mode. mode ini diinisialisasi pada pengoperasian awal.
 contoh pemrograman 8 bit mode :

$include(reg51.inc)


;8 bit LCD routines with check busy flag before sending data, command to LCD      
;*************************************************************
LCD      DATA     P2          ;define LCD data port on port 1
BUSY    BIT      LCD.7       ;define LCD busy flag
RS         BIT      P0.0           ;define LCD register select pin
RW        BIT      P0.1           ;define LCD read/write pin
E            BIT      P0.2          ;define LCD enable pin
;*************************************************************


        ORG    00H
        ACALL LCD_INIT

TAMPIL:
     MOV      A,#80H              
     ACALL  COMMAND
     MOV      DPTR,#TEST
     ACALL  DISP_STRING
     MOV     A,#0C0H              
     ACALL  COMMAND
     MOV      DPTR,#TEST1
     ACALL  DISP_STRING
     MOV     R2,#00H
     ACALL  DELAY
     ACALL  DELAY
     ACALL  SHIFT

TAMPIL1:
     MOV      A,#80H              
     ACALL  COMMAND
     MOV     DPTR,#TEST2
     ACALL  DISP_STRING
    MOV      A,#0C0H              
     ACALL  COMMAND
     MOV     DPTR,#TEST3
     ACALL  DISP_STRING
     MOV     R2,#00H
     ACALL  DELAY
     ACALL  DELAY
     ACALL  SHIFT  
   
JMP  TAMPIL

SHIFT:
     ACALL  DELAY
     ACALL  DELAY
     MOV     A,#18H              
     ACALL  COMMAND
     INC        R2
    CJNE     R2,#0Fh,SHIFT
    ACALL   LCD_INIT
    ACALL   DELAY
RET
LCD_INIT:
        MOV      A,#01H                ;Clear LCD
        ACALL    COMMAND  
;        MOV      A,#02H                ;Cursor home posisi
;        MOV      A,#04H                ;Decrement cursor
;        MOV      A,#05H                ;shift screen right
        MOV      A,#06H                 ;Increment cursor
;        MOV      A,#07H                ;shift screen Left
        ACALL    COMMAND
;        MOV      A,#08H                ;Display off, cursor off
;        MOV      A,#0AH                ;Display off, cursor on
        MOV      A,#0CH                 ;Display on ,cursor off
        ACALL    COMMAND
;        MOV      A,#0EH                ;Disply on, cursor blinking
;        MOV      A,#0FH                ;Display on, cursor blinking
;        MOV      A,#10H                ;shift cursor position to left
;        MOV      A,#14H                ;shift cursor position to right
;        MOV      A,#18H                ;shift  display to left
;        MOV      A,#1CH                ;shift  display to right
;        MOV      A,#80H                ;force cursor to begining 1st line
;        MOV      A,#C0H                ;Force cursor to begining 2nd line
        MOV      A,#38H                 ;2 line 5x7 dot matrix 8 bit mode
        ACALL    COMMAND
RET
;=============================================================
COMMAND:
        ACALL    READY                 ;is LCD ready?
        MOV      LCD,A                 ;issue command code
        CLR      RS                    ;RS=0 for command
        CLR      RW                    ;R/W=0 to write to LCD|
        SETB     E                     ;E=1 for H-to-L pulse
        CLR      E                     ;E=0 ,latch in
        RET
;=============================================================
DISPLAY:
        ACALL    READY                 ;is LCD ready?
        MOV      LCD,A                 ;issue data
        SETB     RS                    ;RS=1 for data
        CLR      RW                    ;R/W=0 to write to LCD
        SETB     E                     ;E=1 for H-to-L pulse
        CLR      E                     ;E=0 ,latch in
        RET
;=============================================================
READY:
        SETB     BUSY                  ;make lcd.7 input port
        CLR      RS                    ;RS=0 access command reg
        SETB     RW                    ;R/W=1 read command reg
;read command reg and check busy flag
BACK:
        CLR      E                     ;E=1 for H-to-L pulse
        SETB     E                     ;E=0 H-to-l pulse
        JB       BUSY,BACK             ;stay until busy flag=0
        RET
;=============================================================
DISP_STRING:
   CLR      A                     ;A=0
MOV      R7,#00H               ;R7=0
NEXT_CHAR:
INC      R7       ;R7+1
MOVC     A,@A+DPTR
ACALL    DISPLAY
  MOV      A,R7
CJNE     R7,#0FH,NEXT_CHAR
RET          

;===========================================================
delay: mov r6,#0ffh
delay1: mov r7,#0ffh
delay2: djnz r7,delay2
djnz r6,delay1
ret
;=============================================================
TEST:   DB "Interfacing LCD "
TEST1:  DB "8 bit mode      "
TEST2:  DB  "  Send   Text   "
TEST3:  DB  "  Hello Word    "
;=============================================================


END