2024年3月27日水曜日

AVR ISP シールド

 AVR ISP Shieldを使ってみた #Arduino - Qiita やら

Arduino (Shield) (ht-deko.com) にある説明では十分要領を得んのでメモ

押し下げ棒があるほうにpin1,pin28がくるようにセット avrispのsocketは以下のように挿す

〇 〇 miso  vtg

〇 〇  sck     mosi

〇 〇  rst     gnd

ISP記載が下にある6穴のやつを用いる

注:あくまでatmega88v/328p用と心得よう


2024年3月26日火曜日

fastPWM and ADC/INT0,PCINT (attiny13a)

// https://www.adnbr.co.uk/articles/adc-and-pwm-basics

// code:   https://gist.github.com/adnbr/9289235

#define F_CPU 9600000

#define LED PB1

#include <avr/io.h>


void pwm_setup(){

  TCCR0B |= (1<<CS01); // prescale 8

  TCCR0A |= (1<<WGM01) | (1<<WGM00);// fast PWM

  // Clear OC0B output on compare match, upwards counting.

  TCCR0A |= (1<<COM0B1);

}


void pwm_write(int val)

{

OCR0B = val;

}


void adc_setup(void)

{

// set the ADC input to PB2/ADC1

  ADMUX |= (1<<MUX0); // mux1/0=01 select adc1

  ADMUX |= (1<<ADLAR);

  // set the prescaler 128 , adps2 add by me

  ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);

}


int adc_read(void)

{

ADCSRA |= (1<<ADSC); // start conversion

  while(ADCSRA&(1<<ADSC));

  return ADCH;

}

int main (void)

{

   int adc_in;

    // LED is an output.

    DDRB |= (1 << LED);

    adc_setup();

    pwm_setup();

    while (1) {

        // Get the ADC value

        adc_in = adc_read();

        // Now write it to the PWM counter

        pwm_write(adc_in);

    }

}

ーーーーーーーーーINT0ーーーーーーーーーーーーー

// https://kurobekoblog.com/attiny_gaibuwarikomi 

#include <avr/interrupt.h>

volatile byte state = 0;

int16_t cnt;

ISR(INT0_vect){

  state = 1;

}

void sw_up(){

  switch(state){

   case 0:

    break;

   case 1:

    cnt = 1000;

    state = 2;

    break;

  case 2:

    cnt --; // avoid chattering

    if(cnt == 0){

    PORTB ^= 0b00000001; // toggle led on off

    state = 0;

   }

 }

}

void setup(){

  DDRB  |=  0b0000001 ; // pb0 output

  PORTB |=  0b0000010 ; // pb1 input pullup

  MCUCR &= ~0b00000011; // if low level, int0 occur

  GIMSK |= (1<<INT0) ; // int0 enable

  sei();

}

void loop(){

  sw_up();

}

ーーーPCINTーーーーーーーーーーーーーーーーーーー

注:pb3をinput pullupでスイッチにつなぎ、スイッチはグランドともつなぐ

 #include <avr/interrupt.h>

#include <avr/sleep.h>

#define F_CPU 960000UL 

#define LED PB0

//#define SWITCH PINB3 どっちでもうごくが。。。。

#define SWITCH PB3

ISR(PCINT0_vect){ // 0番台の割り込みがpcint0~5ピンに割当られているようだ

  if(PINB & _BV(SWITCH)){

    PORTB ^= _BV(LED);

  }

}

int main(void)

{

   DDRB |= _BV(LED); // SET PORT B0 AS OUTPUT(ALL OTHERS ARE INPUT)

 PORTB = 0b0001000 ; // pb3(switch) input pullup

 PCMSK |= _BV(SWITCH); // SET PCINT MASK TO LISTEN TO PORT B3

 GIMSK |= _BV(PCIE);

 sei();

 set_sleep_mode(SLEEP_MODE_PWR_DOWN);

 for (;;){

  sleep_mode();

}

}

ーーーーーーPCINTもう一つーーーーーーーーー  

// https://karlsnautr.blogspot.com/2013/04/attiny13apcint.html
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define F_CPU 960000UL

//#define SWITCH PINB3
#define SWITCH PB3

ISR(PCINT0_vect){
  if(bit_is_set(PINB,PORTB4)){ 
    PORTB ^= (1<<PORTB2); // PB2を反転
  }
}

void initIOInterrupt(){
  GIMSK |= (1<<PCIE); // PCINT enable
  PCMSK = 0b00010000; // PB4// switch押すで5Vかかる
  sei();
}
int main(void)
{
    DDRB |= (0<<DDB4)|(1<<DDB2); // PB4が入力,PB2が出力
    PORTB = 0b0010100 ; // PORTBの出力値
    initIOInterrupt();
    while(true){
    }
}
  

2024年3月20日水曜日

ACM1602/SD1602 ASM 表示のみ

 -----------------acm1602-------------------------------------------------------------------------------https://mctouringadv.net/20200823/arduino11/ にピン番号詳しい

nanoではコントラスうまくいかん

ーーーーーーーーーーーーーーーーーーーーーーーーーーーー


向かって右より 15に100Ω経由で5V、16はGND、これらはバックライト
1:VSSはGND,2:VDDは5V、3:VEEはPOTENTIOMETERでコントラスト,
4:RS,5:RWはGND,6:E、14~11がPD7~4につながる(出力オンリーなのでRWはGND)
15、16、1、2,3,4、5、6、7,8、9、10、11、12,13、14

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

; ファイル名 : LCD.asm

.include "m88def.inc"

.def R_TEMP0 = R2

.def STACK = R16

.def R_FLAG1 = R17 ; 割込状態他

.def R_TMR0 = R18 ; タイマ0カウント領域(10mS単位)

.def R_TMR2 = R19 ; タイマ2カウント領域(0.1mS単位)

.def R_TEMP1 = R20

.def R_TEMP2 = R21

.def R_TEMP3 = R22

.def R_TEMP4 = R23

.def R_TEMP5 = R24


;---- R_FLAG1 ----(割込状態他)


.EQU B_IOVF0 = 0 ; タイマ0オーバーフロー

.EQU B_IOVF1 = 1 ; タイマ1オーバーフロー

.EQU B_IOVF2 = 2 ; タイマ2オーバーフロー

.EQU B_INT0 = 3 ; 手動スイッチ押下割込み


;---- PORT ----

.EQU P_LCD = PORTD ; LCD

;.EQU P_SW0 = PINC ; SW0


;---- 入出力ビット -------------


.EQU B_LCD_RS = 4

.EQU B_LCD_E = 5

.EQU B_SDC_CS = 2


; 割り込みベクタ定義


.CSEG ; コードセグメント

RJMP MAIN ; リセット

.ORG $0009

RJMP IOVF2 ; タイマ2

.ORG $0010

RJMP IOVF0 ; タイマ0


;*******************************************************************************

; 割込みルーチン

;*******************************************************************************

;*******************************************************************************

;***************************************

; タイマ2(0.1mS単位)

;***************************************

IOVF2:

IN STACK,SREG ; PUSH SREG


DEC R_TMR2

BRNE IOVF2_1


SBR R_FLAG1,(1<<B_IOVF2)

RJMP IOVF2_9


IOVF2_1:

LDI R_TEMP1, 0x9C ; 割込時間0.1mSを再セット

STS TCNT2, R_TEMP1


IOVF2_9:

OUT SREG,STACK ; POP SREG


RETI


;***************************************

; タイマ0 (10mS単位)

;***************************************


IOVF0:

IN STACK,SREG ; PUSH SREG


DEC R_TMR0

BRNE IOVF0_1


SBR R_FLAG1,(1<<B_IOVF0)

RJMP IOVF0_9


IOVF0_1:

LDI R_TEMP1, 0xD9 ; 割込時間10mSを再セット

OUT TCNT0, R_TEMP1


IOVF0_9:

OUT SREG,STACK ; POP SREG


RETI


;*******************************************************************************

; サブルーチン

;*******************************************************************************

;*****************************

; タイマ2 (0.1mSタイマ) SUBROUTINE

;*****************************


STMR2:


;---- タイマ2 割込み許可 ----


LDS R_TEMP1,TIMSK2 ; タイマ割込許可

SBR R_TEMP1,(1<<TOIE2)

STS TIMSK2,R_TEMP1


;---- タイマ2 開始----


CBR R_FLAG1,(1<<B_IOVF2) ; タイマ2オーバーフローフラグクリア


LDI R_TEMP1, 0x9C ; 割込時間0.1mS

STS TCNT2, R_TEMP1


LDI R_TEMP1, 0x01 ; プリスケーラ 1

STS TCCR2B, R_TEMP1


STMR2_1:

SBRS R_FLAG1,B_IOVF2 ; タイマ0カウント完了判定

RJMP STMR2_1 ; カウント中


;---- タイマ 停止 ----


LDI R_TEMP1, 0x00

STS TCCR2B, R_TEMP1


;---- タイマ2 割込み禁止 ----


LDS R_TEMP1,TIMSK2

CBR R_TEMP1,(1<<TOIE2)

STS TIMSK2,R_TEMP1


RET


;*****************************

; タイマ0 (10mSタイマ) SUBROUTINE

;*****************************


STMR0:


;---- タイマ0 割込み許可 ----


LDS R_TEMP1,TIMSK0 ; タイマ割込許可

SBR R_TEMP1,(1<<TOIE0)

STS TIMSK0,R_TEMP1


;---- タイマ0 開始----


CBR R_FLAG1,(1<<B_IOVF0) ; タイマ0オーバーフローフラグクリア


LDI R_TEMP1, 0xD9 ; 割込時間10mS

OUT TCNT0, R_TEMP1


LDI R_TEMP1, 0x04 ; プリスケーラ 256

OUT TCCR0B, R_TEMP1


STMR0_1:

SBRS R_FLAG1,B_IOVF0 ; タイマ0カウント完了判定

RJMP STMR0_1 ; カウント中


;---- タイマ 停止 ----


LDI R_TEMP1, 0x00

OUT TCCR0B, R_TEMP1


;---- タイマ0 割込み禁止 ----


LDS R_TEMP1,TIMSK0

CBR R_TEMP1,(1<<TOIE0)

STS TIMSK0,R_TEMP1


RET


;*****************************

; USART 送信

;*****************************

;UARTS:

; LDS R_TEMP0,UCSR0A

; SBRS R_TEMP0,UDRE0

; RJMP UARTS

; STS UDR0,R_TEMP3

; RET

;*****************************

; LCD WAIT処理

;*****************************

LCDW:

CBI PORTC,B_LCD_E


;---- タイマー(1mS)セット ----


LDI R_TMR2,0x0A ; 1mSでフラグセット

RCALL STMR2


SBI PORTC,B_LCD_E


;---- タイマー(1mS)セット ----


LDI R_TMR2,0x0A ; 1mSでフラグセット

RCALL STMR2


RET

;*****************************

; LCD 表示処理

;*****************************

;*************************************************

; 引数で渡されたキャラクタを表示する

; 引数 R_TEMP3 キャラクタフォント

;*************************************************


LCDP:


OUT P_LCD,R_TEMP3


RCALL LCDW


SWAP R_TEMP3


OUT P_LCD,R_TEMP3


RCALL LCDW


RET


;*****************************

; LCD 初期化処理

;*****************************


LCDI:;■■■■ ファンクションセット ■■■■


;********* 初期セットモードへの移行 ******************************


NOP

CBI PORTC,B_LCD_RS

NOP


LDI R_TEMP1,0b00110000

OUT P_LCD,R_TEMP1


RCALL LCDW


;---- タイマー(10mS)セット ----


LDI R_TMR2,0x64 ; 10mSでフラグセット

RCALL STMR2


LDI R_TEMP1,0b00110000

OUT P_LCD,R_TEMP1


RCALL LCDW


;---- タイマー(1mS)セット ----


LDI R_TMR2,0x0A ; 1mSでフラグセット

RCALL STMR2


LDI R_TEMP1,0b00110000

OUT P_LCD,R_TEMP1


RCALL LCDW


;********* 各種設定 ******************************


;---- 4bit-mode セット ----


LDI R_TEMP1,0b00100000

OUT P_LCD,R_TEMP1


RCALL LCDW


;---- 2-line,5x8dot-font セット ----


LDI R_TEMP3,0b00101000

RCALL LCDP


;---- display off セット ----


LDI R_TEMP3,0b00001000

RCALL LCDP


;---- display クリア ----


LDI R_TEMP3,0b00000001

RCALL LCDP


;---- entry-mode セット ----


LDI R_TEMP3,0b00000110

RCALL LCDP


;---- display on セット ----


LDI R_TEMP3,0b00001100

RCALL LCDP


SBI PORTC,B_LCD_RS


RET


;*************************************************

; LCD 起動表示

;*************************************************


LCDS:

;---- リターンホーム ----


CBI PORTC,B_LCD_RS

LDI R_TEMP3,0b00000010

RCALL LCDP

SBI PORTC,B_LCD_RS


;---- display クリア ----


CBI PORTC,B_LCD_RS

LDI R_TEMP3,0b00000001

RCALL LCDP

SBI PORTC,B_LCD_RS


;---- 1行目表示 ----


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,'W'

RCALL LCDP


LDI R_TEMP3,'E'

RCALL LCDP


LDI R_TEMP3,'L'

RCALL LCDP


LDI R_TEMP3,'C'

RCALL LCDP


LDI R_TEMP3,'O'

RCALL LCDP


LDI R_TEMP3,'M'

RCALL LCDP


LDI R_TEMP3,'E'

RCALL LCDP


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,'T'

RCALL LCDP


LDI R_TEMP3,'O'

RCALL LCDP


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,'T'

RCALL LCDP


LDI R_TEMP3,'H'

RCALL LCDP


LDI R_TEMP3,'E'

RCALL LCDP


;---- 2行目先頭へ ----


CBI PORTC,B_LCD_RS

LDI R_TEMP3,0b11000000

RCALL LCDP

SBI PORTC,B_LCD_RS


;---- 2行目表示 ----


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,'L'

RCALL LCDP


LDI R_TEMP3,'C'

RCALL LCDP


LDI R_TEMP3,'D'

RCALL LCDP


LDI R_TEMP3,' '

RCALL LCDP


LDI R_TEMP3,'S'

RCALL LCDP


LDI R_TEMP3,'A'

RCALL LCDP


LDI R_TEMP3,'M'

RCALL LCDP


LDI R_TEMP3,'P'

RCALL LCDP


LDI R_TEMP3,'L'

RCALL LCDP


LDI R_TEMP3,'E'

RCALL LCDP


RET


;*************************************************

; LCD 動作表示

;*************************************************


;LCDM:

;---- リターンホーム ----


; CBI PORTC,B_LCD_RS

; LDI R_TEMP3,0b00000010

; RCALL LCDP

; SBI PORTC,B_LCD_RS


;---- display クリア ----


; CBI PORTC,B_LCD_RS

; LDI R_TEMP3,0b00000001

; RCALL LCDP

; SBI PORTC,B_LCD_RS


;---- 1行目表示 ----


; LDI R_TEMP3,'R'

; RCALL LCDP


; LDI R_TEMP3,'='

; RCALL LCDP


;---- 2行目先頭へ ----


; CBI PORTC,B_LCD_RS

; LDI R_TEMP3,0b11000000

; RCALL LCDP

; SBI PORTC,B_LCD_RS


;---- 2行目表示 ----


; LDI R_TEMP3,'S'

; RCALL LCDP


; LDI R_TEMP3,'='

; RCALL LCDP


; RET


;*****************************

; メインルーチン(MAIN)

;*****************************

MAIN:

CLI ; 全割込み禁止

;---- PORT 設定 ----

;LDI R_TEMP1,0b11111111

;LDI R_TEMP2,0b00000000

;OUT DDRB,R_TEMP1

;OUT PORTB,R_TEMP2


LDI R_TEMP1,0b11110000

LDI R_TEMP2,0b00101111

OUT DDRC,R_TEMP1

OUT PORTC,R_TEMP2


LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRD,R_TEMP1

OUT PORTD,R_TEMP2


;---- USART 設定 ----


;LDI R_TEMP1,25

;STS UBRR0L,R_TEMP1

;LDI R_TEMP1,0

;STS UBRR0H,R_TEMP1 ; ボーレート2400


;LDS R_TEMP1,UCSR0C

;SBR R_TEMP1,((1<<UCSZ01)+(1<<UCSZ00)) ; ノンパリティ/1ストップビット/8ビット長

;STS UCSR0C,R_TEMP1


;LDS R_TEMP1,UCSR0B

;SBR R_TEMP1,((1<<RXEN0)+(1<<TXEN0)) ; 送受信イネーブル

;STS UCSR0B,R_TEMP1


;---- フラグ・ワークレジスタ 初期化 ----


LDI R_FLAG1, 0x00


SEI ; 全割込み許可


;---- LCD(液晶パネル) 初期化 ----------------------


RCALL LCDI


;---- LCD(液晶パネル) 起動表示 ----------------------


RCALL LCDS


;---- タイマ(2秒) ----


;LDI R_TMR0,0xC8

;RCALL STMR0


;---- LCD(液晶パネル) 動作表示 ----------------------


;RCALL LCDM


;---- LCD 文字初期表示位置設定 ----------------------


;LDI R_TEMP4,0x82


MAIN01:

;---- 1文字受信 ----

;LDS R_TEMP1,UCSR0A

;SBRS R_TEMP1,RXC0

;RJMP MAIN01 ; 受信バッファが空

;LDS R_TEMP5,UDR0


;---- LCD 文字表示位置 最終桁+1判定 ----------------------


CPI R_TEMP4,0x90

BREQ MAIN10 ; 最終桁+1である


MAIN02:

;---- LCD 受信文字表示位置設定 ----------------------


;CBI PORTC,B_LCD_RS

;MOV R_TEMP3,R_TEMP4

;RCALL LCDP

;SBI PORTC,B_LCD_RS


;---- LCD(液晶パネル) 受信文字表示 ----------------------


;MOV R_TEMP3,R_TEMP5

;RCALL LCDP


;---- LCD 送信文字表示位置設定 ----------------------


;CBI PORTC,B_LCD_RS

;MOV R_TEMP3,R_TEMP4

;LDI R_TEMP1,0x40

;ADD R_TEMP3,R_TEMP1

;RCALL LCDP

;SBI PORTC,B_LCD_RS


;---- 受信文字 判定 ----------------------


;CPI R_TEMP5,'T'

;BRNE MAIN20 ; 受信文字が'T'でない


;IN R_TEMP3,P_SW0 ; 受信文字が'T'である

;ANDI R_TEMP3,0x0F ; 不要ビットマスキング

;LDI R_TEMP1,0x0F

;EOR R_TEMP3,R_TEMP1 ; リアルコード→コンプリメンタリコード変換

;LDI R_TEMP1,0x30

;ADD R_TEMP3,R_TEMP1


MAIN03:

;---- 1文字送信 ----

;RCALL UARTS ; パソコン転送


;---- LCD(液晶パネル) 送信文字表示 ----------------------


;RCALL LCDP

;INC R_TEMP4

;RJMP MAIN01


MAIN10:


;---- LCD(液晶パネル) 動作表示 ----------------------


;RCALL LCDM


;---- LCD 文字初期表示位置設定 ----------------------


LDI R_TEMP4,0x82


RJMP MAIN02


MAIN20:

;LDI R_TEMP3,'X'

RJMP MAIN03

2024年3月17日日曜日

PIC pickit3 and mplab snap

 PIC10F322 + PICKIT3 + Windows11 + MPLAB + MCCの環境構築が大変だった件 #PIC10F200 - Qiita

こんばんは。MCCはそれぞれ別のバージョンがインストールできます。ちなみにMPLAB5.35のときは4(4.2.1がひとつ前の大全本)、MPLAB6.2のときは5.5でした。よろしくお願いします。 MPLAB5番はPICKIT3うごく、6番はPICKIT4以降またはMPLAB-SNAP(7000円)

-----------------------------------------------------------------------------------

【PIC】PICの使い方を解説する-PICKIT3とMPLABを使うよ!- - TRY-AND-ERROR-AND-TRY (aisumegane.com) 中華pickit3のつなぎかた pic16f1827,pic121822,12lf1840のセットのしかたが詳しい ちなみにpickit4と違い、5vの外部電源を外付け必要(uspisp同様)

PICを使ってLチカ|キム日記 (kimudiary.com)  も参考になった

-----------------------------------------------------------

PIC16F18313 MPLAB+MCC+MPLAB-SNAP/pickit4での後閑さんの8ピン本 これはmplab6.2以降,mccも5以降のようだ プロジェクト作成時にmcc起動しないを選択するとモシニャガ本にもつかえるみたいだ 以下の注意点があった

ウィンドウズ10のPCで、まったく同じコードでLVP=off(モシニャガ先生の設定)ではmplab snapがうごかず、LVP=onにするだけで書き込み成功(mplab x 5.35,6.2ともども) 

ちなみに12年前のウィンドウPCに64bit ubuntu23をインストしたPCにmplab x 6.2をインストしたのでも成功 こちらは驚異的スピードでのコンパイルと書き込みでした 

https://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB%20Snap%20In-Circuit%20Debugger%20IS%20DS50002787A.pdf を参照 矢印がピン1 外部電圧必要



2024年3月16日土曜日

usart on atmega88/328

2進化10進のコードが難解なのでTをいれたら0,それ以外をいれたらXが返るようにした

;; USART.ASM RX/TX :: TERATERM 2400BAUD SUCCESS!

.include "m88def.inc"

.def STACK = R16

.def R_TEMP1 = R17

.def R_TEMP2 = R18

.def R_TEMP3 = R19

.EQU P_SW0 = PINC  ;SW0

.CSEG 

RJMP MAIN

;;---------------------------

;;  USART SEND ROUTINE

;;-----------------------

UARTS:

LDS R_TEMP1,UCSR0A

SBRS R_TEMP1,UDRE0

RJMP UARTS

STS UDR0,R_TEMP3 ; R_TEMP3 VAL SETUP IN MAIN ROUTINE

RET

; --------------- MAIN ROUTINE ---------------------

MAIN:

CLI

LDI R_TEMP1,0b11110000

LDI R_TEMP2,0b00001111

OUT DDRC,R_TEMP1

OUT PORTC,R_TEMP2

   

; -- USART INIT

LDI R_TEMP1,25 

STS UBRR0L,R_TEMP1

LDI R_TEMP1,0

STS UBRR0H,R_TEMP1 ; BAUD RATE 2400

LDS R_TEMP1,UCSR0C

SBR R_TEMP1,((1<<UCSZ01)+(1<<UCSZ00)) 

STS UCSR0C,R_TEMP1 ; NO-PARI/1STOP/8BIT-LEN

LDS R_TEMP1,UCSR0B

SBR R_TEMP1,((1<<RXEN0)+(1<<TXEN0)) 

STS UCSR0B,R_TEMP1 ; TX/RX ENABLE

SEI

MAIN01:

LDS R_TEMP1,UCSR0A ; 1 CHAR RECV

SBRS R_TEMP1,RXC0

RJMP MAIN01

LDS R_TEMP3,UDR0 ; RECV BUFFER IS EMPTY

CPI R_TEMP3,'T'

BRNE MAIN10 ; IF NOT T,GOTO MAIN10

;IN R_TEMP3,P_SW0  ;IF T, UNUSED BITS MASKING

;ANDI R_TEMP3,0x0F

;LDI R_TEMP1,0x0F

;EOR R_TEMP3,R_TEMP1 ; REAL CODE -> COMPLEMENTARY CODE CONV

LDI R_TEMP3,0x00

LDI R_TEMP1,0x30

ADD R_TEMP3,R_TEMP1

MAIN02:

RCALL UARTS ; CONVERTED CHAR SEND TO PC

RJMP MAIN01

MAIN10:

LDI R_TEMP3,'X'

RJMP MAIN02

ーーーーーーーーーーーATMEGA88 SEND TO PC ---------------------------- 

以下のコードはinoにしてarduinoIDEは通らんかったのでcにしてmicrochip studioで成功

#include <stdint.h>

#include <avr/io.h>

#include <util/delay.h>

#define F_CPU 1000000UL いらんかも。。。

// +-----------------------------------------------------------------------+ //

// | ATmega328p Baudrate calc is as below を88に変更

// +--https://qiita.com/k_match/items/c99d25adf6b1a984061f

//---------------------------------------------------------------------+ //

#define BAUD_RATE_2400_BPS  25 // 2400bps

// +-----------------------------------------------------------------------+ //

int main()

{

  int i = 0;

  unsigned int ubrr = BAUD_RATE_2400_BPS;

  unsigned char data[] = "Hello from ATmega88  ";

  /* Set Baudrate  */

  UBRR0H = (ubrr>>8);

 // Shift the 16bit value ubrr 8 times to the right and

//  transfer the upper 8 bits to UBBR0H register.

  UBRR0L = (ubrr);   

 // Copy the 16 bit value ubrr to the 8 bit UBBR0L register,

// Upper 8 bits are truncated while lower 8 bits are copied

  UCSR0C = 0x06;       /* Set frame format: 8data, 1stop bit  */

  UCSR0B = (1<<TXEN0); /* Enable  transmitter                 */

  while(1) /* Loop the messsage continously */

  {

    i = 0;

    while(data[i] != 0) /* print the String  "Hello from ATmega328p" */

    {

      while (!( UCSR0A & (1<<UDRE0))); /* Wait for empty transmit buffer       */

      /* When UDRE0 = 0,data transmisson ongoing.                         */

      /* So NOT{[UCSR0A & (1<<UDRE0)] = 0} = 1 ,While(1) loop stays there */

      /* When UDRE0 = 1,data transmisson completed.                       */

      /* So NOT{[UCSR0A & (1<<UDRE0)] = 1} = 0 ,While(0) loop fails       */

      UDR0 = data[i];          /* Put data into buffer, sends the data */

      i++;                             /* increment counter                    */

    }

    /* Sending '\n'  '\r' Character pair helps to format the output properly on console putty Screen */

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

    /* Send "\n" Character */

    while (!( UCSR0A & (1<<UDRE0)));   /* Wait for empty transmit buffer       */

    UDR0 = '\n';              /* Put data into buffer, sends the data */

    /* Send "\r" Character */

    while (!( UCSR0A & (1<<UDRE0)));   /* Wait for empty transmit buffer       */

    UDR0 = '\r';              /* Put data into buffer, sends the data */

    /*---------------------------------------------------------------------------*/

    _delay_ms(100);

  }

}

--------FROM PC TO ATMEGA328P 8MHZ ----これはテラタームから動かせたが-----------
void setup() { 
  Serial.begin(9600); 
} 
void loop() { 
  if(Serial.available() > 0) { 
    int data = Serial.read(); 
    Serial.println(data,HEX); 
    if (data==0X61)
    digitalWrite(LED_BUILTIN,HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN,LOW);
  } 
} 
----------PC TO ATMEGA328P 8MHZ ------本命成功---------------------------------------
以下をinoで保存しarduinoIDEでコンパイル arduinoUNOに空コードを書き込み
rx/txをクロスせずにつないでarduinoIDEで9600ボーにして
改行なしでAをいれるとLEDついた! もちろんTERATERMでも動いた!
// External Oscillator = 11.0592MHz -> Internal 8mhzに変更
// Controller ATmega328p 
//| Compiler           : AVR GCC (WinAVR)                                                          |
//| Microcontroller    : ATmega328p                                                                |

#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL
#define BAUD_RATE_9600_BPS  51  // 9600bps for 8mhz
// +-----------------------------------------------------------------------+ //

int main()
{
unsigned int ubrr = BAUD_RATE_9600_BPS;
PORTC = 0x00; //All LED's OFF
PORTD = 0x00;
/* Set Baudrate @ 230.4k bps */
UBRR0H = (ubrr>>8);
UBRR0L = (ubrr);
/*Enable receiver  */
UCSR0B = (1<<RXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = 0x06;
DDRC  |= (1<<PC4); // Blinks LED
PORTC |= (1<<PC4);
_delay_ms(500);
PORTC &= ~(1<<PC4); // LEDの試運転コード
while(1)
{
while ( !(UCSR0A & (1<<RXC0)) ); /* Wait for data to be received */
     // using the switch() statement to  control the LED and Buzzer
switch(UDR0) 
{
case 'A' : DDRC  |= (1<<PC4); // Blinks LED
PORTC |= (1<<PC4);
_delay_ms(500);
PORTC &= ~(1<<PC4);
break;
case 'B' : DDRC  |= (1<<PC5); // Beeps Buzzer
PORTC |= (1<<PC5);
_delay_ms(500);
PORTC &= ~(1<<PC5);
break;
default  :
break;
}//end of Switch()
}//end of While(1)
}//end of main

2024年3月5日火曜日

WDT/USART,SPI,I2C at Uno

avr-attiny-tutorial/blink_watchdog_interupt/main.c at master · casperbang/avr-attiny-tutorial · GitHub 吉野さんによればwdt.h,avr/io.hが抜けているとのこと

以下のコードでattiny13aで大成功 WDTは、AVRマイコン・リファレンスブック P52の図2-18のように128KHzオシレータで動いているので、マイコンのクロックとは別になっています。内部・外部いずれのクロックでも同じ動作だともいます。

(ATtiny ウォッチドッグタイマ割込みでLEDチカチカ | 東京お気楽カメラ (okiraku-camera.tokyo) これはattiny85系だった)

#include <avr/interrupt.h>

#include <avr/sleep.h>

#include <avr/wdt.h>

#include <avr/io.h>

#define LED PB0

ISR(WDT_vect) {

    // Toggle port B output 0 output state

    PORTB ^= _BV(LED);

}

int main(void) {

    // Set port B output 0 as output

    DDRB = _BV(LED);

    // Prescale timer to 4s -->wrong! 500msだった

    WDTCR |= (1<<WDP2) | (1<<WDP0); // 

    // Enable watchdog timer interrupts

    WDTCR |= (1<<WDTIE);

// ATtiny13Aでウォッチドッグタイマを使ったタイマー割り込み: 猫にコ・ン・バ・ン・ワ (cocolog-nifty.com) これによるとunoならwdtieでなくwdieになるげな

    // Enable global interrupts 

    sei();

    // Use the Power Down sleep mode

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);

    for (;;) {

        sleep_mode(); // Deep sleep, waiting for interrupt

    }

}

以下はattiny2313で成功


/*
 *  WDT 【ATtiny2313】
 *   wdt.c  2024.3.6
 */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define LED PB0

ISR(WDT_OVERFLOW_vect) {   
    PORTB ^= _BV(LED);
}

int main(void) {
    DDRB = _BV(LED);
 WDTCSR |= (1<<WDIE) | (1<<WDP2) | (1<<WDP0);     // Enable watchdog timer interrupts
                                                                                                // Prescale timer to 500ms     
    sei();
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);                // Use the Power Down sleep mode
    while (1) {
        sleep_mode();                                                             // Deep sleep, waiting for interrupt
    }
}


------------------------------------------------------------

普通はtx,rxでいい。。。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

 AT24Cxx - Arduino Reference 中華EEPROM I2C仕様 なんかおかしい。。。。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

A-Dコンバータ その1 10ビットSPI MCP3002 - Arduinoクックブック (denshi.club) 

SPIサンプルコード成功した 2チャンネルなので使い勝手がいい,bme vs dht like

2024年3月4日月曜日

avr-pedia

 AVR - ArchWiki (archlinux.jp) avr-gcc,avrobjcopy,avrdude....great site

ATtiny2313 AVR 8-bit Microcontroller Tutorial (startingelectronics.com) great

-------------------------------------------------------------------

/usr/share/avraにあるtn2313def.incを自動でさがしてくれないのでコピーしました 

avra prog.asmでできたprog.hexを

avrdude -p t2313 -c USBasp -U flash:w:prog.hex:iで書きこみ成功しました
.include "./tn2313def.inc" .cseg LDI R16,0b00001000 OUT DDRB,R16 ;PB3は出力, 他は入力 LOOP: LDI R16,0b00001000 OUT PORTB,R16 ;PB3は1(LED点灯), 他は0 RJMP LOOP ;LOOPの箇所にジャンプ

--------------cをinoにするとarduinoIDE ok------------------------------------------------
あへてavrgcc-toolchainをつかうなら
avr-gcc -O -mmcu=attiny2313 main.c -o prog
avr-objcopy -F ihex prog prog.hex
avrdude -c usbasp -p attiny2313 -U flash:w:prog.hex:i