logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak edytować program ASM dla RC5 na Attiny13 zamiast Attiny22?

ciszex 11 Paź 2007 16:32 2999 5
REKLAMA
  • #1 4368875
    ciszex
    Poziom 11  
    Posty: 64
    Ocena: 4
    Witam chętnie kupię uC Attiny22 lub też proszę fanatyków - elektroników o edycję programu do obsługi RC5 (*.asm w załączniku).
    Więcej na temat układu, który chcę uruchomić jest na https://www.elektroda.pl/rtvforum/topic797491.html

    ps. hex pomyślnie zaprogramowałem na Attiny13, niestety nie działa to. (nawet nie zapisuje kudu RC5 w EEPROM)

    ASM - RC5
    ;**** T I T L E    R C 5 T I N Y L A M P    ***************************************
    ;*
    ;* Title		:RC5TinyLamp 
    ;* Version		:1.0
    ;* Date			:00.05.31
    ;* Last updated		:00.08.19
    ;* Target		:ATTiny22 
    ;* Crystal frequency	:1Mhz intern oscillator
    ;*
    ;* Support		:J.v.Boxtel
    ;* Support E-mail	:boxteldoelen@hetnet.nl
    ;*
    ;* Code Size		:149 words 
    ;* Low Register Usage	:5 
    ;* High Register Usage	:11 
    ;* Interrupt Usage	:
    ;* Based on 		:avr410 rc5, avr100 EEprom access, RC5Lamp
    ;*
    ;* DESCRIPTION
    ;* This Application switch a lamp on/off with RC5 if
    ;* system and lamp_nr are correct
    ;* system and lamp_nr are can be change with the "learn_button"
    ;* pB2 (pin7) is IRinput, pB3 (pin2) is learn button, pB0 (pin5) is output
    ;* pB3 learbutton open=normal groud=learn
    ;* pB1 (pin6) ext interrupt 
    ;***************************************************************************
    
    .include "tn22def.inc"
    
    	.equ INPUT 	 =2	 ;PB2 input for ir reciever
    
    	.def S 		 =R0	 ;Storage for the Status Register
    	.def inttemp     =R1	 ;Temporary variable for ISR
    	.def ref1	 =R2	 ;Reference for timing
    	.def ref2	 =R3 	 ;Reference for timing
    	.def EEdrd       =R4	 ;read data byte from EEprom
    	.def temp	 =R16	 ;Temporary variable
    	.def timerL	 =R17	 ;Timing variable updated every 14 us
    	.def timerH	 =R18	 ;Timing variable updated every 16 ms
    	.def system	 =R19	 ;Address data received
    	.def command	 =R20	 ;Command received
    	.def bitcnt	 =R21	 ;Counter
    	.def SYS_ADDR	 =R22	 ;Systen addres to respond on
    	.def LAMP_NR	 =R23	 ;Lamp number to respond on
    	.def EEard       =R24	 ;address to read from
    	.def EEdwr	 =R25	 ;data byte to write to EEPROM
    	.def EEawr	 =R26	 ;address byte to write to
    
    .cseg
    .org 0
    
    	rjmp reset
    
    ;********************************************************************
    ;* "TIM0_OVF" - Timer/counter overflow interrupt handler
    ;*
    ;* The overflow interrupt increments the "timerL" and "timerH"
    ;* every 64us and 16,384us.
    ;*
    ;* Crystal Frequency is 1 MHz
    ;*
    ;* Number of words:
    ;* Number of cycles:6 + reti
    ;* Low registers used:1
    ;* High registers used: 3
    ;* Pointers used:0
    ;********************************************************************
    .org OVF0addr
    TIM0_OVF:
    	in S,sreg 		; Store SREG
    	inc timerL 		; Updated every 64us
    	inc inttemp		;   4 MHz clock
    	inc timerL 		; Updated every 64us
    	inc inttemp		;   3 MHz clock
    	inc timerL 		; Updated every 64us
    	inc inttemp		;   2 MHz clock
    	inc timerL 		; Updated every 64us
    	inc inttemp		;   1 MHz clock
    	brne TIM0_OVF_exit
    
    	inc timerH 		; if 256th int inc timer
    
         TIM0_OVF_exit:
    	out sreg,S 		; Restore SREG
    	reti
    
    reset:
    	ldi temp,1 		;Timer/Counter 0 clocked at CK
    	out TCCR0,temp		;  Timer counter 0 prescaler
    	ldi temp,1<<TOIE0 	;Enable Timer0 overflow interrupt
    	out TIMSK,temp		;  set timer interrupt mask
    	ldi temp,0x01 		;PORTB 0 as output
    	out DDRb,temp		;  set direction
    	ldi temp,15		;load 15 for init pullup on pB1,pB2;pB3 
    	out portb,temp		;  and set defaul lamp off after reset
    	
    	ldi temp,ramend		;init stack pointer
    	out spl,temp		;  ram_end to spl
    	
    	sei 			;Enable global interrupt
    
    main:	
    	rcall detect		;Call RC5 detect routine
    	
    	cpi command,0xFF	;If no or wrong code return to main
    	breq main
    	
    	in temp,pinb		;learbutton test
    	andi temp,$08		;  test pb3 only (learnbutton)
    	cpi temp,$08		;  high then main1
    	breq main1		
        
         	   
    	mov	EEdwr,system	;store new system addres in EEprom
    	ldi	EEawr,$00	;  at addres 00
    	rcall	EEWrite		;  store system in EEPROM location $0000
    
    	andi command,0x3F	;remove toggle bit
    	mov	EEdwr,command	;store new command in EEprom
    	ldi	EEawr,$01	;  at addres $0001
    	rcall	EEWrite		;  store command in EEPROM location $0001
    		
        main1:	
    	rcall readin		;readin the system-addres and lamp_nr
    	
    	cp system,sys_addr	;correct addres? else return to main
    	brne main
    	
    	andi command,0x3F	;remove toggle bit
    	cp command,lamp_nr	;correct lamp nr? else return to main
    	brne main
    	
    invert:
    	brts invert1		;if T bit is 0 then lamp on
    	set			;set t bit (lamp on code)
    	cbi $18,0		;port pin low =lamp on
    	rjmp wait 		;jump to wait
         invert1:			;if t bit is 1 then lamp off
       	clt			;clear t bit (lamp off code)
       	sbi $18,0		;set pin high
         wait:
    	rcall detect		;Call RC5 detect routine and
    	cpi command,0xFF	;   wait until button is released
    	brne wait		;
      	rjmp main		;
    	
    readin:
    	ldi	EEard,$00	;load addres
    	rcall	EERead		;read address $00 (System addres)
    	mov	sys_addr,EEdrd	;load system addres
    	
    	ldi	EEard,$01	;load addres
    	rcall	EERead		;read address $01 (command number)
    	mov	lamp_nr,EEdrd	;command mumber is lamp number
    	
    	ret
    	
    ;***************************************************************************
    ;* 
    ;* EERead
    ;*
    ;* This subroutine waits until the EEPROM is ready to be programmed, then
    ;* reads the register variable "EEdrd" from address "EEardh:EEard"
    ;*
    ;* Number of words	:1200 ; 5 + return
    ;*			:8515 ; 6 + return
    ;* Number of cycles	:1200 ; 8 + return (if EEPROM is ready)
    ;*			:8515 ; 9 + return (if EEPROM is ready)
    ;* Low Registers used	:1 (EEdrd)
    ;* High Registers used:	:2 (EEard,EEardh)
    ;*
    ;***************************************************************************
    
    
    EERead:
    	sbic	EECR,EEWE	;if EEWE not clear
    	rjmp	EERead		;    wait more
    	out	EEAR,EEard	;output address for 1200
    
    
    	sbi	EECR,EERE	;set EEPROM Read strobe
    				;This instruction takes 4 clock cycles since
    				;it halts the CPU for two clock cycles
    	in	EEdrd,EEDR	;get data
    	ret
    
    EEWrite:
    	sbic	EECR,EEWE	;if EEWE not clear
    	rjmp	EEWrite		;    wait more
    
    	out	EEARL,EEawr	;output address low 
    
    	out	EEDR,EEdwr	;output data
    	sbi 	EECR,EEMWE	;  set master write enable
    	sbi	EECR,EEWE	;  set EEPROM Write strobe
    				;  This instruction takes 4 clock cycles since
    				;  it halts the CPU for two clock cycles
    	ret
    
    
    ;********************************************************************
    ;* "detect" - RC5 decode routine
    ;*
    ;* This subroutine decodes the RC5 bit stream applied on PORTB
    ;* pin "INPUT".
    ;*
    ;* If success: The command and system address are
    ;* returned in "command" and "system".
    ;* Bit 6 of "command" holds the toggle bit.
    ;*
    ;* If failed: $FF in both "system" and "command"
    ;*
    ;* Crystal frequency is 4MHz
    ;*
    ;* Number of words:72
    ;* Low registers used: 3
    ;* High registers used: 6
    ;* Pointers used: 0
    ;********************************************************************
    detect0:			;only for test
    	ldi command,0x7
    	ldi system,0x05
    	ret
    	
    detect:
    	clr inttemp 		; Init Counters
    	clr timerH
         detect1:
    	clr timerL
         detect2:
    	cpi timerH,8		;If line not idle within 131ms
    	brlo dl1
    	rjmp fault 		;then exit
         dl1:
    	cpi timerL,55		;If line low for 3.5ms
    	brge start1 		;then wait for start bit
    	sbis PINB,INPUT 	;If line is
    	rjmp detect1 		;low - jump to detect1
    	rjmp detect2 		;high - jump to detect2
         start1:
    	cpi timerH,8 		;If no start bit detected
    	brge fault 		;within 130ms then exit
    	sbic PINB,INPUT 	;Wait for start bit
    	rjmp start1
    	clr timerL 		;Measure length of start bit
         start2:
    	cpi timerL,17 		;If startbit longer than 1.1ms,
    	brge fault 		;exit
    	sbis PINB,INPUT
    	rjmp start2 		;Positive edge of 1st start bit
    	mov temp,timerL 	;timer is 1/2 bit time.
    
    	clr timerL
    	mov ref1,temp
    	lsr ref1
    	mov ref2,ref1
    	add ref1,temp 		;ref1 = 3/4 bit time
    	lsl temp
    	add ref2,temp 		;ref2 = 5/4 bit time
         start3:
    	cp timerL,ref1 		;If high period St2 > 3/4 bit time
    	brge fault 		;exit
    	sbic PINB,INPUT 	;Wait for falling edge start bit 2
    	rjmp start3
    	clr timerL
    	ldi bitcnt,12 		;Receive 12 bits
    	clr command
    	clr system
         sample:
    	cp timerL,ref1 		;Sample INPUT at 1/4 bit time
    	brlo sample
    	sbic PINB,INPUT
    	rjmp bit_is_a_1 	;Jump if line high
         bit_is_a_0:
    	clc 			;Store a ’0’
    	rol command
    	rol system
    				;Synchronize timing
         bit_is_a_0a:
    	cp timerL,ref2 		;If no edge within 3/4 bit time
    	brge fault 		;exit
    	sbis PINB,INPUT 	;Wait for rising edge
    	rjmp bit_is_a_0a 	;in the middle of the bit
    	clr timerL
    	rjmp nextbit
         bit_is_a_1:
    	sec 			;Store a ’1’
    	rol command
    	rol system
    				;Synchronize timing
         bit_is_a_1a:
    	cp timerL,ref2 		;If no edge within 3/4 bit time
    	brge fault 		;exit
    	sbic PINB,INPUT 	;Wait for falling edge
    	rjmp bit_is_a_1a 	;in the middle of the bit.
    	clr timerL
         nextbit:
    	dec bitcnt 		;If bitcnt > 0
    	brne sample 		;get next bit
    				;All bits sucessfully received!
    	mov temp,command 	;Place system bits in "system"
    	rol temp
    	rol system
    	rol temp
    	rol system
    
    	andi command,0b01111111
    	andi system,0x1F
    	ret
    
         fault:
    	ser command 		;Both "command" and "system"
    	ser system 		;0xFF indicates failure
    	ret
    
    	.eseg
    	.org 0
    table:
    	.db $00,$04	;KTV1, button 4 default settings
    Załączniki:
    • schemat2.rar (133.04 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • program.rar (3.71 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 4370450
    vaitek
    Poziom 12  
    Posty: 26
    Pomógł: 4
    przede wszystkim zmien
    .include "tn22def.inc"
    na
    .include "tn13def.inc"

    przekompiluj program.... - zobacz jakie błędy
    następnie w jednym okienku acrobat readera otwierasz "dejtaszita" attiny22 a w drugim attiny13 - strona po stronie, rejestr po rejestrze porownujesz co trzeba zmienic... - moze nie jest to kompleksowe rozwiązanie - ale od tego bym zaczął.... - to ze hex z attiny22 wszedl na attiny13.... - to tak jakbys hexa z aduc836 (8051) wrzucil na atmega128 (AVR).... - nie wiem do czego to porownac... - benzyne lac do diesel'a i odwrotnie ? - wiadomo, ze bak to przyjmie... - ale co na to silnik ? ;)
  • REKLAMA
  • #3 4371984
    ciszex
    Poziom 11  
    Posty: 64
    Ocena: 4
    są 2 błędy ...

    (89) error: Undefined symbol: TCCR0
      -->	out TCCR0,temp		;  Timer counter 0 prescaler
    
    (91): error: Undefined symbol: TIMSK
      -->	out TIMSK,temp		;  set timer interrupt mask


    nie mam pojęcia o co chodzi ... :/

    Dodano po 37 [minuty]:

    poprawiłem to na

    out TCCR0B,temp ; Timer counter 0 prescaler

    i

    out TIMSK0,temp ; set timer interrupt mask

    avrstudio 4.14 skompilował mi to. Jak myślicie będzie to działać ??

    pdf -> attiny22 -> http://avr.hw.cz/pdf/attiny_22.pdf
    pdf -> attiny13 -> http://www.atmel-grenoble.com/dyn/resources/prod_documents/doc2535.pdf
  • REKLAMA
  • #4 4372124
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Nazwy rejestrów podmieniłeś dobrze. Program chyba nie korzysta z żadnych bardzo zaawansowanych "ficzerów", :wink: więc jest duża szansa, że zadziała. Zobaczysz w praktyce :)

    P.S. Spojrzałbym na schemat, ale rar mnie skutecznie zniechęca...
  • REKLAMA
  • #6 5125575
    ciszex
    Poziom 11  
    Posty: 64
    Ocena: 4
    Działa !!
    Problem tkwił w odbiorniku RC5. Obecnie jest TSOP1736 - trzeba zamienić wyprowadzenia.
    Program ok - w załączniku dla attiny13.
    Załączniki:
    • sterowanie_oswietleniem_attiny13.zip (3.92 KB) Musisz być zalogowany, aby pobrać ten załącznik.
REKLAMA