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 pickit3shield

 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での書籍あり これはmplab6以降,mccも5? pickit4/mplab-snap用



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月8日金曜日

pico-sdk on ubuntu,raspios



windows10 virtualbox lubuntu

第684回 UbuntuからRaspberry Pi Picoを使う | gihyo.jp

ただしそもそもpico-sdkはラズパイOSでつかうのが本筋

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

Raspberry Pi Picoのcmakeを用いたオリジナルプロジェクト - 理系的な戯れ (rikei-tawamure.com) は個別のプロジェクトをつくる解説

RaspberryPiPico SDKを使って小さいサンプルプログラムをビルドする #C - Qiita

これのほうが個別プロジェクトの作り方としてはよかった

Raspberry Pi Pico: 開発環境のセットアップ (zenn.dev) はpico-exampleの説明

以下の-b 1.2.0を取り除くと最新版がインストできる、そうでないと以降ができん

git clone -b 1.2.0 https://github.com/raspberrypi/pico-sdk.git

cd pico-examples mkdir build cd build cmake ..

このあとはbuild内にsample各種ができるcd blinkとし、そこでmakeでuf2ができる 

あとはboot buttonをおしてusb drive となったピコにD&D




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




2024年3月1日金曜日

割込みベクタ一覧/attiny44a/84 deepzone

 GitHub - SpenceKonde/ATTinyCore: Arduino core for ATtiny 1634, 828, x313, x4, x41, x5, x61, x7 and x8 に2313,85,44,84,48,84の割込みテーブルあり 8,10,13 ....?

328pについては ATmega48A, ATmega48PA, ATmega88A, ATmega88PA, ATmega168A, ATmega1688PA, ATmega328, ATmega328P datasheet (akizukidenshi.com) にあり

AVRマイコン(ATmega328P)の使い方 (elec-hobbyist.com) に使用例がある

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

ATtiny24/ATtiny44/ATtiny84をArduinoとして動かす基本的な方法! | ぶらり@web走り書き (burariweb.info) を参考にp*nをつかわずに、5,6で一組、7,8で一組でダブルギアをanalogWriteできた 5,6はそれでないとだめだった 理由不明 すくなくともattiny2313よりはつかいやすい よりAdrduino化したということか