電子工作日記、その他

趣味の電子工作製作の記録、その他思った事

AVR Programming(7)

2013-02-22 14:59:35 | 日記
LCDasmの勉強
下記を参考にさせて頂きました。

http://homepage2.nifty.com/sfukuda/AVRLCD.ASM

wait subの作り方は、最初に10us位の基本時間を作成し、後は、それを呼ぶsubroutineにして行く
方法が、私は分かり易いと思いました。
0b11110000記述は止めて、0xF0記述にし必要な時だけcommentに記述程度で良いと思いました。

Program(6)

2013-02-16 10:48:55 | 日記
Program(6)として、新たな気分で

他人のProgramを見て、分かり易い記述を発見
asm(data)
LDI   lcd_data,'T'
RCALL lcd_data
RCALL wait_100us

asm(commd)
LDI   lcd_data,$01
RCALL lcd_commd
RCALL wait_5ms

このProgramはLCDの2行目制御が組み込まれていないので、組み込んでみようと思う。

Program(5) TIMER1_OVF INTERRUPT

2013-02-01 19:15:07 | 日記
TIMER1_OVF INTERRUPTの練習ProgramをCでCodeingした。
TIMER1_OVFでは、TIMER1(16bit) 2^16=65536 に 必要なCount値を引いた値をSetする。
65536-12500=53036 をsetする。(後12500countするとOverflowする。)
/**********************************
TIMER1_OVF INTERRUPT Program
-----------------------------------
AVR: ATTINY2313
clock: Internal RC OSC 8MHz
INPUT:
SW:
EVENT: TIMER1_OVF_INTERRUPT 100ms
OUTPUT:
LED:
PORT:
PB0: PB0(12)R-LED TIMER1_OVF TIME

PD0: PD0(2) G-LED main WAIT LOOP check

PA0: PA0(5) R-LED TIMER1_OVF INTERRUPT
Register set value
---------------------------------------------------------------------
//TIMSK 1 0 0 0 0 0 0 0
//TIMSK TOIE1 OCIE1A OCIE1B ----- ICIE1 OCIE0B TOIE0 OCIE0A

//TCCR1A 0 0 0 0 0 0 0 0
//TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 ----- ----- WGM11 WGM10

//TCCR1B 0 0 0 0 0 0 1 1
//TCCR1B ICNC1 ICES1 ----- WGM13 WGM12 CS12 CS11 CS10
-----------------------------------------------------------------------

        GND |10     11| PD6
        PD5 | 9     12| PB0
        PD4 | 8     13| PB1
        PD3 | 7     14| PB2
        PD2 | 6     15| PB3
        PA0 | 5     16| PB4
        PA1 | 4     17| PB5
        PD1 | 3     18| PB6
        PD0 | 2     19| PB7
  *RESET/PA2 | 1     20| VCC

---------------------------------*/
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>

//----------------------------------
ISR(TIMER1_OVF_vect)        // timer1 Overflow interrupt
//----------------------------------
{
TCNT1 = 53036; // 8000000/64/10=12500(1/10sec)
   // 65536-12500=53036 each 100ms ↓
PORTA = 0x01;
_delay_ms(5);
PORTA = 0; // LED-R PA0 = 1 Interrupt check  

PORTB ^= 0x01; // PB0(12) 8_LED board
}
//--------------------------------
void timer1_init()
//----------------------------
{
TCNT1 = 53036; // 1/10 sec (100ms)
TIMSK =_BV(TOIE1); // Timer1_ovf interrupt enable 1
TCCR1A = 0;
TCCR1B = 3; // 1/64 clock
sei(); // Interrupt Enable
}
//*****************************
int main (void)
//*****************************
{
DDRA = 0x03; // xxxx x011 PA2:(0)RESET PA1: output PA0: LED
DDRB = 0xFF; // 1111 1111 PB0: LED
DDRD = 0x7F; // x111 1110 PD0: LED
PORTA = 0; //
PORTB = 0; //
PORTD = 0; //

PORTB = 0x01; // TIMER1_OVF LED-R
timer1_init(53036); // 65536-12500=53036 each 100ms ↓

while(1)
{
PORTD = 0x01; // LED-G main wait loop
_delay_ms(10); // PD0(2)
PORTD = 0;
_delay_ms(10);
}
}