Ruslan Popov ([info]r_a_d) wrote,

Имитатор сердца

Накидал код, проверил в эмуляторе (кстате, если отключить анимацию кода и задрать частоту контроллёра, то носится почти в реалтайме), буду завтра прошивать.



;;;
;;; ИМИТАТОР СЕРДЦА
;;;
.include "C:\VMLAB\include\tn13def.inc"

.equ	sec14		= 5 ; 1/4 секунды для 1.2 МГц / 256
.def  temp		= r16
.def  counter	= r17
.def  scaler	= r18

reset:
	rjmp	start
	reti	; Addr $01
	reti	; Addr $02
	reti	; Addr $03
	reti	; Addr $04
	reti	; Addr $05	
	reti	; Addr $06        Use 'rjmp myVector'
	reti	; Addr $07        to define a interrupt vector
	reti	; Addr $08
	reti	; Addr $09
	reti	; Addr $0A
	reti	; Addr $0B        This is just an example
	reti	; Addr $0C        Not all MCUs have the same
	reti	; Addr $0D        number of interrupt vectors
	reti	; Addr $0E
	reti	; Addr $0F
	reti	; Addr $10

start:
	; настраиваем стек
	ldi	temp,ramend
	out	spl,temp
	; по умолчанию чип работает на 9.6МГц с делителем на 8 = 1.2МГц
	; 1.2МГц/256=4.678кГц,
	; 4678/256=18циклов по 256 отсчётов в секунду
	; настраиваем делитель частоты
	ldi	temp, 0b10000000 ; инициализация процесса
	out	clkpr,temp
	ldi	temp, 0b00001000 ; делим на 256, см. стр. 28 даташита
	out	clkpr,temp
	; порт PB0 переводим в режим выхода, остальные остаются
	; работать как входы
	sbi	ddrb,0
	; мигаем три раза при старте программы
	rcall	init_flash

forever: ; мырг-мырг-пауза
	rcall	led_on
	rcall	middle_pause
	rcall	led_off
	rcall	short_pause
	rcall	led_on
	rcall	middle_pause
	rcall	led_off
	rcall	long_pause
	rjmp	forever ; бесконечно

led_on: ; зажечь диод
	ldi	temp,0b00111110
	out	portb,temp
	ret

led_off: ; погасить диод
	ldi	temp,0b00111111
	out	portb,temp
	ret

short_pause: ; 1/4 секунды
	ldi	counter,0
	ldi	scaler,sec14
sp_loop:
	dec	counter
	brne	sp_loop
	dec	scaler
	brne	sp_loop
	ret
	
middle_pause: ; 1/2 секунды
	rcall	short_pause
	rcall	short_pause
	ret

long_pause: ; 1 секунда
	rcall	short_pause
	rcall	short_pause
	rcall	short_pause
	rcall	short_pause
	ret
	
init_flash: ; мигнуть три раза
	rcall	led_on
	rcall	middle_pause
	rcall	led_off
	rcall	short_pause
	rcall	led_on
	rcall	middle_pause
	rcall	led_off
	rcall	short_pause
	rcall	led_on
	rcall	middle_pause
	rcall	led_off
	rcall	long_pause
	ret
Tags: asm, avr, linux, source, микроконтроллёр, пайка, хобби

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments

[info]r_a_d

March 15 2009, 18:47:56 UTC 3 years ago

Засада подкралась незаметно. МК отлично прошивался, программа работала. Но вот изменить программу не удавалось. На что только не думал я и канал easyelectronics@caonference.jabber.ru. Я несколько раз вносил изменения в обвязку МК и в сам программатор. В итоге оказалось, что проблема была в этих строчка кода:
        ldi	temp, 0b10000000 ; инициализация процесса
	out	clkpr,temp
	ldi	temp, 0b00001000 ; делим на 256, см. стр. 28 даташита
	out	clkpr,temp

Получалось, что МК начинал работать на частоте 37.5 кГц (9.6 МГц/256). Непонятно, почему эта настройка не сбрасывалась при RESET. А программатор пытался общаться с МК на стандартных 800 Гц.

Победную идею подсказал камрад threevc, за что ему громадное спасибо!

Вот победная команда:
bk-rpopov:/home/rad/devel/avreal# ./avreal32-1.26r3 -p378 -as +tiny13 -o37500Hz

avreal/LINUX  -  AVR controllers LPT programmer by Redchuk Alexandr
v1.26rev3 (Dec 13 2008 10:31:33)  http://www.ln.ua/~real/avreal
bug-reports, suggestions and so on mail to avreal@real.kiev.ua
Command: -p378 -as +tiny13 -o37500Hz
Device connected, tiny13 detected
Chip not locked
Fuses
  OSCCALs       = 62 66
  EESAVE        = 1
  WDTON         = 1
  CKDIV         = 0
  SUT           = 2
  CKSEL         = 2
  SELFPRGEN     = 1
  DWEN          = 1
  BODLEVEL      = 3
  RSTDISBL      = 1
Total time 0.3s
Reset pin released
Adapter disabled
bk-rpopov:/home/rad/devel/avreal#

Deleted comment

[info]r_a_d

September 6 2009, 09:21:15 UTC 2 years ago

Re: ..........

http://radz.ya.ru/replies.xml?item_no=1283
Это будет поинтереснее.

[info]r_a_d

September 13 2009, 19:52:19 UTC 2 years ago

А вот с прошивкой этого же HEX файла всё в тот же МК на x64 системе AVreal справиться не смог.
В итоге пришлось изучить avrdude:

rad@kitchen:~/bin$ sudo avrdude -c stk200 -p attiny13 -U flash:w:heart.hex:i

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9007
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "heart.hex"
avrdude: writing flash (136 bytes):

Writing | ################################################## | 100% 0.06s

avrdude: 136 bytes of flash written
avrdude: verifying flash memory against heart.hex:
avrdude: load data flash data from input file heart.hex:
avrdude: input file heart.hex contains 136 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.04s

avrdude: verifying ...
avrdude: 136 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…