2024年2月26日月曜日

atmega328pを8mhzでブートローダ書いてからコード内で1mhzにして成功!

; timer0-1.asm

.include "m328pdef.inc"

.def STACK = R16

.def R_TEMP1 = R17

.def R_TEMP2 = R18

.EQU P_LED = PORTB ; LED

.EQU B_LED = 0 ; LED


.CSEG

RJMP MAIN

.ORG 0x0020 ; 0010 for mega48series

RJMP IOVF0


IOVF0:

IN STACK,SREG

LDI R_TEMP1,0x00

OUT TCCR0B,R_TEMP1

SBI PINB, B_LED

LDI R_TEMP1,0x9E ; 100mS

OUT TCNT0,R_TEMP1


LDI R_TEMP1,0x05

OUT TCCR0B,R_TEMP1


OUT SREG,STACK


RETI


MAIN:


CLI

LDI R16,0b10000000 ; 以下4行で8mhzが1mhzになる

STS CLKPR,R16

LDI R16,0b00000011

STS CLKPR,R16 

  

LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRB,R_TEMP1

OUT PORTB,R_TEMP2


LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRC,R_TEMP1

OUT PORTC,R_TEMP2


LDI R_TEMP1,0b11111111

LDI R_TEMP2,0b00000000

OUT DDRD,R_TEMP1

OUT PORTD,R_TEMP2


LDI R_TEMP1,0x05 ; prescale 1024

OUT TCCR0B,R_TEMP1


LDI R_TEMP1,0x9E ; 100mS

OUT TCNT0,R_TEMP1

LDS R_TEMP1,TIMSK0

SBR R_TEMP1,(1<<TOIE0)

STS TIMSK0,R_TEMP1

SEI 


MAIN01:

RJMP MAIN01


注:こんばんは。


> Subject: atmega8にはclkprがないようで
ヒューズ下位バイトの 3:0 を0001とすると内部1MHzになります。8MHzは0100です。

> 添付のファイルですが、attiny88用のtimer0-1.asmをatmega8に無理くり変更してみたのですが
> //の部分がうごきません よって8分周できんので8mhzでも12ms程度となりLチカできません
CLKPRレジスタがないのでヒューズを変更してください。

> //の部分がうごきません
CLR     R16            ; 1
SBR R16,(1<<CLKPCE)           ; 2
STS CLKPR,R16                      ; 3
*                                                ; 4
SBR R16,(1<<CLKPS1)+(1<<CLKPS0))   ; 5
STS CLKPR,R16                                        ; 6   
このコードはATmega88、328Pでも正常に動きません。本当に悩みました。
1でR16は0です。3でR16は0b10000000です。6でR16は0b10000011になり正常に動作しません。
*  ; 4 のところに CLR R16 を入れると4でR16は0b00000000になり、6でR16は0b00000011となり正常に動作します。

LDI R16, 0b10000000
STS  CLKPR, R16     ; P338 設定変更手順 ①
LDI   R16, 0b00000011
STS  CLKPR, R16                  ; P338 設定変更手順 ②
とすれば簡単です。
Cなら、
CLKPR=0b10000000;   // P338 設定変更手順 ①
CLKPR=0b00000011;           // P338 設定変更手順 ②
でOKです。なお①と②は4クロック以内にしないとCLKPCEビットが「0」になります。
よろしくお願いします。


0 件のコメント:

コメントを投稿