Home › Foren-Übersicht › Meine Schaltung funktioniert (noch) nicht :-( › Universeller RC5-Fernbedienungsempfänger

Foren-Übersicht

Sie müssen eingeloggt sein, um zu antworten.

1   2   3     nächste

Thema: Universeller RC5-Fernbedienungsempfänger

Autor Beitrag

TarAx

16 Beiträge

Neuer Benutzer
Neuer Benutzer

Read post 13-12-2011 00:02

Hallo liebe Elektor Elektroniker,

hat jeman schon "Universeller RC5-Fernbedienungsempfänger" von Elektor gebaut?

Link:
http://www.elektor.de/jahrgang/2001/juli/universeller-rc5-fernbedienungsempfanger.59603.lynkx

Meine Schaltung mit ATtiny45, statt mit ATtiny22,
irgenwie funktioniert nicht.

Kann mir jemand helfen?

Ich werde für jede Hilfe sehr dankbar sein!

Mit freundlichem Gruß

Axel

TarAx

16 Beiträge

Neuer Benutzer
Neuer Benutzer

Read post 14-12-2011 09:59

Hallo nochmals,

ich melde mich hier zum ersten mal und ich hoffe das mir jemand helfen kann.

Ich bin euch im Voraus dankbar.

Mit freundlichem Gruß

Axel

wkrug

340 Beiträge

Erfahrener Benutzer
Erfahrener Benutzer

Read post 14-12-2011 19:44

Wenn Du einen anderen Controller als den eigentich vorgesehenen verwenden willst, musst du zumindest den Chip include im Quelltext ändern und das Programm neu compilieren.

Dann sind die entsprechenden Fuses im Controller eventuell anzupassen und vermutlich auch ein paar Registernamen zu ändern.

Wenn Du das alles gemacht hast kannst Du die entstandene .hex Datei, eventuell auch die .eep Datei in den Chip proggen und es sollte laufen. Chance etwa 50:50%.

Ich hab die Schaltung leider nicht aufgebaut und kann Dir deshalb auch hier nicht viel weiterhelfen.

Schreib mal etwas konkreter, wo die Probleme liegen, dann wird Dir hier auch sicher geholfen.

Thomas Scherer

834 Beiträge

Elektor-Experte
Elektor-Experte

Read post 14-12-2011 22:52

die Versionen 22 und 45 unterscheiden sich in mehr als nur der Flash-Größe. Du musst mal schauen, ob diese Unterschiede dann einen Funktion beeinträchtigen. Datenblattstudium ist da angesagt.

Beitrag editiert von Thomas Scherer am 14-12-2011 22:53

TarAx

16 Beiträge

Neuer Benutzer
Neuer Benutzer

Read post 14-12-2011 23:25

Hallo wkrug,

ich danke dir sehr.

Vor allem möchte ich klarstellen, dass ich ein blutiger Anfänger bin und ich werde euch allen sehr dankbar sein für die jede kleinste Hilfe.

Ich bin ein "Melitta-Mischung", Holländer/Kroate, und spreche ein bisschen Deutsch. (Sorry wegen grammatischen Fehlern!)

Vom Beruf bin ich Elektroniker für Automatisierungstechnik, Siemens Sxxx, WinFACTxxx usw., mit BASCOM bin ich "dabei", d.h., ganz ohne Grundlagen, bin ich nicht,
+ und - Pol, kenne ich schon

Ich möchte gerne für mich ein
Universeller IR-Fernbedienungsempfänger
bauen. Dieses Projekt von Elektor hat mir sehr gefallen.

Problem:

1. ATtiny22L wird nicht mehr produziert,
aus dem Grund habe ich mich entschieden für ATtiny45.
Die beiden haben, laut dem Datenblatt, "gleiche" Pinbelegung,
nur andere Geschwindigkeit, 45-ger hat 0-20 MHz.
ATtiny45 habe ich extra ausgewählt wegen größeren Speichers.
(Ich wollte später noch mit NEC-Code "basteln").

2. Programmieren hat gut geklappt,
Test fase auf dem Steckbrett nicht.

a. Im Programmiermodus, muss ich eine Taste sehr lange auf
der FB drücken um den gewünschten RC5-Code auf dem
Empfänger im EEPROM zu speichern.
(Die Diode am PBO->off)

b. Im Normalbetrieb, muss ich eben so lange die ausgewählte
Taste betätigen bis zum (am PBO) die Diode ausgeht.

c. Weiter tut sich nichts mehr.
Ich muss Spannung unterbrechen, dann kann ich die Diode
wieder ausmachen, aber nicht mehr anmachen

Muss der Quelltext nur angepasst werden oder auch Hardware!?!!?

DANKE IM VORAUS!

Mit freundlichem Gruß

Axel

TarAx

16 Beiträge

Neuer Benutzer
Neuer Benutzer

Read post 14-12-2011 23:31

Hallo Thomas Scherer,

danke dir sehr, das ist ein guter Hinweis.

Ich habe schon alles gut nachgeguckt, aber ich bin zu keinem Ergebniss gekommen

Ich studiere weiter, danke vielmals.

Mit freundlichem Gruß

Axel

TarAx

16 Beiträge

Neuer Benutzer
Neuer Benutzer

Read post 14-12-2011 23:51

Hier ist noch "etwas" geänderter Quelltext, nur ATtiny45.
Muss ich auch Frequenz ändern?

-------------------------------------------------------------------------------
;**** 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 :ATTiny45
;* 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 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
--------------------------------------------------------------------------

Danke sehr im Voraus!

wkrug

340 Beiträge

Erfahrener Benutzer
Erfahrener Benutzer

Read post 15-12-2011 15:36

Da fehlt mir auf den ersten Blick so einiges!

1. Die Include Datei ist falsch:
.include "tn45def.inc"

2. Die Interrupt Vektor Tabelle würde ich als komplettes aus dem Datenblatt übernehmen und die nicht benötigten Adressen mit RETI deaktivieren:
.cseg
.org 0
rjmp RESET ; Reset Handler
RETI; rjmp EXT_INT0 ; IRQ0 Handler
RETI; rjmp PCINT0 ; PCINT0 Handler
RETI; rjmp TIM1_COMPA ; Timer1 CompareA Handler
RETI; rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
RETI; rjmp EE_RDY ; EEPROM Ready Handler
RETI; rjmp ANA_COMP ; Analog Comparator Handler
RETI; rjmp ADC ; ADC Conversion Handler
RETI; rjmp TIM1_COMPB ; Timer1 CompareB Handler

Ich hab die Vektoren mal drin gelassen und mit ";" auskommentiert!

3. Der Stack muß am Anfang der Reset Hauptroutine initialisiert werden, da der 45er RAM hat:
LDI temp,low(ramend)
OUT SPL,temp
LDI temp,high(ramend)
OUT SPH,temp
SEI ; Globale Interrupts freigeben.

SEI hab ich mal eingefügt, oder darf der Controller keine Interrupts ausführen?

4. Den TIM0_OFV Handler würde ich nach dem Hauptprogramm ansiedeln, da der Platz wo sie jetzt ist eigentlich durch die Interrupt Vektoren belegt ist.

Dann müssen vermutlich noch ein Paar Register Namen geändert werden und dann sollte es funzen.

Du musst die neu generierte .hex und die .eep Datei in den Controller flashen, weil Du ja am Ende eine Tabelle mit EEPROM Werten generiert hast:
.eseg
.org 0
table:
.db $00,$04 ;KTV1, button 4 default settings

Den Fuses musst Du auch noch Aufmerksamkeit schenken, aber ohne Schaltplan kann ich Dir da keine Empfehlungen geben.

Dein angegebener Code ist mit Sicherheit nicht komplett.
Der Assembler mosert zurecht bei:
ldi temp,1 3/4 bit time
rjmp start3 ; Label nicht vorhanden!
out TCCR0,temp ; Timer counter 0 prescaler - gibts nicht beim 45er sonder TCCR0A und TCCR0B

Zudem springt dein Programm bei einem RET imme wieder zum Reset Vektor - Ist das so beabsichtigt?

Ich kann Dir nicht versprechen, ob das nun alles war, aber es ist schon mal ein Anfang.

Beitrag editiert von wkrug am 15-12-2011 15:56

Beitrag editiert von wkrug am 15-12-2011 15:59

wkrug

340 Beiträge

Erfahrener Benutzer
Erfahrener Benutzer

Read post 15-12-2011 16:38

Probier mal, ob's das Programm tut.
;**** 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 "tn45def.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 ; Reset Handler
RETI; rjmp EXT_INT0 ; IRQ0 Handler
RETI; rjmp PCINT0 ; PCINT0 Handler
RETI; rjmp TIM1_COMPA ; Timer1 CompareA Handler
RETI; rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
RETI; rjmp EE_RDY ; EEPROM Ready Handler
RETI; rjmp ANA_COMP ; Analog Comparator Handler
RETI; rjmp ADC ; ADC Conversion Handler
RETI; rjmp TIM1_COMPB ; Timer1 CompareB Handler 

;********************************************************************
;* "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
;********************************************************************
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,low(ramend) ;Init Stack Pointer
	OUT SPL,temp
	LDI temp,high(ramend)
	OUT SPH,temp
	ldi temp,1 		;Timer/Counter 0 clocked at CK
	out TCCR0B,temp		;  Timer counter 0 prescaler
	ldi temp,1  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






Die Fuses sind auf 1MHz interner oszillator gestellt, ich meine das ist die default Einstellung, aber guck mal in's Datenblatt.

Leider haut das Elektor Forum die Hälfte des Quellcodes raus, ich guck mal, ob ich's als PN zu Dir rüber krieg.
In der Editoransicht ist der komplette Quellcode vorhanden!!!

Beitrag editiert von wkrug am 15-12-2011 16:40

Beitrag editiert von wkrug am 15-12-2011 16:44

Beitrag editiert von wkrug am 15-12-2011 16:47

Beitrag editiert von wkrug am 15-12-2011 16:48

TarAx

16 Beiträge

Neuer Benutzer
Neuer Benutzer

Read post 16-12-2011 11:31

WOOOOW!!!

wkrug, du bist echt große Klasse!

Nach dem Arbeit probiere ich alles sofort!

Erstmal, RIESEN DANK für deine Zeit und deine Mühe.

Ich schulde dir was, auf jedem Fall!

(Ich berichte weiter.)

LG

Axel

Sie müssen eingeloggt sein, um zu antworten.

1   2   3     nächste

Feedback zu Elektor

Folgen Sie Elektor auf...