PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 Senden mit Attiny13



X1CR
11.12.2007, 08:01
Hallo Erstmal,

Bin gerade am Programmieren eines 1 Kanal RC5 Senders mit Attiny13.

Es sind meine ersten gehversuche mit der AVR programmierung.

Nun habe ich folgendes Problem, ich hab einfach ein RC5 Signal (wenn es eines ist) mit waitms 0,889 zwischen den halbbits gemacht.

Weiß weder ob es richtig ist oder ob es einfacher geht, will unbedingt den attiny13 wegen dem Platz verwenden.

Hab mit einem PC Oszilloskop die signale gemessen (Software über Line-In der Soundkarte) und ich bekomme eigentlich ganz gute Signale.

Nur leider macht der Empfänger (IgorplugXP - Seriell) was er will.

Nun meine Frage kann es daran liegen dass ein 38kHz Empfänger TSoP die 36kHz des Senders filtert oder hab ich einfach einen Blödsinn programmiert?

Bitte um Antwort, auch wenn mein Problem vielleicht nur Peanuts für euch sind!

Werde Heute mal eine Fernbedienung auseinandernehmen und die Signale mit meinem Sender vergleichen.


Mfg
Harry

radbruch
11.12.2007, 09:16
Hallo Harry

Ein nettes Projekt, dass spornt direkt zum Nachmachen an. Das igorplugxp-Teil sagt mir nicht viel. Soweit ich das durchschaue ist das ein kleiner IR-Empfänger am seriellen Port des PCs der die IR-Signale an die rs232-Pegel anpasst. Die gewandelten Signale werden dann mit einem Progrämmchen (z.B. grider) im PC als serieller Input interpretiert und ausgewertet? (http://www.cesko.host.sk/girderplugin.htm)

Die 38kHz des Empfängers sollten eigentlich kein Problem sein, du kannst doch den Sender entsprechend toggeln. Und da sind wir auch schon beim eigentlichen Problem: Wie sieht denn dein Code aus? Welchen Takt verwendet der tiny? Wie ist die Sendediode geschaltet? Auf welcher Wellenlänge sendet die IR-Diode? Funktioniert es mit einer normalen RC5-Fernbedienung? Reagieren andere RC5-Empfänger auf deine selbstgemachten Signale?

Gruß

mic

X1CR
11.12.2007, 13:09
Serwus,

richtig, funktioniert mit Girder einwandfrei mit "normaler" RC5 Fernbedienung, sprich Fernseher udgl.


Mein Programmcode ist sehr primitiv!

Schalte nur das Port ein und aus mit 1,778ms/Bit.

Auf welcher wellenlänge die IR-Diode sendet weiß ich nicht, is von einer alten Fernbedienung.

Der Takt ist auf $crystal 9600000

Genauen Programmcode Poste ich wenn ich zuhause bin.

Was meinst du mit togglen???

Mfg

Harry

radbruch
11.12.2007, 14:41
Hallo Harry

Primitiv ist nicht unbedingt schlecht, beim kleinen tiny13 sogar eher gut. Eine IR-LED aus einer alten Fernbedienung sollte eigentlich grundsätzlich mal funktionieren.

Mit toggeln meine ich das Ein- und Ausschalten der Trägerfrequenz die deine RC5-Signale transportiert. Wenn du einen 38kHz-TSoP verwendest, mußt du die eingeschaltete LED zusätzlich mit 38kHz takten. Der TSoP ignoriert alle anderen IR-Signale die nicht seiner Trägerfrequenz entsprechen. Das dient der Störsicherheit und ist wohl der Grund, warum deine Schaltung nicht funktioniert.

Das Aufmodulieren der Trägerfrequenz macht man am einfachsten indem man die LED mit ihrem Vorwiderstand zwischen zwei Ports des Mikrokontrollers anschließt. Beim Senden taktest du dann z.B. mit dem Timer im CTC-Mode den OC0x-Pin(Pin 5 oder 4 =Kathode der LED) mit den 38kHz (Achtung! Taktfrequenz für den Timer sind dann 76kHz!) und gleichzeitig schaltest du den anderen Pin (Anode) im Rythmus deiner Datenbits ein und aus. Die Bitzeiten erzeugst du mit dem zweiten Timer und einer ISR die die Bitfolge rausschiebt. Das scheint mir eine optimale Anwendung für den tiny13 zu sein: "Two Independent Output Compare Units" steht im Datenblatt (http://atmel.com/dyn/resources/prod_documents/doc2535.pdf).

Ob das so funktioniert habe ich auch noch nicht getestet, auch die Werte für OCRx kann ich dir nicht sagen. Ich bin noch Counter/Timer-Newbie. Beim 76kHz-Takt würde ich es mal so versuchen:

9600kHz/76kHz=126,31.. d.h. Prescaller=1 und OCRx=126 (das sind dann knapp 0,3% Fehler, das sollte der TSoP tolerieren)

Vielleicht könnte das noch ein Timerprofi bestätigen. Alles in Allem hört sich das sehr lecker an und scheint mir eine klasse Anwendung für meine eigenen tiny13 zu sein...

Gruß

mic

X1CR
11.12.2007, 16:01
Hi,

Okay, ein bisschen was hab ich verstanden, doch beim Timer hörts auf.... muß ich mich wohl noch schlauer lesen.... hab gedacht das geht ganz einfach.... wie folgt...

$regfile = "attiny13.dat"
$crystal = 9600000
Config Portb = Output

Do
Portb.4 = 1
Portb.3 = 1 'bit1'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit2'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit3'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit4'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 0
Portb.3 = 0 'bit5'
Waitms 0.889
Portb.4 = 1
Portb.3 = 1
Waitms 0.889

Portb.4 = 0
Portb.3 = 0 'Bit6'
Waitms 0.889
Portb.4 = 1
Portb.3 = 1
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'Bit7'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 0
Portb.3 = 0 'Bit8'
Waitms 0.889
Portb.4 = 1
Portb.3 = 1
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit9'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit10'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit11'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit12'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Portb.4 = 0
Portb.3 = 0 'bit13'
Waitms 0.889
Portb.4 = 1
Portb.3 = 1
Waitms 0.889

Portb.4 = 1
Portb.3 = 1 'bit14'
Waitms 0.889
Portb.4 = 0
Portb.3 = 0
Waitms 0.889

Loop


End


Wie gesagt, sehr primitiv...... is auch mein erstes programm.... Portb.4 ist nur eine LED zum kontrollieren, ob er sendet.


Wenn ich die IRled zwischen zwei ausgänge schalte schliesst die dann nicht kurz???


mfg Harry

BellaD
11.12.2007, 16:09
Hallo

das togglen des sogenannten togglebit's betrift bei mehrmaligem senden des gleichen kommandos das dritte bit der sequenz , da dieses dann jedesmal den zustand gewechselt haben sollte.Es ist erforderlich da es sonst passieren kann das das empfangsgerät das wiederholte senden nicht richtig interpretiert - Bsp. lautstaerke am Fernseher .

zum testen mal hier schauen -
http://www.bellibot.com/projects/avr/texte/RC5SIRC.ASM.txt
das demo sendet nur ein/aus an einen sony Fernseher wenn eine taste des AVR200 gedrückt wird (ja -bin stolzer besitzer eines solchen teiles ) 8-[
und das alles ohne timer und ohne interupt.
RC5 und Sony SIRCS ist eigentlich fast dasselbe nur muss bei sony alles 3mal hintereinander gesendet werden.
hf
Bella
;************************************************* *********************
; one bit rc5 code are 1778 ySec. long, from Low to High , 889ySec. each
; zero bit are 1778 ySec. long, from High to Low
; two Startbits , one toggle bit , 5 Bit System , 6 bit Command
; at one = 38khz burst
; zero = pause (nothing
; time over 14 bit = 24,889 msec.
; time over all 113,778 msec.
; after command send wait 113,778 - 24,889 msec.= 88,889 msec.
;************************************************* **********************

X1CR
11.12.2007, 16:14
Danke für deine Anteilnahme, aber weder Assembler noch AVR200 bringt mir etwas!

Komme gerade so mit Basic zurecht und bräuchte das ganze auf an attiny13. Also wird das ganze mit dem togglebit noch umständlicher.....


Und ich dachte das wäre nicht so schwer....

radbruch
11.12.2007, 16:41
Hallo

Ich glaube, wir "reden" aneinander vorbei:

Mit toggeln meine ich das Ein- und Ausschalten der Trägerfrequenz die deine RC5-Signale transportiert.
Toggeln meint hier nicht das togglebit2 im RC5-Code.

Toggeln bedeutet doch nur "Zustand wechseln", Zitat aus dem Datenblatt, CTC-Mode, Seite 64:

For generating a waveform output in CTC mode, the OC0A output can be set to toggle
its logical level on each Compare Match by setting the Compare Output mode bits to
toggle mode (COM0A1:0 = 1). The OC0A value will not be visible on the port pin unless
the data direction for the pin is set to output. The waveform generated will have a maximum
frequency of fOC0 = fclk_I/O/2 when OCR0A is set to zero (0x00). The waveform
frequency is defined by the following equation:
So kann die LED ausreichend schnell geschaltet werden, der Kontroller könnte es natürlich auch ohne Timer schaffen, aber dann kann er nicht mehr viel anderes erledigen. In deinem timerlosen Beispiel wird das über eine Schleife erledigt:


.equ b =15 ;38kHz @ togle = 26,3ySec / 2 @ 4 MHz crystal

; BitTime = 35 ; 889 YSec

One_send:
ldi BitTime,36 ; half Bit one
One_1: ldi temp,b ; 38 KHz Burst
sbi PORTD,TxD
One_2: dec temp
brne One_2

ldi temp,b
cbi PORTD,TxD
One_3: dec temp
brne One_3
dec BitTime
brne One_1

ret

Viele Wege führen zum Ziel. Allerdings führt dein Code (@Harry) leider nicht dahin, weil du eben nur die Bits ausgibst, aber keine Trägerfrequenz. Hier werden die 38kHz mit einem NE555 erzeugt und die Trägerfrequenz erklärt:
http://www.the-starbearer.de/Roboter/Baugruppen/IRBake/IRBake.htm


Wenn ich die IRled zwischen zwei ausgänge schalte schliesst die dann nicht kurz?
Die LED doch hat einen Widerstand in Reihe und schliest deshalb keine Ports kurz. Die Pins können 50mA ("Pin Driver Strength",Datenblatt s. 134)


$crystal = 9600000
Hast du die Fusebits auch auf 9,6MHz gesetzt? Sonst ist der tiny vermutlich zu lahm.

Gruß

mic

Sauerbruch
11.12.2007, 16:57
Ab einer gewissen "Ausstattung" können die AVR-Chips einen Bascom-Befehl namens "RC5SEND" ausführen. Dieser Befehl ist sehr komfortabel, da er nicht nur die Address- und Kommandobits überträgt, sondern die 38 kHz Trägerfrequenz automatisch miterzeugt. Ich hab´s gerade mal für den Tiny13 und Tiny45 probiert - da klappt´s aber leider aufgrund fehlender Ressourcen nicht.
Ab dem Tiny2313 funktioniert der Befehl - vielleicht macht Dich die Bascom-Hilfe zu RC5SEND ja neugierig?

Gutes Gelingen!

X1CR
11.12.2007, 16:59
Hi, Mic

Also der link hat mich jetzt viel schlauer gemacht! Nun versteh ich auch die trägerfrequenz!

das heißt mit meiner schleife kann ich nichts anfangen, denn ich kann die trägerfrequenz nicht einschleifen da ich das über timer machen muss.

555 will ich mir ersparen soll ja möglichst klein sein.

mit wieviel mA kann man den eigentlich so einen Ausgang des Tinys belasten? sind 40mA zuviel?

Zum programm, wenn ich mit einem timer die 38kHz Trägerfrequenz mache kann ich dann nicht die bits ausgeben wie sie in meiner schleife sind oder?

Ach, das programmieren ist so lange her..... hab das letzte mal in der schule vor rund zehn jahren programmiert und da auch nur das was der lehrer sagte, hab zwar die fachschule Elektrotechnik gemacht, aber mehr als ein Parallelport Interface und Pascal Programmierung auch nicht. Damals hab ich auch nur schleifen programmiert....

Schleifen sind hald sooo hübsch..... vor allem Endlos.... ;-)

Die Hilfe von Bascom AVR ist ja auch nicht das gelbe vom Ei!

Mfg

Harry

X1CR
11.12.2007, 17:15
Dass es mit dem Tiny2313 funktioniert bzw. dass ich es programmieren könnte sage ich mal vorsichtig ja.

RC5Send braucht den timer1 sprich 16 bit timer das es funktioniert, den hat der attiny13 leider nicht.

2313 ist zu groß, das ganze sollte möglichst klein sein, da es zur indentifizierung von mini z fahrzeugen eingesetzt werden soll.

Hab am Dachboden eine kleine Mini Z Bahn und die soll mit einer zeitnehmung ausgestattet werden. muß nicht irrsinnig genau sein, ist einfach nur aus spaß an der freude.

Mfg
Harry

radbruch
11.12.2007, 17:19
Nochmal hallo


Zum programm, wenn ich mit einem timer die 38kHz Trägerfrequenz mache kann ich dann nicht die bits ausgeben wie sie in meiner schleife sind oder?
Es wird dann immer noch nicht klappen, denn die Bits sind nicht einfach high oder low, vielmehr muss ein Wechsel von low nach high für Bit gesetzt und von high nach low für nicht gesetzt gesendet werden:
http://www.sbprojects.com/knowledge/ir/rc5.htm

Oh, das hast du ja drin

Am Besten noch etwas googeln... (oder abwarten bis ich es gelöst habe, aber mein Projektrückstau ist schon jetzt enorm)

Gruß

mic

X1CR
11.12.2007, 17:42
den wechsel zw. hi und lo hab ich schon... heißt angeblich manchester codierung.....

Google.... naja, hab das alles schon für pic gefunden, nur fang ich beim atmel ja nix an zumindest kann ich assembler nicht in basic umsetzen...

guckst du...


http://sprut.de/electronic/pic/programm/irrc/irrc.html


mfg harry

X1CR
11.12.2007, 17:56
oder hier

http://www.holger-klabunde.de/rc5send.htm#OneChannel]

radbruch
11.12.2007, 18:18
http://www.mikrocontroller.net/topic/63154

Blöderweise kenne ich bascom überhaupt nicht. Interessant finde ich diesen Abschnitt:


Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 256 - 33

Enable Timer0
Enable Interrupts



Wenn man hier nun meine vermuteten Daten einsetzen würde:

Prescale=1
Const Timervorgabe = 126

Und als Interruptroutine vielleicht so:

Timer_irq:

'exclusive oder bzw negieren, ich weiß nicht wie das in bascom formuliert wird, in c würde man Portb.4 ^=Portb.4 schreiben'
Portb.4 = not Portb.4
return

Und dann deinen Code für das Senden der Bits dazu an Portb.3 (und den Portb.4-Zugriff entfernen!), zwischen den Ports die LED (mit Widerstand!) mit Anode an Portb.3, Kathode an Portb.4...

Nach dem Senden mit Portb.3=0 und Disable(?) Timer0 die LED wieder ausschalten. Fraglich ist, ob "Waitms 0.889" genau genug ist. Und noch nicht beantwortet ist der /8-Teiler in den Fuses fürdie 9,6Mhz.

Zitat aus den Thread:

aber die IR Diode leuchtet in einen so
niedrigen Intervall das man es noch über ein Multimeter sehen kann,
mit dem Multimeter sieht er nur die Bits, aber nicht die Trägerfrequenz, die er ja auch gar nicht hat.

mic

[Edit]

Mist, der bascom-Timer zählt aufwärts, deshalb:

Const Timervorgabe = 256-126

Ich befürchte, der Interrupt-Overhead beim Sichern der Register bei bascom wird zu groß sein (hab ich irgendwo mal aufgeschnappt) und deshalb wird sich der tiny wohl aufhängen.

X1CR
11.12.2007, 19:39
Zurzeit sieht mein Quellcode so aus...

geht das man die interrupt routine so rein setzt?


$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Config Portb.4 = Output

Config Timer0 = Timer , Prescale = 8
On Timer0 Timer_irq
Const Timervorgabe = 256 - 126

Enable Timer0
Enable Interrupts
Dim A As Integer
Do



Timer_irq:
A = 0.889
Portb.4 = 0
Portb.3 = 0 'bit1'
Waitms A
Portb.4 = 1
Portb.3 = 1
Waitms A

Portb.4 = 0
Portb.3 = 0 'bit2'
Waitms A
Portb.4 = 1
Portb.3 = 1
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit3'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit4'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit5'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit6'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit7'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit8'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit9'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit10'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit11'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit12'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 1
Portb.3 = 1 'bit13'
Waitms A
Portb.4 = 0
Portb.3 = 0
Waitms A

Portb.4 = 0
Portb.3 = 0 'bit14'
Waitms A
Portb.4 = 1
Portb.3 = 1
Waitms A

Loop

Return


Is noch imma mit testled, da auf testplatine fest verlötet...

Mfg Harry

radbruch
11.12.2007, 20:50
Hallo

Ich dachte immer, basic würde ich nie mehr verwenden.*grins* Aber es kommt eben immer anders als man denkt.

Ich hab' mich nun auf die Schnelle im RN-Wissen (https://www.roboternetz.de/wissen/index.php/Kategorie:Quellcode_Bascom) zum Thema bascom etwas eingelesen, aber bitte keine Wunder erwarten:


'RC5-Code senden mit ATtiny13 11.12.2007'

$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16

Dim A As Integer

Config Portb.3 = Output 'beide Pins als Ausgang'
Config Portb.4 = Output 'nur wenn Portb.3=1 und Portb.4=0 leuchtet LED'

Config Timer0 = Timer , Prescale = 1 '9600kHz/76kHz gibt 126,31'
On Timer0 Timer_ISR
Timer0 = 256 - 126 'Timer mit Startwert für 76kHz laden'

Enable Timer0
Enable Interrupts

Timer_ISR: 'Interruptroutine'
Toggle Portb.4 'Pin umschalten'
Return

A = 0.889 'halbe Bitlänge RC5'

Do

Portb.3 = 0 'bit1'
Waitms A
Portb.3 = 1
Waitms A

Portb.3 = 0 'bit2'
Waitms A
Portb.3 = 1
Waitms A

Portb.3 = 1 'bit3'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit4'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit5'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit6'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit7'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit8'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit9'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit10'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit11'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit12'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 1 'bit13'
Waitms A
Portb.3 = 0
Waitms A

Portb.3 = 0 'bit14'
Waitms A
Portb.3 = 1
Waitms A

Loop


Quellcode sollte man immer in code-Tags posten.

Wichtigste Änderung ist, dass die ISR (Interruptserviceroutine) nun nicht mehr das gesamte Programm beinhaltet.

Zum Timer:
Der Timer zählt vom Startwert bis zum Überlauf (8Bit=255 beim tiny13), erzeugt dann einen Interrupt und wird wieder mit dem Startwert geladen. In der ISR wird der Portb.4 mit dem Toggle (ist scheinbar ein bascom-Befehl) umgeschaltet. Es gibt aber scheinbar auch die PWM-Anwendung mit "Config Timer0 = Pwm...". Deshalb vermute ich, dass es auch eine CTC-Variante dazu gibt. Die wäre für unsere Anwendung optimal geeignet.

Hauptprogramm:
Hier werden dann die RC5-Bits an Portb.3 ausgegeben. Damit das funktioniert muss die LED (Widerstand nicht vergessen!) zwischen Portb.3 und Portb.4 angeschlossen sein. Wenn Portb.3=0(0V) ist, spielt der Pegel an Portb.4 keine Rolle. Wenn Portb.3=1(5V) ist, leuchtet die LED wenn Portb.4=0 ist, bei Portb.4=1(5V) ist sie dann aus. Ob die Bitfolge passt, habe ich noch nicht überprüft. Am Ende der Hauptschleife sollte man vielleicht vor der Wiederholung noch ein längeres Wait einfügen.

Ich habe keine Ahnung, ob das Programm so übersetzbar ist, ob es funktioniert weiß ich natürlich auch nicht.

Sehr wichtig ist (ich muss es einfach nochmal ansprechen, weil ich immer noch keine Aussage dazu habe), dass der interne Taktteiler in den Fuses ausgeschaltet ist und der tiny13 wirklich mit 9,6MHz läuft. Möglicherweise muss man noch den Timerstartwert anpassen um die Ungenauigkeiten des internen Taktgebers auszugleichen. Ob die Wait-Funktion von bascom überhaupt so verwendet werden kann, kann ich auch nicht sagen. So wie im Moment wird es auf jeden Fall nicht funktionieren, denn A ist als Integer festgelegt...

Gruß

mic

X1CR
12.12.2007, 06:23
Serwus,

Okay, da habe ich was vergessen, A als integer ist ja eine ganze Zahl, d.h.: 0,889 wird 1 wenn ich mich nicht irre.

Werd dann einfach wieder 0,889 überall einsetzen.

Die Tinytestplatine etwas modifizieren.

Programm brennen.

Und mal schaun was das Oszi so von sich gibt!

Hab mir Gestern schon gedacht dass das Signal etwas lang ist 0,889 = 1
dann habe ich 0.4445 eingesetzt und dann war nur mehr rauschen am Monitor!

Wobei ich aber auch nicht weiß ob eine Frequenz von 38kHz auf einem "SoftwareOszi über Soundkarte" überhaupt darstellbar ist.

Theoretisch ja, denn 44,1kHz wären möglich, aber jede Soundkarte hat ja eine Wechselspannungsunterdrückung mit einem Kondensator am Eingang dass das Signal sehr verzerrt wird....

Aber ich lass mich überraschen, nach dem umbau!

Werd das ganze einfach auf einer Klemmplatine aufbauen um diverse Veränderungen des Schaltplans schnell durchführen zu können.

Mfg
Harry

radbruch
12.12.2007, 06:56
Guten Morgen Harry

Ich habe mir gerade die B ascom-Doku (http://www.mcselec.com/index.php?option=com_docman&task=cat_view&gid=99&Itemid=54) runtergeladen. Ich muss sagen, sehr aufschlussreich. Ich hätte nicht gedacht, dass bascom so mächtig ist. Was ich noch nicht weiß: Ist der erzeugte Code auch so mächtig.

In der Beschreibung der Timer unter "Timer1" wird die Anwendung der Match-Compare-Modi beschrieben. Das ist genau die Funktion, die wir benötigen (beim tiny13 ist es der Timer0). Je ein Compare-Register für die Trägerfrequenz und das Bittiming. Damit kannst du unseren bisherigen Code auf den Müll kicken.

Vermutlich must du aber das Layout deiner Schaltung ändern. Um die Timerfunktion nutzen zu können, muss die LED zwingend zwischen den Pins OC0A(PB0, Pin5) und OC0B(PB1, Pin6) angeschlossen sein. Es ist völlig egal, wie rum die LED angeschlossen wird, du hast da also völlige Freiheit. Aber wir müssen es festlegen, bevor wir es programmieren. Ob wir später die Bits wirklich per CTC versenden ist noch nicht sicher, aber so haben wir immer die Option offen, es zu tun. waitms werden wir dann nicht verwenden. Die Trägerfrequenz werden wir aber sicher so erzeugen.

Da ich heute beruflich unterwegs sein werde, wird es frühestens heute Abend ein Update des Codes geben. In der Zwischenzeit kannst du dir schon mal überlegen, welche Daten du überhaupt versenden willst, also welche Bitmuster es sein werden. Da wir bisher nur zwei der Pins belegen, können wir vielleicht die restlichen Pins für einen Tasteneingang (mit dem ADC auch mehrere Tasten) oder eine Codierung verwenden. Mit einer Codierung mit drei Bits hätten wir die Möglichkeit, mit dem selben Programm bis zu sieben verschiedene Funktionen wie z.B. IDs zu erzeugen, mit zwei Codierbits und einem Taster wäre es noch vier IDs.

Gruß

mic

X1CR
12.12.2007, 07:23
Guten Morgen, Mic!

Werde das layout ändern, sprich die schaltung auf der laborsteckkarte aufbauen.

Und mal die Doku genauer lesen!

Wie siehts den mit dem maximal Strom an den Ausgängen aus?

Finde einfach nichts aussagekräftiges im Netz!

Sind bis zu 50mA realistisch?

Mfg Harry

gummi_ente
12.12.2007, 07:48
Hallo zusammen,

also der Tiny2313 schafft das locker. Habe für Sohnemann eine Fernsteuerung für seine Fahrzeuge damit gemacht. ATTiny mit internem 4MHz Oszillator.

Es werden 8 Schalter eingelesen und mittels RC5 übertragen. Trägerfreq. wird von Timer1 erzeugt, Timer0 schiebt dann die Bits raus.

Die IR-Diode hängt dabei zwischen zwei Port-Pins.

Das ganze wird bei nicht gebrauch in den Power-Down-Mode versetzt und bei betätigen der Taste an INT0 wieder gestartet.

Über den Timer0 wird auch die Wartezeit von 155ms für das Senden der RC5-Telegramme gemacht.

Habe dummerweise keinen Zugriff auf meinen Server :cry:, sonst könnte ich den Code einmal posten.

Wenn nichts weiteres dazwischen kommt, bin ich heute Abend wieder daheim und kann den Code einmal einstellen.

Grüße

X1CR
12.12.2007, 08:27
Serwus gummirte ente

Das es ein 2313 schafft is mir schon klar, der quellcode von dir wäre trotzdem interessant.


Wir möchten das ganze auf einen Attiny13 machen um Platz zu sparen!

Mfg Harry

X1CR
12.12.2007, 08:29
Zu Mic,

Deine Bemühungen zu Timer1 finde ich interessant, aber der Tiny13 hat leider keinen Timer1. (Timer1 16Bit, Timer0 8Bit) ---> sofern ich das richtig verstanden habe!

X1CR
12.12.2007, 08:32
Zu Gummiental,

Powerdown benötige ich nicht, der sender soll pausenlos senden, Spannungsversorgung wird ein EmpfängerAkku mit min. 1500mAh, das sollte schon eine Zeit reichen..... ;-)

Mfg
Harry

X1CR
12.12.2007, 08:40
Zu Mic,

Zur Codierung, bzw. Welches bitmuster ich ausgeben möchte, mir würde ein bitmuster für den tiny reichen, da es 10 verschiedene Sender werden und jeder sollte ein anderes Muster verschicken....

Wenn ich das richtig verstanden habe kann man ja bis zu 64 verschiedene Befehle mit "normalen" rc5 bitmuster erzeugen.

Mfg
Harry

gummi_ente
12.12.2007, 09:55
Hallo X1CR,

sollte auch mit dem Tiny13 gehen, dann halt den Timer auf 72kHz laufen lassen und im Timer-IRQ, Ausgang toggeln,

wenn was gesendet werden muß. Der Tiny 13 hat ja auch 1kB, sollte dicke reichen.

Grüße

X1CR
12.12.2007, 12:41
Serwus Gummi Ente kannst ruhig Harry schreiben...... ;-)

Mit dem Programmieren hab ich es noch nicht so,toggeln usw.... muß mich noch einlesen, ist mein erstes Projekt!

Mfg

Harry

radbruch
12.12.2007, 18:04
Hallo

Ihr müßt schon lesen, was geschrieben wurde, auch wenn es recht viel Text ist. Hier mal eine Zusammenfassung der offenen Punkte:

- Warum ein tiny13? Weil er sehr klein ist und uns der Ehrgeiz gepackt hat.

- Wieviel können die Ports treiben? Laut Datenblatt 50mA.

- Der Tiny13 hat doch nur einen Timer0? Genau, aber der kennt den CTC-Mode mit zwei Kanälen. Kanal A: Trägerfrequenz per OC0A(Pin5), Kanal B: Bits senden per ISR.

- Trägerfrequenz sollte laut dem Startposting 38kHz sein, also müssen wir mit 76kHz toggeln. (Kann man aber später auch locker auf 36kHz anpassen)

- Mit Codierung meinte ich, alle tinys bekommen das selbe Programm und erkennen über Brücken/Jumper an den freien Pins ihre eigene ID und senden dann einen ihnen zugeordneten RC5-Code. Wenn wir den Reset-Pin auch verwenden, wären vier Pins zur Codierung=16 verschiedene IDs möglich.

- Warum bascom? Weil das die Vorgabe von X1CR/Harry ist und ich das mal versuchen wollte. (Mit C wäre es für mich bei meinem jetzigen Kentnissstand wohl kein Problem obwohl ich auch noch newbie bin)

Ich hoffe, hiermit die wesentlichsten Unklarheiten geklärt zu haben. Zurück zum Projekt (das wohl übers Ziel hinausschiest, den eine "Zeitnehmung für eine Mini-Z-Bahn" könnte man wohl auch einfacher realisieren). Ich möchte euch mal ein paar Gedanken dazu zur Diskussion anbieten:

Als Versorgungsspannung hatte ich eine 4*1,2V-NI-MH-Akkuspannung erwartet. Das sind bei vollen Akkus nahezu 5,5V, sehr kritisch für den tiny13, der nur bis 5,5V abkann. Sicherheithalber sollten wir eine Diode vorschalten und deren 0,7V Spannungsabfall nutzen.

Der Vorwiderstand für die IR-LED sollte halbweg genau passen. Da wir den genauen Typ der Diode nicht kennen, würde ich vorerst einen Strom von ca. 30 mA vorschlagen. Um den Spannungsabfall (ich tippe mal auf ca. 1,5-2V) an der Diode zu messen, müssen wir sie mit einem Testwiderstand (150-200Ohm?) an ein Akkupack hängen und die Spannung an der LED messen. Der endgültige Widerstand würde sich dann so berechnen lassen: (U_akkupack - U_led) / 30mA

Bei (gepulsten!) 30mA wäre noch etwas Power für eine kleine 3mm-LED übrig die wir über einen eigenen Widerstand mit ca. 10-15mA zusätzlich zwischen Datensendepin und GND zur Sendekontrolle anschliesen könnten. Alternativ wäre auch ein eigener Pin möglich, aber dann würden wir einen Codierpin verschenken.

Man könnte auch mehrere Jumper über eine Widerstandsmatrix mit dem ADC auswerten oder auf die Codierung komplett verzichten. Dann müste man aber jeden tiny inividuell programieren oder eine Kennung ins EE-Prom schreiben. Jumpern ist bequemer und fexibler)

Als Grundlage für die folgenden Programmvorschläge dient die bascom-Doku. Dort steht u.A.:


Notice that the Help was written with the AT90S2313 and AT90S8515 timers in
mind.
(Das bedeutet grob übersetzt: Als Grundlage für die Beschreibung der Timer dienten die AVRs AT90S2313 und AT90S8515)

Deshalb stimmen die Zuordnungen der Timer nur bedingt, weil der tiny13 nur einen 8Bit Timer besitzt. Dieser hat aber einige Funktionen die bei den größernen AVRs für die 8-Bit-Timer nicht verfügbar sind. Unter anderem eben die 2-kanalige CTC-Funktion mit Interrupt und direkter Pinsteuerung. Das macht der Timer teilweise selbstständig und ist für unsere Anwendung optimal. Das kann man alles dem Datenblatt entnehmen, den Link habe weiter oben schon gepostet.

Kurze Einführung in den CTC-Mode (wie ich es als Timer-Laie verstanden habe, der Absatz kann von "Profis" übersprungen werden):

Der Timer0 verfügt über zwei Zählregister OCRA und OCRB die mit dem per Prescaler eingestellten Takt heruntergezählt werden. Für beide Register gilt folgende Funktion:

- das Register kann mit einem beliebigen 8-Bit-Startwert geladen werden
- Wenn das Register den Wert null erreicht wird das Register wieder mit dem Startwert geladen.
- Gleichzeitig kann ein Interrupt ausgelöst werden.
- Gleichzeitig kann ein zugordnerter Ausgang umgeschaltet werden(1 wird zu 0 oder 0 wird zu 1. Das nennt man eben toggeln)

Die Anwendung des Timers auf unsere Aufgabenstellung plane ich nun so:

Ein Zählregister erzeugt (vorerst kontinuierlich) die 38kHz-Trägerfrequenz. Dazu wird der Timer0 im CTC-Mode gestartet und schaltet direkt den OC0x-Pin (x steht für A oder B) an dem die Kathode der LED angeschlossen ist. Der Wert für das entsprechende OCRx-Register ergibt sich aus der Taktfrequenz des Kontrollers, aus dem Prescaler und der geforderten Umschalt-Frequenz (zweimal umschalten ergibt eine Periode, deshalb:) 76kHz. Weiter oben habe ich diesen Wert schon mit ca. 126 bestimmt. Wenn das alles funktioniert, sollte man am entsprechenden Pin die 38kHz messen können.

Das andere Zählregister soll die Zeitbasis für die RC5-Bits erzeugen, das sind dann die 0,889ms die ein halbes RC5-Bit dauert. Das Problem dabei ist, dass dieses Register mit dem selben Takt heruntergezählt wird wie das andere Register, also viel zu schnell. Die Lösung ist eine ISR und eine (bzw. 2) 16-Bit Zählvariable die den Aufruf der ISR mitzählt. Um möglichst wenige Interrupts auszulösen sollte der Wert für das OCRx möglichst groß, gleichzeitig aber auch angenehm zum Rechnen sein. Bei 192 hätten wir bei 9,6MHz genau 50000 Aufrufe pro Sekunde (und maximal 192 Takte für die ISR!), das sind dann 1/50000 oder 0,02ms. Soweit, sogut. aber wo sind nun die 0,889ms? Die müssen wir mit einer zweiten 8-bit-Variablen erzeugen: 0,899ms/0,02ms=44,5 also 44 für das zweite OCRx.

Wenn wir nun unsere Daten senden wollen sieht das etwas so aus:

- Ports auf Ausgang schalten
- Timer starten, OCRx mit 126 laden -> Trägerfrequenz wird am 38kHz-Pin ausgegeben.
- Bitnummer auf 1 setzen.
- 16-Bit Zählvariable mit 49999 laden.
- 8-Bit Zählvariable mit 44 laden.
- Interrupts erlauben und zweites OCRx mit 192 laden -> ISR wird alle 1/50000 aufgerufen.

Schleife:
- Nach Manchestercodierung für Datenbit[Bitnummer] den Datenpin für erstes Halbbit setzen.

- Ab jetzt übernimmt die ISR die Kontrolle während wir im Hauptprogramm warten bis das erste Halb-Bit gesendet wurde:

- 16-Bit Zählvariable decrementieren bis 0, dann 8-Bit Zählvariable decrementieren und 16-Bit Zählvariable wieder mit 49999 laden. Das Ganze solange wiederholen bis 8-Bit Zählvariable auch 0 ist.

- Das in einer Schleife wartende Hauptprogramm erkennt nun , das die 8-Bit Zählvariable null ist. Zuerst werden nun wieder die 16-Bit Zählvariable mit 49999 und die 8-Bit Zählvariable mit 44 geladen (der Timer läuft ja im Hintergrund weiter), dann der Datenpin umgeschaltet.

- Anschließend wird wieder gewartet, bis das zweite Halbbit gesendet ist. Gleicher Ablauf in der ISR bis das Hauptprogramm erkennt, das die 8-Bit Zählvariable wieder 0 ist. Dann wird die Bitnummer inkrementiert und das Spielchen ab Schleife: wiederholt bis alle Bits gesendet wurden. Ächz, jetzt noch die beiden OCRs auf 0 setzen, Timer stoppen und Pins auf Eingang (quickunddurty). Fertig.

(Eigentlich sollte das viel einfacher funktionieren, denn die Bitlänge des RC5-Codes entspricht bei 36kHz genau 1/64 der Trägerfrequenz. Bin ich auf dem falschen Weg?*kopfkratz*)

So, das ist es, was man programmieren sollte. Ob die OCRx-Werte so stimmen kann ich noch nicht sagen. Ob die ISR kurz genug wird oder ob sich der tiny13 dabei ins Nirwana verabschiedet weiß ich auch noch nicht. In C könnte ich das jetzt direkt umsetzen, in bascom wirds noch etwas dauern. Viel Spaß bei verdauen.*grins*

Gruß

mic

X1CR
12.12.2007, 18:41
Serwus Mic

Da hab ich als Newbie einiges zu verdauen!

Werd mal gucken ob ich die 38kHz hinbekomme....

Wie ist das mit dem dritten Bit, sollte der nicht immer wechseln?




Mfg Harry

X1CR
12.12.2007, 18:57
Zu, Mic....

Kann leider nicht überprüfen ob ich 38kHz habe.... SoftwareOszi kann nicht einmal 19kHz fehlerfrei darstellen..... :-(

Bis bald,

Mfg Harry

radbruch
12.12.2007, 19:42
Wie ist das mit dem dritten Bit, sollte der nicht immer wechseln?
Keine Ahnung, aber soweit sind wir ja noch lange nicht. Ich vermute, da kommt es im Wesentlichen auf die Software des Empfängers an und wie die den gesendeten Code interpretiert. Man kann z.B. nur die Datenbits auswerten und Adresse oder Kommando ingorieren. Es gibt scheinbar auch noch einen extended RC5-Code mit nur einem Startbit...

Wenn wir uns im ersten Schritt nur aufs Erzeugen der Trägerfrequenz beschränken und einen fertigen Code (mit hex-File) anbieten können, wird sich sicher jemand finden, der einen tiny13 damit flasht und mit seinem Oszi die Frequenz nachmißt. Ich hab zwar selbst ein altes Oszi rumstehen, aber ich weis nicht, ob das noch funzt.

Übrigends kannst du deine eigenen Beiträge editieren wenn dir nach dem Absenden noch was einfällt. Wenn es das letzte Posting im Thread ist könntest du es sogar noch löschen und komplett neu schreiben. Wenn schon ein weiterer Beitrag dahinter steht, wird allerdings angezeigt, dass der Beitrag geändert wurde. Zu viele Edits bedeuten dann, dass man sich nichts überlegt beim Schreiben.

Einen Beitrag aufgrund nachfolgender Beiträge inhaltlich umzuschmeisen oder gar unkenntlich zu machen (löschen geht ja dann nicht mehr) ist ein ganz mieser Stil und wird hier im RN-Forum nicht gerne gesehen.

mic

radbruch
13.12.2007, 00:11
Hallo

Noch ein kleines Update gefällig? Ich habe mir nun die Demoversion von Bascom installiert (mit 4kb-Begrenzung reicht das für den tiny13 allemal). Und hier die Früchte der "Nachtschicht", für alte Bascom-Hasen sicher lächerlich, aber für mich als Neueinsteiger ein unerwartet schnelles Erfolgserlebniss. (Ich werde aber wohl trotzdem bei C bleiben):

'RC5-Code senden mit ATtiny13 12.12.2007'

$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16


Config Portb.0 = Output
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1024

Ocr0a = 255


Do
Waitms 1000
Loop

(Die Complilerdirektiven habe ich ungeprüft aus einem anderen Code übernommen)

Das Ergebniss mit meiner Testplatine und einer LED zwischen PB0 (OC0A, Pin5) und GND:

http://img.youtube.com/vi/HIQXcPcQB1M/1.jpg (http://www.youtube.com/watch?v=HIQXcPcQB1M)

Die LED blickt natürlich rythmisch, das Zucken kommt von der Kamera. Den Takt könnt ihr ja zur Übung mal selbst ausrechnen.

Gruß

mic

X1CR
13.12.2007, 06:31
Morgääähn Mic,

Nachtschicht.....

Was macht denn nun dieses Progrämmchen?
Blinke, Blinke..... welcher Takt ist das denn?

Mfg
Harry

X1CR
13.12.2007, 06:34
Aso, ausrechnen..... is 1 Hz oder?

Mfg
Harry

X1CR
13.12.2007, 06:43
Hilft dir das ein wenig weiter?

Is in C....

http://www.a-netz.de/remote-control.de.php

Mfg
Harry

radbruch
13.12.2007, 07:16
Guten Morgen

Den Code aus dem Link muß ich erst noch untersuchen, dass wird noch etwas dauern.


Aso, ausrechnen..... is 1 Hz oder?
Nicht raten, rechnen: 9600000/1024/255

Die Warteschleife mit dem Waitms macht nichts außer eben warten.

Gruß

mic

X1CR
13.12.2007, 07:27
Aso, und in die warteschleife sollte dann die do loop schleife sein mit dem bitmuster..... sehe ich das so richtig?

36,764705882352941176470588235294 kHz...

Richtig????

Die 1000ms waren bei einem beispiel 1Hz.... aber das hing wohl mit dem timer zusammen wie ich gerade sehe!



Mfg
Harry

X1CR
13.12.2007, 07:28
Die letzte Kommastelle is die wichtigste..... ;-)

gummi_ente
13.12.2007, 11:00
@Harry (X1CR),

hier der Code, war aber für nen' Tiny26 statt dem angegebenen Tiny2313

Ist eine kleine Tastatur von Pollin dran, und läuft mit internem Oszi 4Mhz.
Zwischen PB3 und PB1 hängen 2 IR-Dioden in Reihe (mehr Licht) mit einem Widerstand, das ist alles.

Mit einer Taste kann das Ding abgeschaltet werden, eine andere Taste macht nen Reset und startet die Fernsteuerung wieder. So läufts auch mit 4 Batterien recht lang.

Prg. ist nicht elegant, aber mußte auch auf die schnelle gemacht werden,
da die alte Steuerung kaputt war und Sohnemann nicht mit Geduld gesegnet ist.

Könnte man natürlich eleganter und effizienter machen, aber..[-(



/* Title: RC5-Sender

Hardware: ATtiny26
************************************************** ************************************************** ***

* Ein- Ausgänge
* PA0 (20) - ADC0 Fahrlicht S1 PB0 ( 1) - MOSI/OC1A (6,16) - GND
* PA1 (19) - ADC1 Blinker li S2 PB1 ( 2) - MISO LED (5,15) - VCC,AVCC
* PA2 (18) - ADC2 Blinker re S3 PB2 ( 3) - SCK
* PA3 (17) - AREF Arbeitslicht1 S4 PB3 ( 4) - OCB1
* PA4 (14) - ADC3 Blitzlicht PB4 ( 7) - XTAL1 Oszi
* PA5 (13) - ADC4 Rundum PB5 ( 8) - XTAL2 LED
* PA6 (12) - AIN0 Sel_1 PB6 ( 9) - INT0 Einschalter
* PA7 (11) - AIN1 Sel_2 PB7 (10) - RESET
*
************************************************** ************************************************** ***
* RC5-Code
* 1 Takt ca. 889µs, "1" -> Low/High, "0" -> High/Low -> 1 Bit = 2x889µs = 1,778ms
* Zustand "1" "0"
* __ __
* __| | | |__
* Takt: 0 1 0 1
*
* Kompletes Telegramm beinhaltet 14 Bit = 24,889ms
* 1.Startbit immer "1"
* 2.Startbit immer "1", bei extd. kann dies "0" sein
* Toggel normal "0", bei Tastenrepeat "1"
* 5 Bit Adresse
* 6 Bit Kommando
* Bei Tastenwiederholung wird neues Telegramm nach 113,78ms (64Bitzeiten) gesendet.
************************************************** ************************************************** ***
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>


volatile unsigned char ms, buf_ptr, ms1; // ms Zeitgeber volatile damit auch in IRQ bearbeitet wird.
unsigned char txbuffer[28]; // Sendbuffer halbnibbles
#define tcnt_val 200 // 889µs @ Teiler 64 @ 4MHz


//#define INTERNAL_TESTS 1

#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
#define TOGGLE_BIT(PORT, BITNUM) ((PORT) ^= (1<<(BITNUM)))

/************************************************** ************
Init

Description: Initalisieren des µC
In :
Out: ms
************************************************** **********/
void init()
{
cli(); // Disable IRQ's

// Port konfigurieren
PORTA = 0x0F; // Pullup aktiv
PORTB = 0x0;

// PORTx Outputs
DDRA = 0b11000000; // PA6+7 Output
DDRB = 0b00001010; // PB1+3 Output, PB3 Led ON/OFF RC5; PB1 LED ON/OFF Trägerfreq.

TCNT0 = 0; // reset TCNT0
TCCR0 = 3; // count with cpu clock/8
TIMSK = 1<<TOIE0; // enable TCNT0 overflow AND Timer1 CompA match


TCCR1A = 1<<COM1A0; // Toggel at match
TCCR1B = 1<<CS10 | 1<<CTC1; // Timer1 count with cpu clock
OCR1C = 55; // Reloadwert = 72kHz

GIMSK = 0; // INT0 IRQ sperren
}

/************************************************** ************
ISR (TIMER0_OVF_vect)

Description: Timer 0 Overflow IRQ
In :
Out: alle ,5 ms
************************************************** **********/
ISR (TIMER0_OVF0_vect)
{
unsigned char sreg;

sreg = SREG;
TCNT0 = TCNT0 + tcnt_val; // Zähler neusetzen

if ( ms==200 ){ // Startkennung ?
if (txbuffer[buf_ptr]) SET_BIT(PORTB,3);
else CLEAR_BIT(PORTB,3);
buf_ptr++;
if (buf_ptr == 28) // Ende erreicht
ms = 168; // Wartezeit starten ca. 155ms
}
else if (ms > 0){
ms--;} // counter --

if (ms1 > 0) ms1--; // counter --

SREG=sreg;
}

/************************************************** ************
************************************************** **********/
int main( void )
{
unsigned char i, j, newstatus, oldstatus, command;

init(); // Initialisierung
sei(); // IRQ freigeben

oldstatus = 0;
ms = 0;

for (i=0;i<4;i++) txbuffer[i] = i & 1; // Startbits setzen
for (i=5;i<29;i++) txbuffer[i-1] = i & 1; // Rest des Telegramm mit "0" beschreiben

/*
txbuffer[ 0] = 0; // Startbit = "1"
txbuffer[ 1] = 1;
txbuffer[ 2] = 0; // Startbit = "1"
txbuffer[ 3] = 1;
txbuffer[ 4] = 1; // Toggle
txbuffer[ 5] = 0;
txbuffer[ 6] = 0; // Adr 4
txbuffer[ 7] = 0;
txbuffer[ 8] = 0; // Adr 3
txbuffer[ 9] = 0;
txbuffer[10] = 0; // Adr 2
txbuffer[11] = 0;
txbuffer[12] = 0; // Adr 1
txbuffer[13] = 0;
txbuffer[14] = 0; // Adr 0
txbuffer[15] = 0;
txbuffer[16] = 0; // Command 5
txbuffer[17] = 0;
txbuffer[18] = 0; // Command 4
txbuffer[19] = 0;
txbuffer[20] = 0; // Command 3
txbuffer[21] = 0;
txbuffer[22] = 0; // Command 2
txbuffer[23] = 0;
txbuffer[24] = 0; // Command 1
txbuffer[25] = 0;
txbuffer[26] = 0; // Command 0
txbuffer[27] = 0;
*/
CLEAR_BIT(PORTA,PA6); // Select 1 schalten

for (;;)
{
if (ms == 0){

// Aktuellen Status holen
SET_BIT(PORTA,PA6); // Select 1 ausschalten

CLEAR_BIT(PORTA,PA7); // Select 2 schalten
ms1=10; // Wartezeit vor Auswertung
while (ms1!=0);

newstatus = ~PINA & 0x0F; // Eingänge holen
SET_BIT(PORTA,PA7); // Select 2 schalten

CLEAR_BIT(PORTA,PA6); // Select 1 schalten
ms=10; // Wartezeit vor Auswertung
while (ms1!=0);
newstatus |= (~PINA & 0x0F) << 4; // Eingänge holen


// Eingänge checken
i = 0;
j = 1;
command = 255;
while ((i < 8) && (command == 255)){ // Alle Bits durchlaufen
// Abfrage auf wiederholte Tasten
if (((newstatus & j) == j) && ((oldstatus & j) == j)){
txbuffer[ 4] = 0; // Togglebit = "1"
txbuffer[ 5] = 1;
command = i; // Ein des Ausgangs
}
// Abfrage auf geänderte Tasten
if (((newstatus & j) == j) && ((oldstatus & j) != j)){
txbuffer[ 4] = 1; // Togglebit = "0"
txbuffer[ 5] = 0;
command = i; // Ein des Ausgangs
}
j = j << 1;
i++;
}
// Commando-Auswertung derzeit bis 7
if (command != 0xff){
for (i=22;i<28;i++) txbuffer[i] = 0; // alle Commands löschen
if(command == 0){
txbuffer[22] = 1;
txbuffer[24] = 1;
txbuffer[26] = 1;
}
if(command == 1){
txbuffer[23] = 1;
txbuffer[24] = 1;
txbuffer[26] = 1;
}
if(command == 2){
txbuffer[22] = 1;
txbuffer[25] = 1;
txbuffer[26] = 1;
}
if(command == 3){
txbuffer[23] = 1;
txbuffer[25] = 1;
txbuffer[26] = 1;
}
if(command == 4){
txbuffer[22] = 1;
txbuffer[24] = 1;
txbuffer[27] = 1;
}
if(command == 5){
txbuffer[23] = 1;
txbuffer[24] = 1;
txbuffer[27] = 1;
}
if(command == 6){
txbuffer[22] = 1;
txbuffer[25] = 1;
txbuffer[27] = 1;
}
if(command == 7){
txbuffer[23] = 1;
txbuffer[25] = 1;
txbuffer[27] = 1;
}
buf_ptr = 0; // Pointer an Anfang setzen
ms = 200; // Start senden
}
oldstatus = newstatus; // aktueller Status merken

if((PINB & 1<<PB6) == 0){ // Ausschalter betätigt
loop_until_bit_is_set(PINB, 6); // Warte bis Ausschalter losgelassen wurde
ms1=255;
while (ms1!=0);
ms1=255;
while (ms1!=0);
ms1=255;
while (ms1!=0);
ms1=255;
while (ms1!=0);

TCCR0 = 0; // Stop counter 0
TCCR1B = 0; // Stop Counter 1

set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Sleep enable
sleep_mode();
}
}
}
}



Grüße
Hans-Josef

X1CR
13.12.2007, 12:43
Netter Quellcode!

Muß ich mir mal durchlesen und ausarbeiten!

Mal schaun ob man das auf Attiny13 umsetzen kann!

Werde Heute mal RC5 mit Attiny2313 versuchen um festzustellen ob es funktioniert und ob ich die Werte mit Software Oszi messen kann um einen Vergleich zum Attiny13 Signal zu haben!


Mfg
Harry

radbruch
13.12.2007, 15:57
Hallo


Könnte man natürlich eleganter und effizienter machen, aber..
Ach was, das ist doch prima und wenn es funktioniert kümmert sich später keiner mehr drum ob es noch besser geht. Wenn ich deine 4MHz mit Prescaler=1 und OCR1A=55 für 72kHz überschlage, komme ich mit meinen 126 bei 9,6Mhz und 76kHz schon in die richtige Größenordnung. Wie gesagt, in C (und mit einem größeren AVR) dürfte es nicht schwierig sein. Aber wir wollen ja einen tiny13 mit Bascom verwenden, das verhindert den Einsatz eines zweiten Timers zur Bildung der Bitlängen. Die doppelte Sende-LED ist eine gute Idee, aber für die miniZ-Anwendung dürfte wohl eine reichen und die Schaltung ist dann auch kompakter,

Da unser Trägertakt beim tiny13 nun ja eigentlich funktioniert, könnten wir deine ISR zum Senden der Bits verwenden, jedenfalls die Strucktur. Aber ich muss mich noch etwas umschauen, denn der Platz wird eng und der Code sollte schlanker werden.


36,764705882352941176470588235294 kHz...

Richtig????
Leider nicht, es sind ca. 18Hz. (zweimal Umschalten= eine Periode). Den Nachkommamüll kannst du dir übrigens sparen, denn der interne Takt des tiny13 ist nur ungefähr 9,6MHz deshalb ist auch die erzeugte Frequenz nur ein Schätzwert (Soweit ich weiß, kann man kann die tinys zwar kalibirieren, aber das habe ich noch nicht gemacht). Auf deinem Steckbrett könntest du das ja nachbauen, ein tiny13, zwei Widerstände und eine LED...

Die Endlosschleife könnte auch so aussehen:

Label:
Goto Label

und die LED würde trotzdem blinken, weil der Takt mit dem Timer0 erzeugt wird.


...die warteschleife sollte dann die do loop schleife sein mit dem bitmuster...
Ja.

Den tiny26/2313-Code kannst du nicht direkt auf den tiny13 übertragen, weil der eben nur einen Timer hat.

Ich bastel mir jetzt auch mal eine kleine Schaltung und versuche mit den 38kHz meinen RP6 zu "blenden".

Bis später

mic

X1CR
13.12.2007, 17:18
schaltung ist bereits nachgebaut muß nur noch dahinterkommen wie ich die werte für 38kHz ändern muß....


mfg harry

X1CR
13.12.2007, 17:32
Wenn ich prescale auf 1.024 setzte hab ich dann 38khz ??? oder 18khz??

gummi_ente
13.12.2007, 18:11
Hallo Harry,

für 38kHz, muß der OCR1C = 53 stehen, ergibt 37735Hz, oder auf 52 ergibt dann 38461Hz.
Aber die Frequenz ist nicht so kritisch, auch nicht die Zeit der Pulse.

Grüße
Hans-Josef

X1CR
13.12.2007, 19:11
Nabend!

Jetzt hab ich gerade den 2313 beschrieben, im grossen und ganzen funktioniert rc5send.

Aber hat vielleicht irgendwer eine Ahnung wie oder welchen wert dass man ändern muß um die wiederholung zu erhöhen?

jetzt sendet er ca alle 0,5sec.... geht das nicht schneller?

denn wenns hier nicht funktioniert brauch ich es mit attiny13 garnicht weiter versuchen!

Mfg Harry

X1CR
13.12.2007, 19:29
So, hier ist mein RC5 Quellcode für den Tiny2313

$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 19200

Config Portb = Output

Dim Togbit As Byte , Command As Byte , Address As Byte

Command = 12

Togbit = 0

Address = 0

Do

Rc5send Togbit , Address , Command

Loop

End






Ist aus der Hilfe von Bascom mit kleiner modifikation.

Nun meine Frage, wie kann ich das Ding dazu bringen das es schneller Sendet?


Mfg Harry

radbruch
13.12.2007, 19:33
Hallo

Da hatte sich noch ein kleiner Fehler eingeschlichen, das OCR0A wurde nach dem Match nicht gelöscht, deshalb war die Blinkfrequenz nicht änderbar. Hier nun der funktionierende Bascom-Code für einen 9,6Mhz ATtiny13 und 36Khz Trägerfrequenz an Pin5:


'RC5-Code senden mit ATtiny13 13.12.2007'

$regfile = "ATtiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 16


Config Portb.0 = Output
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

Ocr0a = 133 '133=36kHz 126=38kHz'


Do
Waitms 1000
Loop
Das Progrämmchen von heute morgen blinkte mit nur 18Hz damit man es mit eigenen Augen erkennen kann.

Offensichtlich ist inzwischen der tiny13 für euch gestorben, dann werde ich meine Aktivitäten auch einstellen. Schade. Vielleicht werde ich das Thema mal wieder aufgreifen und irgendwas in Richtung IR-Barke, TV-Ausschalter oder IR-Datensender auf tiny13-Basis zusammenbasteln.

Gruß

mic

X1CR
13.12.2007, 19:42
Hi, Mic

Der tiny ist nicht gestorben, ich wollte nur mit dem 2313 feststellen ob das software Oszi das darstellen kann damit ich dann den tiny vergleichen kann!

Mfg Harry

X1CR
13.12.2007, 19:50
Zu, Mic

Ich denke dieses Oszilloskop ist einfach unbrauchbar, die Frequenzanalyse liegt bei 5kHz....

Somit kann ich das messen vergessen. :-(

Dein Programm funktioniert wunderbar!

Werd versuchen das bittmuster reinzubekommen und vorallem noch den togglebit zum wechseln zu bringen!

radbruch
14.12.2007, 22:57
Hallo


Der tiny ist nicht gestorben...
Oh, dann habe ich das wohl fehlinterpretiert. Ich dachte, weil ihr euch nun auf größere AVRs stürzt, habt ihr den tiny13 aufgegeben.

Inzwischen weiß ich auch, was ein Mini-Z-Car ist, allerdings habe ich noch keine technischen Daten wie Größe, Gewicht, Geschwindigkeit und Technik gefunden.

Dafür habe ich meinen Code weiterentwickelt und sollte nun auch RC5-Daten senden können. Allerdings mit 36kHz-Trägerfrequenz, weil damit das Bittiming sehr einfach ist. Der 36kHz-TSoP kosten nur ein Euroundeinbisschen, wir müssen also nicht zwingend den 38kHzler verwenden.

Ich hab's aber noch nicht geflasht, weil mein Programmer aus irgendeinem Grund nicht mehr funktioniert. (Das Teil ist zickiger als der asuro-Transceiver). Trotzdem zeige ich euch mal meinem momentanen Stand (es ist mein erstes erstes ernsthaftes bascom-Programm), vielleicht erkennt ja jemand auf Anhieb gravierende Fehler oder kann einen Tipp zu den Kompillerdirektiven geben:


'RC5-Code senden mit ATtiny13 (erster ernsthafter Versuch mit Bascom) 14.12.07 mic'

'Achtung! Das ist ein eher theoretischer Code den ich noch nicht getestet habe!'
'Es sollten im 0,5 Sekundentakt die Werte 0 bis 31 als Addresse und Kommando'
'mit Togglebit=0 gesendet werden. Ob das so funktioniert muss ich noch testen'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Einstellungen --------------------------------------------------------------------'

'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8

'Hier mußte ich von 16 auf 8 ändern,ich habe keine Ahnung, was das bewirkt'
'Mit 16 erhalte ich eine Fehlermeldung:'
'Out of SRAM-Space bei Dim Rc5_bit_gesetzt As Word'
$framesize = 8

'Dims und Declears ----------------------------------------------------------------'

'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word

'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word

'Teiler des Trägertaktes und Kennung des Halbbits'
'64-33 bedeutet erstes Manchester-Halbbit, 32-1 bedeutet zweites Manchester-Halbbit'
'0 bedeutet komplettes Bit gesendet!'
Dim Rc5_halbbit As Byte

'die zu sendende RC5-Adresse (5 Bits, 0-31)'
Dim Rc5_adresse As Byte

'das zu sendende RC5-Kommando (6 Bits, 0-63)'
Dim Rc5_kommando As Byte

'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word

'Zähler für das Demo'
Dim Count As Byte

'Die Sendesubroutine deklarieren'
Declare Sub Rc5_send(byval Address As Byte , Byval Command As Byte , Byval Tog As Byte)

'Initialisierung ------------------------------------------------------------------'

'Timer0 auf CTC-Mode mit OC0A-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
'Anmerkung für Harry: Ob das Bittiming bei 38kHz funktioniert weiß ich nicht,'
'aber ein 36kHz-LSoP kostet nur ca. 1,xx Euro + Versandkosten im Onlineversand'
Ocr0a = 133

'ISR für Timer0 bei OutputCompareA definieren'
On Timer0 Rc5_isr

'Interrupts für Timer0 erlauben'
Enable Timer0

'Interrupts generell erlauben'
Enable Interrupts

'Timer anhalten'
Stop Timer0

'Es wird noch wird nicht gesendet'
Rc5_halbbit = 0

'und IR-LED aus'
Config Portb.0 = Input


'Hauptprogramm --------------------------------------------------------------'

Do
For Count = 0 To 31
Call Rc5_send(count , Count , 0)
Waitms 500
Next
Loop

'Sub und ISR ---------------------------------------------------------------------'

'die eigentliche Sendefunktion'
Sub Rc5_send(address As Byte , Command As Byte , Tog As Bit)
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'

'2 Startbits setzen'
Rc5_code = &B11

'Bitmuster nach links weiterschieben und Platz für die nächsten Bits schaffen'
Shift Rc5_code , Left , 1

'das Toggle-Bit setzen wenn gewünscht'
If Tog <> 0 Then
Set Rc5_code.0
End If

'address hat 5 gültige Bits'
Shift Rc5_code , Left , 5

'überflüssige Addressbits ausblenden'
Address = Address And &B11111

'und Address-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Address

'command hat 6 gültige Bits'
Shift Rc5_code , Left , 6

'überflüssige Commandbits ausblenden'
Command = Command And &B111111

'und Kommando-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Command

'Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'
Rc5_bitmaske = &B0010000000000000

'Start der Übertragung mit dem ersten Halbbit'
Rc5_halbbit = 64

'Trägerfrequenz einschalten'
Start Timer0

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
Wait 1
Loop Until Rc5_bitmaske = 0

'Trägerfrequenz ausschalten'
Stop Timer0

'LED ausschalten'
Config Portb.0 = Input

'Fertig'
End Sub


'Ab hier folgt die ISR'
Rc5_isr:

'Wenn wir senden wollen'
If Rc5_bitmaske > 0 Then

'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 64 Then

'geben wir das erste Halbbit invertiert aus (Manchestercodierung?)
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'ende erstes Halbbit'
End If

'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 32 Then
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'ende zweites Halbbit'
End If


'Bitzeit ist Trägerfrequenz/64, also wir zählen den Bittimer runter'
Rc5_halbbit = Rc5_halbbit - 1

'Bei RC5_halbbit = 0 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 0 Then

'und laden den Bittimer mit dem Startwert für erstes Halbbit.'
Rc5_halbbit = 64

'Dann setzen wir die Bitmaske auf as nächste zu sendende Bit'
Rc5_bitmaske = Rc5_bitmaske / 2

'Rc5_bitmaske = 0 beim nächsten Aufruf der ISR bedeutet,'
'alle Bits sind gesendet, also sind wir fertig'
'nächstes Bit'
End If

'und wiederholen 14 mal'
'Ende wenn rc5_bitmaske >0'
End If
Return

Laut Bascom belegt der Code 81% des Flash-Speichers, es sollte also noch Platz für die geplante Codierung der einzelnen Mini-Z-Renner sein.

Gruß

mic

X1CR
15.12.2007, 10:24
Hi, Mic

Dein Programm sieht sehr gut aus, nur bei mir bleibt er in der Simulation von Bascom bei:

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
Wait 1
Loop Until Rc5_bitmaske = 0

hängen und die Led tut überhaupt nichts.

Hat sich irgendwo der Fehlerteufel eingeschlichen?

Ich war Gestern wieder RC fahren.... neues Spielzeug (LRP Shark 18) mein Fuhrpark wird immer grösser..... ;-)

Mfg
Harry

X1CR
15.12.2007, 10:34
Nein, sieht so aus als ob bei mir der Fehlerteufel liegt!

Vss >= 5V

Muss Akku wieder laden!

Mfg
Harry

radbruch
15.12.2007, 10:47
Hallo


Constant bit time of 1.778ms (64 cycles of 36 kHz)
Ich schätze, nun bin ich selbst in die Takt/Frequenz-Falle getappt. Wenn die Bitlänge 64 Zyklen der 36kHz dauert, müssen die Startpunkte für die Halbbits in der ISR bei 128 und 64 sein. Vermute ich mal...

Ob man das im Simulator überhaupt testen kann weis ich nicht, aber ich vermute mal, dass die ISR nicht aufgerufen wird. Das könnte man erkennen, wenn man den Wert für rc5_halbbit betrachtet., der sollte in der ISR hintergezählt werden. Dieser Code, der die ISR definiert

On Timer0 Rc5_isr

erscheint mir kritisch. Eigentlich sollte bei CompareMatch das "Compare0a"-Ereigniss abgefangen werden. Dieses ist aber bei Bascom nicht verfügbar, es gibt nur das "Compare1a"-Ereigniss. Hier hilft vielleicht die direkte Manipulation der Sprungtabelle für die Interrupts.

Eine andere Fehlerquelle könnten die globalen Variablen sein. Wahrscheinlich arbeitet die ISR nur mit der Kopie der Werte und deshalb wird rc5_bitmaske im Hauptprogramm nie zu 0 und das Programm würde sich aufhängen. Das muss ich nochmal überdenken/nachlesen. Ein Update folgt aber frühestens heute abend, weil ich heute vorweihnachtliche Familienfeier habe. *würks*

Gruß

mic

radbruch
16.12.2007, 02:43
Hallo

Es ist nicht einfach, Bascom wehrt sich gegen die Verwendung des tiny13.

Bei der letzen Version des Programms war ein falscher Interrupt in der Sprungtabelle eingetragen. Das war ja mein erster Verdacht und es hatte sich bestätigt. Die Sprungtabelle des tiny13 sieht so aus:


Address Labels Code Comments
0x0000 rjmp RESET ; Reset Handler
0x0001 rjmp EXT_INT0 ; IRQ0 Handler
0x0002 rjmp PCINT0 ; PCINT0 Handler
0x0003 rjmp TIM0_OVF ; Timer0 Overflow Handler
0x0004 rjmp EE_RDY ; EEPROM Ready Handler
0x0005 rjmp ANA_COMP ; Analog Comparator Handler
0x0006 rjmp TIM0_COMPA ; Timer0 CompareA Handler
0x0007 rjmp TIM0_COMPB ; Timer0 CompareB Handler
0x0008 rjmp WATCHDOG ; Watchdog Interrupt Handler
0x0009 rjmp ADC ; ADC Conversion Handler

Mein erster Versuch war: "On Timer0 Rc5_isr" und erzeugte diese Tabelle:

L0000:
rjmp __start ; L000A
; ----------- jump on last line
reti
;----------------------*
; pc=0x2(0x4)
;
reti
;----------------------*
; pc=0x3(0x6)
;
rjmp L00B0
; ----------- jump on last line
reti
;----------------------*
; pc=0x5(0xA)
;
reti
;----------------------*
; pc=0x6(0xC)
;
reti
;----------------------*
; pc=0x7(0xE)
;
reti
;----------------------*
; pc=0x8(0x10)
;
reti
;----------------------*
; pc=0x9(0x12)
;
reti
;----------------------*
; pc=0xA(0x14)
;
__start::

Es wurde ein OverFlow-Sprung eingetragen. Um das zu überprüfen habe ich mir einen Disassembler besorgt (ReAVR (http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=1926&showinfo=1)) und das hex-File untersucht.

Nun verwende ich folgenden Code: "On Oc0a Rc5_isr" und alles ist gut:

L0000:
rjmp __start ; L000A
; ----------- jump on last line
reti
;----------------------*
; pc=0x2(0x4)
;
reti
;----------------------*
; pc=0x3(0x6)
;
reti
;----------------------*
; pc=0x4(0x8)
;
reti
;----------------------*
; pc=0x5(0xA)
;
reti
;----------------------*
; pc=0x6(0xC)
;
rjmp L00B0
; ----------- jump on last line
reti
;----------------------*
; pc=0x8(0x10)
;
reti
;----------------------*
; pc=0x9(0x12)
;
reti
;----------------------*
; pc=0xA(0x14)
;
__start::

Jetzt war zwar der richtige Interrupt eingetragen, aber meine ISR wurde immer noch nicht aufgerufen. Das lag daran, dass der falsche Timerinterrupt erlaubt wurde. Aus "Enable Timer0" wurde deshalb "Enable Oc0a" und schon funzt auch die ISR.

Um das ganze testen zu können habe ich mir inzwischen eine kleine Testschaltung auf einem IC-Sockel zusammengebastelt:
http://radbruch.roboterbastler.de/tiny13/rc5/attiny_mit_ir-led.jpg

Als Empfänger, es gibt leider nicht mehr viele Geräte die RC5 verstehen, habe ich meinen RP6 verwendet. Den Code habe ich aus den Beispielen der RP6-Doku und damit erzeugt mein tiny13 nun folgenen Output:

Please make sure that your IR Remote Control really transmits RC5 code!
Toggle Bit:1 | Device Address:8 | Key Code:2
Toggle Bit:1 | Device Address:8 | Key Code:2
Toggle Bit:0 | Device Address:0 | Key Code:0
Toggle Bit:0 | Device Address:26 | Key Code:6
Toggle Bit:0 | Device Address:3 | Key Code:0
Toggle Bit:0 | Device Address:26 | Key Code:6
Toggle Bit:0 | Device Address:3 | Key Code:0
Toggle Bit:0 | Device Address:26 | Key Code:6
Toggle Bit:0 | Device Address:3 | Key Code:0
Toggle Bit:0 | Device Address:26 | Key Code:6
Toggle Bit:0 | Device Address:3 | Key Code:0
Toggle Bit:0 | Device Address:26 | Key Code:6
Toggle Bit:0 | Device Address:3 | Key Code:0
Toggle Bit:0 | Device Address:26 | Key Code:6
Toggle Bit:0 | Device Address:3 | Key Code:0

Das 8/2 ist meine Testfernbedienung, alle anderen Codes hatte der tiny13 gesendet. Ist zwar noch nicht das Erwartete, aber ich bin wohl auf dem richtigen Weg. Der große Fehler ist noch der Wert für das OCR0-Register. Um bei meinen Tests mit einer normalen LED etwas erkennen zu können, hatte ich das alles erst mit Presaler=1024 und OCR0=255 probiert. Man sieht dann sogar die einzelnen Bits. In "Echtzeit" mit IR-LED und Prescaller=1 hatte ich versehentlich das OCR0 nicht geändert und deshalb die unerwarteten Werte gesendet. Blöderweise hängt sich das Programm aber mit dem richtigen Wert (133) auf weil vermutlich die ISR zu lange ist. Aber das sollte auch noch machbar sein...

Im Simulator blieb ich übrigens immer bei den Wait-Befehlen stecken. Irgendwie funzt das nicht, aber ich habe noch keine Zeit investiert um mich mit der Funktion des Simulators vertraut zu machen.

Hier noch der aktuelle Code:


'RC5-Code senden mit ATtiny13 (erster ernsthafter Versuch mit Bascom) 16.12.07 mic'

'Achtung! Das ist ein eher theoretischer Code den ich noch nicht getestet habe!'
'Es sollten im 0,5 Sekundentakt die Werte 0 bis 31 als Addresse und Kommando'
'mit Togglebit=0 gesendet werden. Ob das so funktioniert muss ich noch testen'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Einstellungen --------------------------------------------------------------------'

'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8

'Hier musste ich von 16 auf 8 ändern,ich habe keine Ahnung, was das bewirkt'
'Mit 16 erhalte ich eine Fehlermeldung:'
'Out of SRAM-Space bei Dim Rc5_bit_gesetzt As Word'
$framesize = 8

'Dims und Declears ----------------------------------------------------------------'

'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word

'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word

'Teiler des Trägertaktes und Kennung des Halbbits'
'128-65 bedeutet erstes Manchester-Halbbit, 64-1 bedeutet zweites Manchester-Halbbit'
'0 bedeutet komplettes Bit gesendet!'
Dim Rc5_halbbit As Byte

'die zu sendende RC5-Adresse (5 Bits, 0-31)'
Dim Rc5_adresse As Byte

'das zu sendende RC5-Kommando (6 Bits, 0-63)'
Dim Rc5_kommando As Byte

'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word

'Zähler für das Demo'
Dim Count As Byte

'Startblinken'
Config Portb.0 = Output
Portb.0 = 1
Wait 1
Portb.0 = 0
Wait 1

'Die Sendesubroutine deklarieren'
Declare Sub Rc5_send(byval Address As Byte , Byval Command As Byte , Byval Tog As Byte)

'Initialisierung ------------------------------------------------------------------'

'Timer0 auf CTC-Mode mit OC0A-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
'Anmerkung für Harry: Ob das Bittiming bei 38kHz funktioniert weiß ich nicht,'
'aber ein 36kHz-LSoP kostet nur ca. 1,xx Euro + Versandkosten im Onlineversand'
Ocr0a = 255

'ISR für Timer0 bei OutputCompareA definieren'
On Oc0a Rc5_isr

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts

'Es wird noch wird nicht gesendet'
Rc5_bitmaske = 0

'Hauptprogramm --------------------------------------------------------------'

Do
For Count = 0 To 31
Call Rc5_send(count , Count , 0)
Waitms 200
Next
Loop

'Sub und ISR ---------------------------------------------------------------------'

'die eigentliche Sendefunktion'
Sub Rc5_send(address As Byte , Command As Byte , Tog As Bit)
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'

'2 Startbits setzen'
Rc5_code = &B11

'Bitmuster nach links weiterschieben und Platz für die nächsten Bits schaffen'
Shift Rc5_code , Left , 1

'das Toggle-Bit setzen wenn gewünscht'
If Tog <> 0 Then
Set Rc5_code.0
End If

'address hat 5 gültige Bits'
Shift Rc5_code , Left , 5

'überflüssige Addressbits ausblenden'
Address = Address And &B11111

'und Address-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Address

'command hat 6 gültige Bits'
Shift Rc5_code , Left , 6

'überflüssige Commandbits ausblenden'
Command = Command And &B111111

'und Kommando-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Command

'Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'
Rc5_bitmaske = &B0010000000000000

'Start der Übertragung mit dem ersten Halbbit'
Rc5_halbbit = 64

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
Wait 1
Loop Until Rc5_bitmaske = 0

'LED ausschalten'
Config Portb.0 = Input

'Fertig'
End Sub


'Ab hier folgt die ISR'
Rc5_isr:

'Wenn wir senden wollen'
If Rc5_bitmaske > 0 Then

'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 64 Then

'geben wir das erste Halbbit invertiert aus (Manchestercodierung?)
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'ende erstes Halbbit'
End If

'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 32 Then
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'ende zweites Halbbit'
End If


'Bitzeit ist Trägerfrequenz/64, also wir zählen den Bittimer runter'
Rc5_halbbit = Rc5_halbbit - 1

'Bei RC5_halbbit = 0 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 0 Then

'und laden den Bittimer mit dem Startwert für erstes Halbbit.'
Rc5_halbbit = 64

'Dann setzen wir die Bitmaske auf das nächste zu sendende Bit'
Rc5_bitmaske = Rc5_bitmaske / 2

'Rc5_bitmaske = 0 beim nächsten Aufruf der ISR bedeutet,'
'alle Bits sind gesendet, also sind wir fertig'
'nächstes Bit'
End If

'und wiederholen 14 mal'
'Ende wenn rc5_bitmaske >0'
End If
Return

Gruß

mic

X1CR
16.12.2007, 08:21
Guten Morgen, Mic

Sag, kannst du nicht schlafen? Halb vier Uhr Morgens.... Die arme Kaffemaschine! ;-) Werd denn Quellcode mal versuchen, hab mein ganzes Zeugs in der Werkstatt (Haus von Daddy), melde mich am Abend wieder ob ich ein erfolgserlebniss hatte!

Nochmal viele Dank für deine Hilfe! Ich hab mir das ganze viel einfacher vorgsestellt!

Mfg
Harry

X1CR
16.12.2007, 12:39
Hi, Mic!

Hab deinen Quellcode getestet! Bei mir sendet er nur alle 16 sekunden...

Wenn ich bei Bascom die Fuses und Bits einstelle, schreibe und dann auf aktualisieren gehe kommen wieder die grundeinstellungen...

Hat da mein Brenner was??? Ich verstehs nicht! ----> myavr Multiprog mit USB Interface...


Mfg
Harry

radbruch
16.12.2007, 13:23
Hallo Harry

Ich verwende den mysmartusb-Programmer und kann damit die Fuses weder mit avrdude noch mit bascom setzen. Ich setze meine Fuses deshalb mit dem myavr-Workpad-Demo das auf meiner Programmer-CD drauf war und das man auch bei myavr.de (http://myavr.de/download.php) downloaden kann. (unter [Extras->Fuses- und Lock-Bits])

In der letzten Version meines Bascom-Programmes blinkt die LED nach dem Start eine Sekunde lang (Wait 1), ist dann eine Sekunde dunkel und dann erst wird der Timer gestartet und der RC5-Code gesendet. Wenn dein tiny13 nur mit 1,2MHz taktet wird mit Sicherheit die ISR zu langsam ausgeführt und der tiny12 hängt sich auf. Das geschieht nach dem Start des Timers sehr schnell und würde ziemlich genau zu deinem 16 Sekunden Blinkintervall passen, denn alles wäre 8 mal langsamer:

8 Sekunden Starthell + 8 Sekunden Startdunkel + ein paar Millisekunden bis Stapelüberlauf durch die ISR und dadurch ausgelöstem Neustart.

Stell doch mal testweise den $crystal-Wert auf 1200000, dann sollte bei einem 1,2MHz-tinytakt das Startblinken im Sekundentakt erscheinen weil Wait richtig berechnet wird. Allerdings immer noch mit dem Stapelüberlauf durch die ISR.

Irgendwas stimmt mit dem Timing des RC-Codes immer noch nicht. Ich habe zwar inzwischen die ISR abgespeckt (mit nosave im on orc0-Befehl) und nun kann ich auch wieder mit ocr0=133 toggeln ohne das sich mein tiny13 aufhängt. Aber auch mit doppelter Bitlänge=128 wird dann gar nichts empfangen. Möglicherweise liegt das aber schlicht an meinem 100 Ohm Vorwiderstand für die IR-LED. Mit einer normalen roten 5mm-LED sehe ich zwar das Blinken, aber wirklich hell ist es nicht. Ich muss wohl doch mal den Spannungsabfall an den LEDs messen und den Vorwiderstand richtig berechnen. (In der Spenderfernbedienung der IR-LED war bei 3V-Versorgungsspannung ein 1 Ohm-SMD Widerstand in Reihe zur IR-LED eingebaut.)

Gruß

mic

X1CR
16.12.2007, 13:39
Hi, Mic!

Danke für den tip, werde mal Workpad versuchen um die Fuses zu setzen.

Also, bei mir blinkt die LED ordentlich... Stab. Spannung über 7805 anbei Grüne LED (ohne Vorwiderstand.... [-X )


Mfg
Harry

X1CR
16.12.2007, 14:16
Mit meinem Workpad geht das nicht!!!

Meldung:

Fehler für den Prozessor konnte keine Konfiguration ermittelt werden.


und wenn ich den Tiny in den Einstellungen ändern möchte sagt es mir dass das diese version nicht unterstützt.......


Mfg Harry

X1CR
16.12.2007, 14:37
Nein, jetzt muß ich mir wohl auch noch die Vollversion bestellen und wieder eine Woche warten..... :-(

stefan_Z
16.12.2007, 15:40
Vollversion bringt doch nur was, wenn der Code > 4kB ist...
Programmierung und Fuses kann man aber auch super mit PonyProg setzen, oder hab ich was verpasst?

radbruch
16.12.2007, 15:56
Hallo stefan_Z


oder hab ich was verpasst?
Nein, ich denke nicht, dass du was verpasst hast. Manche Programmierer funktionieren eben nicht mit jeder Software. Ich kenne Harrys Programmer leider nicht, dass muss er sich letztlich selbst erarbeiten wie das mit seinem Programmer funktioniert.

PonyProg funktionierte mit meinem Programmer auch nicht, die Lösung fand ich dann schließlich irgendwo in einem Forum und seitdem funzt es bei mir.

Eine Vollversion von Bascom dürfte auch meiner Meinung nach nicht die Lösung bringen und ist für den tiny13 auch sicher nicht nötig.

Übrigens bin ich dem eigentlichen RC5-Problem vermutlich schon wieder etwas näher gekommen. Ich habe nun einen 50 Ohm Vorwiderstand und kann aus ca. 1m Entfernung senden. Allerdings akzeptiert mein RP6 nur bestimmte Addressen/Kommando-Kombinationen. Es sind 5, 9, 21 und 27. Mit einem geänderten Testprogramm das feste Codes sendet, erhalte ich auch regelmässigen Empfang, aber eben immer noch nicht das erwartete und auch nicht mit den vermuteten Timings. Ich vermute, der RP6 macht eine Plausibilitätsprüfung und filtert ungültige Codes raus. Das würde allerdings bedeuten, dass meine zusammengesetzten Bitfolgen für den RC5-Code nicht stimmen. Ich muss mir wohl die msb-lsb-Geschichte nochmal genauer anschauen. Das Programm sieht nun so aus


'RC5-Code senden mit ATtiny13 16.12.07 mic'

'Achtung! Das ist ein eher theoretischer Code den ich noch nicht getestet habe!'
'Es sollten im 0,2 Sekundentakt die Werte 0 bis 31 als Addresse und Kommando'
'mit Togglebit=0 gesendet werden. Ob das so funktioniert muss ich noch testen'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Einstellungen --------------------------------------------------------------------'

'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8

'Hier musste ich von 16 auf 8 ändern,ich habe keine Ahnung, was das bewirkt'
'Mit 16 erhalte ich eine Fehlermeldung:'
'Out of SRAM-Space bei Dim Rc5_bit_gesetzt As Word'
$framesize = 8

'Dims und Declears ----------------------------------------------------------------'

'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word

'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word

'Teiler des Trägertaktes und Kennung des Halbbits'
'128-65 bedeutet erstes Manchester-Halbbit, 64-1 bedeutet zweites Manchester-Halbbit'
'0 bedeutet komplettes Bit gesendet!'
Dim Rc5_halbbit As Byte

'die zu sendende RC5-Adresse (5 Bits, 0-31)'
Dim Rc5_adresse As Byte

'das zu sendende RC5-Kommando (6 Bits, 0-63)'
Dim Rc5_kommando As Byte

'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word

'Zähler für das Demo'
Dim Count As Byte

'Hilfsvariable'
Dim Temp As Byte

'Startblinken'
Config Portb.0 = Output
Portb.0 = 1
Wait 1
Portb.0 = 0
Wait 1

'Die Sendesubroutine deklarieren'
Declare Sub Rc5_send(byval Address As Byte , Byval Command As Byte , Byval Tog As Byte)

'Initialisierung ------------------------------------------------------------------'

'Timer0 auf CTC-Mode mit OC0A-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
Ocr0a = 255

'ISR für Timer0 bei Compare0A-Match definieren'
On Oc0a Rc5_isr Nosave

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts

'Es wird noch wird nicht gesendet'
Rc5_bitmaske = 0

'Hauptprogramm --------------------------------------------------------------'

Do
Call Rc5_send(0 , 31 , 0)
Waitms 200
Call Rc5_send(1 , 15 , 0)
Waitms 200
Call Rc5_send(2 , 7 , 0)
Waitms 200
Call Rc5_send(4 , 3 , 0)
Waitms 200
Call Rc5_send(8 , 1 , 0)
Waitms 200
Call Rc5_send(16 , 0 , 0)
Waitms 200
Loop

'Sub und ISR ---------------------------------------------------------------------'

'die eigentliche Sendefunktion'
Sub Rc5_send(address As Byte , Command As Byte , Tog As Bit)
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'

'2 Startbits setzen'
Rc5_code = &B11

'Bitmuster nach links weiterschieben und Platz für die nächsten Bits schaffen'
Shift Rc5_code , Left , 1

'das Toggle-Bit setzen wenn gewünscht'
If Tog <> 0 Then
Set Rc5_code.0
End If

'address hat 5 gültige Bits'
Shift Rc5_code , Left , 5

'überflüssige Addressbits ausblenden'
Address = Address And &B11111

'und Address-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Address

'command hat 6 gültige Bits'
Shift Rc5_code , Left , 6

'überflüssige Commandbits ausblenden'
Command = Command And &B111111

'und Kommando-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Command

'Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'
Rc5_bitmaske = &B0010000000000000

'Start der Übertragung mit dem ersten Halbbit'
Rc5_halbbit = 64

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
nop
Loop Until Rc5_bitmaske = 0

'LED ausschalten'
Config Portb.0 = Input

'Fertig'
End Sub


'Ab hier folgt die ISR'
Rc5_isr:
'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
PUSH R24 ; since we are going to use R24 we better save it
IN r24, SREG ; get content of SREG into R24
PUSH R24 ; we can save a register
$end Asm

'Wenn wir senden wollen'
If Rc5_bitmaske > 0 Then

'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 64 Then

'geben wir das erste Halbbit invertiert aus (Manchestercodierung?)
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'ende erstes Halbbit'
End If

'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 32 Then
If Rc5_bit_gesetzt > 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'ende zweites Halbbit'
End If


'Bitzeit ist Trägerfrequenz/64, also wir zählen den Bittimer runter'
Rc5_halbbit = Rc5_halbbit - 1

'Bei RC5_halbbit = 0 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 0 Then

'und laden den Bittimer mit dem Startwert für erstes Halbbit.'
Rc5_halbbit = 64

'Dann setzen wir die Bitmaske auf das nächste zu sendende Bit'
Rc5_bitmaske = Rc5_bitmaske / 2

'Rc5_bitmaske = 0 beim nächsten Aufruf der ISR bedeutet,'
'alle Bits sind gesendet, also sind wir fertig'
'nächstes Bit'
End If

'und wiederholen 14 mal'
'Ende wenn rc5_bitmaske >0'
End If

$asm 'Code aus der Basom-Hilfe on interrupt isr nosave'
POP R24 ;get content of SREG
Out Sreg , R24 ; Save Into Sreg
POP R24 ; get r24 back
$end Asm
Return
und belegt so 99% des tiny13-Speichers.

Gruß

mic

X1CR
16.12.2007, 16:00
PonyProg sagt mir was....

Aber funktioniert das mit MysmartUSB ???

Mfg Harry

X1CR
16.12.2007, 16:34
Zu, Mic, nein, ich meinte die Vollversion von AVR Worpad, denn bei dieser version die bei mir dabei war geht nur der mega8 u. 88 und überhaupt keine tinys....
Habe MySmartUSB + MyMultiprog V1.06

Mfg
Harry

stefan_Z
16.12.2007, 16:35
OK, den Progger kenn ich nicht, aber was sagen denn AVRdude und Pony dazu?
Zum Thema AVRstudio: http://www.mikrocontroller.net/topic/83275

X1CR
16.12.2007, 16:54
Avrdude geht angeblich nur die version 5.1 kann ich aber nirgends finden und pony findet den programmer überhauptnicht.

Mfg Harry

radbruch
16.12.2007, 17:37
Hallo Harry


Habe MySmartUSB

Also ich verwende auch den mysmartusb (auf der Platine steht: v2.11) und das Demo von myavr WorkPad Plus (build 2523) und kann die Fuses meiner tiny13 damit lesen und schreiben. Ich verwende dabei einen ISP-Stecker auf meiner Testplatine und ein kleines Kabel zwischen Programmer und der Platine.

Vielleicht sitzt auch nur dein tiny nicht richtig im Sockel, bzw. hat Kontaktprobleme durchs rein/rausstöpseln.

Allerdings habe ich inzwischen vier tinys hier rumliegen die ich damit überhaupt nicht mehr ansprechen kann. Die ersten drei habe ich wohl mit Versuchen am ADC und zu hohen Eingansspannung am Pin gekillt, den Vierten habe ich geröstet, weil ich ihn falsch in den Sockel meiner Schaltung gesteckt hatte. Alle vier führen zwar noch ihr letztes Programm aus, können aber mit dem Programmer nicht mehr angesprochen werden (weder flashen noch Fuses lesen/schreiben).

Gruß

mic

X1CR
16.12.2007, 18:21
Okay, werd mal myavr workpad plus installieren, hab vorher nur das normale installiert (SE) vielleicht sind da die tinys freigeschaltet!

X1CR
16.12.2007, 18:23
siehe da, es funktioniert!!!!

stefan_Z
16.12.2007, 18:26
Und was ist mit der Treiber-CD? Sollte ja dabei sein, laut Internet...

X1CR
16.12.2007, 18:37
stefan, hat sich schon erledigt! Workpad se kanns nicht, aber workpad plus kanns!

X1CR
16.12.2007, 19:09
Hey, Mic

Hab dein Programm gerade getestet, Sendet schon brav RC5 codes, nur kann ich nicht 100% sagen ob sie stimmen! Kann man das Programm irgendwie verändern das nur 1 Signal gesendet wird? Im grossen und ganzen siehts schon gut aus, nur versteh ich gerade mal 10% vom Programm! Eines muss ich eingestehen du hast wirklich was drauf!

Mfg Harry

radbruch
16.12.2007, 20:46
Hallo Harry

Hihi, danke für's Lob. Prima, dass es nun mit deinen Fuses funktioniert. Dass der Code für dich noch nicht vollkommen durchschaubar ist, wundert mich nicht wirklich. Ich quäle mich auch sehr, aber man wächst ja bekanntlich mit den Aufgaben.

Inzwischen kann ich den RC5-Code richtig senden, allerdings nur einmal, weil meine ISR noch zu lange dauert und sich der Tiny deshalb aufhängt. Trotz aller Optimierungsanstrengungen will sie einfach nicht mehr kleiner werden.

Ein großer Fehler steckt noch in der Zusammenstellung der zu sendenden Bits, deshalb wird zum Testen jetzt der Wert für rc5_code direkt als Bitmuster gesetzt. In der jetztigen Version des Progamms kurz bevor die ISR die Kontrolle übernimmt:

Rc5_code = &B0011000101000111

steht z.B. für 2 Start, kein Toggle, Addresse 5 und Command 7

Übrigens kann ich mit dem Code sogar mit der normalen roten LED auf kurze Entfernung (10 cm) Daten zu meinem RP6 senden.

Durch die Optimierungen belegt das Programm nun nur noch 58% des Speichers:


'RC5-Code senden mit ATtiny13 100% Funktion! (aber nur einmal*grummel*)16.12.07 mic'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Einstellungen -----------------------------------------------------------------'

'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8

'Hier musste ich von 16 auf 8 ändern,ich habe keine Ahnung, was das bewirkt'
'Mit 16 erhalte ich eine Fehlermeldung:'
'Out of SRAM-Space bei Dim Rc5_bit_gesetzt As Word'
$framesize = 8

'Dims und Declears -------------------------------------------------------------'

'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word

'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word

'Teiler des Trägertaktes und Kennung des Halbbits'
'128-65 bedeutet erstes Manchester-Halbbit, 64-1 bedeutet zweites Manchester-Halbbit'
'0 bedeutet komplettes Bit gesendet!'
Dim Rc5_halbbit As Byte

'die zu sendende RC5-Adresse (5 Bits, 0-31)'
Dim Rc5_adresse As Byte

'das zu sendende RC5-Kommando (6 Bits, 0-63)'
Dim Rc5_kommando As Byte

'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word

'Zähler für das Demo'
Dim Count As Byte

'Startblinken'
Config Portb.0 = Output
Portb.0 = 1
Wait 1
Portb.0 = 0
Wait 1

'Die Sendesubroutine deklarieren'
Declare Sub Rc5_send(byval Address As Byte , Byval Command As Byte , Byval Tog As Byte)

'Initialisierung ---------------------------------------------------------------'

'Timer0 auf CTC-Mode mit OC0A-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
Ocr0a = 133

'ISR für Timer0 bei Compare0A-Match definieren'
On Oc0a Rc5_isr Nosave

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts

'Es wird noch wird nicht gesendet'
Rc5_bitmaske = 0

'Hauptprogramm -----------------------------------------------------------------'

Do
Call Rc5_send(count , Count , 0)
Waitms 200
Loop

'Sub und ISR -------------------------------------------------------------------'

'die eigentliche Sendefunktion'
Sub Rc5_send(address As Byte , Command As Byte , Tog As Bit)
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'

'2 Startbits setzen'
Rc5_code = &B11

'Bitmuster nach links weiterschieben und Platz für die nächsten Bits schaffen'
Shift Rc5_code , Left , 1

'das Toggle-Bit setzen wenn gewünscht'
If Tog <> 0 Then
Set Rc5_code.0
End If

'address hat 5 gültige Bits'
Shift Rc5_code , Left , 5

'überflüssige Addressbits ausblenden'
Address = Address And &B11111

'und Address-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Address

'command hat 6 gültige Bits'
Shift Rc5_code , Left , 6

'überflüssige Commandbits ausblenden'
Command = Command And &B111111

'und Kommando-Bits in Rc5_code setzen'
Rc5_code = Rc5_code Or Command

'Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'
Rc5_bitmaske = &B0010000000000000

Rc5_code = &B0011000101000111 '

'Start der Übertragung mit dem ersten Halbbit, Trägertakt /128 = Bitlänge!'
'Rc5_halbbit = 128'
Rc5_halbbit = Bits(7)

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Do
nop
Loop Until Rc5_bitmaske = 0

'LED ausschalten'
Config Portb.0 = Input

'Fertig'
End Sub


'Ab hier folgt die ISR'
Rc5_isr:
'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
PUSH R24 ; since we are going to use R24 we better save it
IN r24, SREG ; get content of SREG into R24
PUSH R24 ; we can save a register
$end Asm

'Wenn wir senden wollen'
If Rc5_bitmaske > 0 Then

'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 128 Then

'dann geben wir das erste Halbbit invertiert aus. (Manchestercodierung)
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'ende erstes Halbbit'
End If

'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 64 Then
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'ende zweites Halbbit'
End If


'Bitzeit ist Trägertakt/128 , also wir zählen den Bittimer runter'
Decr Rc5_halbbit

'Bei RC5_halbbit = 0 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 0 Then

'und laden den Bittimer mit dem Startwert für erstes Halbbit.'
'Rc5_halbbit = 128'
Rc5_halbbit = Bits(7)

'Dann setzen wir die Bitmaske auf das nächste zu sendende Bit'
Shift Rc5_bitmaske , Right , 1

'Rc5_bitmaske = 0 beim nächsten Aufruf der ISR bedeutet,'
'alle Bits sind gesendet, also sind wir fertig'
'nächstes Bit'
End If

'und wiederholen 14 mal'
'Ende wenn rc5_bitmaske >0'
End If

$asm 'Code aus der Basom-Hilfe on interrupt isr nosave'
POP R24 ;get content of SREG
Out Sreg , R24 ; Save Into Sreg
POP R24 ; get r24 back
$end Asm
Return
Und noch der Output meines RP6 (mit jeweils einem tiny-Neustart zwischen den Zeilen):

_________
Please make sure that your IR Remote Control really transmits RC5 code!
Toggle Bit:0 | Device Address:5 | Key Code:7
Toggle Bit:0 | Device Address:5 | Key Code:7
Toggle Bit:0 | Device Address:5 | Key Code:7

So langsam sollte man sich mal Gedanken über die Auswertung der Daten für die geplante Zeitnahme am PC machen...

Ach, noch eine Bemerkung zum RC5-Protokoll: Je nach Informationsquelle wird ein gesetztes Bit durch einen LowzuHigh oder einen HighzuLow-Übergang beschrieben. Ich folge jetzt der verbreitesten Auffassung und sende LowzuHigh für ein High und HighzuLow für ein Low. Im RN-Wissen (https://www.roboternetz.de/wissen/index.php/RC5-Code#Aufbau_des_RC5-Signals) ist es genau gegenteilig beschrieben. Die Verwirrung wird wohl durch den negierten Ausgang des PSoP verursacht. Mein RP6 versteht meine selbst erzeugten Daten und die Daten meiner TV-Fernbedienung. Deshalb nehme ich an, meine Version ist die Richtige.

Gruß

mic

X1CR
17.12.2007, 07:00
Guten Morgen, Mic


zu deiner Aussage:

So langsam sollte man sich mal Gedanken über die Auswertung der Daten für die geplante Zeitnahme am PC machen...


Die Auswertung funktioniert bereits,

Der Empfänger:

http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm

Die Software:

http://www.ocinside.de/go_d.html?http://www.ocinside.de/html/modding/usb_ir_receiver/usb_ir_girder_installation_d.html

Der Rundenzähler:

http://www.rctiming.com/download.shtml

(LapsFree)

Mit der Fernbedienung des Sat-Receivers funktionierts tadellos (mit Seriellen Empfänger), für USB hab ichs noch nicht gebaut! Sollte aber kein Problem sein wenn das Programm mit Attiny2313 zu 100% kompatibel ist!

Is zwar keine Elegante Lösung, aber es funktioniert!
Es soll ja auch nicht aufs tausendstel genau sein!

Kann es auch nicht, da ich ja ein gewisses "IR - Fenster" zum übertragen brauche und da ist die übertragung mal schneller und mal langsamer.

Mfg

Harry

radbruch
17.12.2007, 23:19
Hallo Harry


Die Auswertung funktioniert bereits
Das trifft sich gut, denn das Programm für den tiny13 ist auch fertig:


'RC5-Code senden mit ATtiny13 100% Funktion mit endloser Wiederholung 18.12.07 mic'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Die Stellen, an denen man den zu sendenden Code und die Wiederholgeschwindigkeit'
'ändern kann, sind mit +++++++++++++++++++++++++++++++++++++++++++++++++ markiert'
'

'Einstellungen -----------------------------------------------------------------'

'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"

'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000

'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8
$framesize = 16

'Dims --------------------------------------------------------------------------'

'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word

'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word

'Teiler des Trägertaktes und Kennung des Halbbits'
'0-63 bedeutet erstes Manchester-Halbbit, 64-127 bedeutet zweites Manchester-Halbbit'
Dim Rc5_halbbit As Byte

'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word

'Sendeflag'
Dim Senden_aktiv As Byte

'Anfang Startblinken'
Config Portb.0 = Output
Portb.0 = 1
Waitms 500
Config Portb.0 = Input
Portb.0 = 0
Wait 1
'Ende Startblinken'

'Initialisierung ---------------------------------------------------------------'

'Startwerte setzen, es findet noch keine Übertragung statt'
Senden_aktiv = 0

'Timer0 auf CTC-Mode mit OC0APin-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
Ocr0a = 133

'ISR für Timer0 bei Compare0A-Match definieren'
On Oc0a Rc5_isr Nosave

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts


'Hauptprogramm -----------------------------------------------------------------'
'+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++'
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'und Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'

'+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++'
'Hier kann man den gewünschten Code eintragen'

Rc5_code = &B0011000101000111

'Testcode: 2 Start, kein Toggle, Adresse 5, Kommando 7'
'+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++'

Label:

'Bitmaske auf erstes von 14 zu sendende Bits setzen' '
Rc5_bitmaske = &B0010000000000000

'Start ist erstes Halbbit'
Rc5_halbbit = 0

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Senden_aktiv = 1

Do
nop
Loop Until Senden_aktiv = 0

'+++++++++++++++++++++++++++++++++++++++++'
'Kurz warten vor der nächsten Übertragung'

Config Portb.0 = Output
Portb.0 = 1
Waitms 50
Config Portb.0 = Input
Portb.0 = 0
Waitms 100


'Das ist dann die Wiederholgeschwindikeit'
'+++++++++++++++++++++++++++++++++++++++++'

'Wert für rc5_code erhöhen, Nach Kommando-Überlauf wird Addresse erhöht!'
Incr Rc5_code

'endlos wiederholen'
Goto Label

'Ab hier folgt die ISR ---------------------------------------------------------'
Rc5_isr:
'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
PUSH R24 ; since we are going to use R24 we better save it
IN r24, SREG ; get content of SREG into R24
PUSH R24 ; we can save a register
$end Asm

'Wenn wir senden wollen'
If Senden_aktiv = 1 Then

'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 0 Then

'dann geben wir das erste Halbbit invertiert aus. (Manchestercodierung)
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'Ende erstes Halbbit'
End If

'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 64 Then
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'Ende zweites Halbbit'
End If

'Bitzeit ist Trägertakt/128 , also wir zählen den Bittimer hoch'
Incr Rc5_halbbit

'Bei RC5_halbbit = 128 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 128 Then

'Wir setzen die Bitmaske auf das nächste zu sendende Bit'
Shift Rc5_bitmaske , Right , 1

'und laden den Bittimer mit dem Startwert als Flag für erstes Halbbit.'
Rc5_halbbit = 0

'Ist das letzte Bit gesendet?'
If Rc5_bitmaske = 0 Then

'Dann sind wir fertig. Dies erkennt dann das Hauptprogramm'
Senden_aktiv = 0

'Ende Sendeflag'
End If

'weitersenden bis alle Bits ausgegeben sind'
End If

'und wiederholen bis rc5_bitmaske = 0'
End If

'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
POP R24 ;get content of SREG
Out Sreg , R24 ; Save Into Sreg
POP R24 ; get r24 back
$end Asm
Return
Die Ausgabe meines RP6 (die Daten wurden mit einer normalen roten 5mm-LED aus ca. 30cm Entfernung gesendet!):

Please make sure that your IR Remote Control really transmits RC5 code!
Toggle Bit:0 | Device Address:5 | Key Code:7
Toggle Bit:0 | Device Address:5 | Key Code:8
Toggle Bit:0 | Device Address:5 | Key Code:9
Toggle Bit:0 | Device Address:5 | Key Code:10
Toggle Bit:0 | Device Address:5 | Key Code:11
Toggle Bit:0 | Device Address:5 | Key Code:12
Toggle Bit:0 | Device Address:5 | Key Code:13
Toggle Bit:0 | Device Address:5 | Key Code:14
Toggle Bit:0 | Device Address:5 | Key Code:15
Toggle Bit:0 | Device Address:5 | Key Code:16
Toggle Bit:0 | Device Address:5 | Key Code:17
Toggle Bit:0 | Device Address:5 | Key Code:18
Toggle Bit:0 | Device Address:5 | Key Code:19
Toggle Bit:0 | Device Address:5 | Key Code:20
Toggle Bit:0 | Device Address:5 | Key Code:21
Toggle Bit:0 | Device Address:5 | Key Code:22
Toggle Bit:0 | Device Address:5 | Key Code:23
Toggle Bit:0 | Device Address:5 | Key Code:24
Toggle Bit:0 | Device Address:5 | Key Code:25
Toggle Bit:0 | Device Address:5 | Key Code:26
Toggle Bit:0 | Device Address:5 | Key Code:27
Toggle Bit:0 | Device Address:5 | Key Code:28
Toggle Bit:0 | Device Address:5 | Key Code:29
Toggle Bit:0 | Device Address:5 | Key Code:30
Toggle Bit:0 | Device Address:5 | Key Code:31
Toggle Bit:0 | Device Address:5 | Key Code:32
Toggle Bit:0 | Device Address:5 | Key Code:33
Toggle Bit:0 | Device Address:5 | Key Code:34
Toggle Bit:0 | Device Address:5 | Key Code:35
Toggle Bit:0 | Device Address:5 | Key Code:36
Toggle Bit:0 | Device Address:5 | Key Code:37
Toggle Bit:0 | Device Address:5 | Key Code:38
Toggle Bit:0 | Device Address:5 | Key Code:39
Toggle Bit:0 | Device Address:5 | Key Code:40
Toggle Bit:0 | Device Address:5 | Key Code:41
Toggle Bit:0 | Device Address:5 | Key Code:42
Toggle Bit:0 | Device Address:5 | Key Code:43
Toggle Bit:0 | Device Address:5 | Key Code:44
Toggle Bit:0 | Device Address:5 | Key Code:45
Toggle Bit:0 | Device Address:5 | Key Code:46
Toggle Bit:0 | Device Address:5 | Key Code:47
Toggle Bit:0 | Device Address:5 | Key Code:48
Toggle Bit:0 | Device Address:5 | Key Code:49
Toggle Bit:0 | Device Address:5 | Key Code:50
Toggle Bit:0 | Device Address:5 | Key Code:51
Toggle Bit:0 | Device Address:5 | Key Code:52
Toggle Bit:0 | Device Address:5 | Key Code:53
Toggle Bit:0 | Device Address:5 | Key Code:54
Toggle Bit:0 | Device Address:5 | Key Code:55
Toggle Bit:0 | Device Address:5 | Key Code:56
Toggle Bit:0 | Device Address:5 | Key Code:57
Toggle Bit:0 | Device Address:5 | Key Code:58
Toggle Bit:0 | Device Address:5 | Key Code:59
Toggle Bit:0 | Device Address:5 | Key Code:60
Toggle Bit:0 | Device Address:5 | Key Code:61
Toggle Bit:0 | Device Address:5 | Key Code:62
Toggle Bit:0 | Device Address:5 | Key Code:63
Toggle Bit:0 | Device Address:6 | Key Code:0
Toggle Bit:0 | Device Address:6 | Key Code:1
Toggle Bit:0 | Device Address:6 | Key Code:2
Toggle Bit:0 | Device Address:6 | Key Code:3
Toggle Bit:0 | Device Address:6 | Key Code:4
Toggle Bit:0 | Device Address:6 | Key Code:5
Toggle Bit:0 | Device Address:6 | Key Code:6
Toggle Bit:0 | Device Address:6 | Key Code:7
Toggle Bit:0 | Device Address:6 | Key Code:8
Toggle Bit:0 | Device Address:6 | Key Code:9
Toggle Bit:0 | Device Address:6 | Key Code:10
Toggle Bit:0 | Device Address:6 | Key Code:11
Toggle Bit:0 | Device Address:6 | Key Code:12
Toggle Bit:0 | Device Address:6 | Key Code:13
Toggle Bit:0 | Device Address:6 | Key Code:14
Toggle Bit:0 | Device Address:6 | Key Code:15
Toggle Bit:0 | Device Address:6 | Key Code:16
Toggle Bit:0 | Device Address:6 | Key Code:17
Toggle Bit:0 | Device Address:6 | Key Code:18
Toggle Bit:0 | Device Address:6 | Key Code:19
Toggle Bit:0 | Device Address:6 | Key Code:20
Toggle Bit:0 | Device Address:6 | Key Code:21
Toggle Bit:0 | Device Address:6 | Key Code:22
Toggle Bit:0 | Device Address:6 | Key Code:23
Toggle Bit:0 | Device Address:6 | Key Code:24
Toggle Bit:0 | Device Address:6 | Key Code:25
Toggle Bit:0 | Device Address:6 | Key Code:26

Nach vielen Versuchen und mit deutlich schlankerem Code (ohne Schnickschnack nur noch das Wesentliche) sendet der tiny13 nun schneller als meine TV-Fernbedienung im Repead-Mode. Warum das so nun funktioniert kann ich noch nicht wirklich schlüssig erklären. Hauptproblem ist der so nicht funktionierende Handshake zwischen Warteschleife und ISR. Und da sind noch ein paar andere Dinge, die nicht so funktionieren, wie ich das gerne hätte.

Der zu sendende RC5-Code wird nun direkt im Quellcode eingetragen (Doku im Listing), die Wiederholgeschwindigkeit ist schon ziemlich am Limit, eventuell sind noch ein paar ms drin, aber es sollte so schon reichen. Das Programm belegt 41% des Speichers, man könnte also noch eine externe Codierung für den jeweiligen Renner einbauen. Oder man flasht die tinys einzeln und markiert sie.

Im Programm ist zur Demo und zum Testen der Ausgabe ein automatisches Hochzählen der Kommando-Werte (mit Überlauf in die Address-Werte) eingebaut. Der Befehl dafür (incr rc5_code) befindet sich am Ende der Hauptschleife direkt vor dem GOTO-Befehl (wenn schon Basic, dann aber mit Genuss! *grins*) Für den endgültigen Einsatz muss man den Befehl natürlich entfernen/auskommentieren.

Ich hoffe, die Funktion genügt den Erfordernissen.

Gruß

mic

X1CR
18.12.2007, 06:58
Hi, Mic!

Danke für deine Bemühungen, werde das Programm gleich Heute testen!

Bin schon total gespannt!

Werde Berichten, ob mit Erfolg oder ohne!

Mfg Harry

X1CR
18.12.2007, 17:26
Hi, Mic!

Ich bin sprachlos! Es funktioniert!

Alleine die Reichweite ist genial.... bisschen zuviel, aber das lässt sich ja ändern!

Bei der Geschwindigkeit bin ich auf 50ms gegangen, meines Erachtens sendet er tadellos ohne irgend welche hänger!

Nur die Software ist zu langsam! ;-)

Spitzen Programm! Du hast mir sehr geholfen, danke nochmal!

Werde nun mal ein Paar Prototypen bauen und sie an den Fahrzeugen testen, wie es aussieht mit Überschneidungen der IR-Sender.

("Arbeit" für die Weihnachtsfeiertage)

Der Tiny13 kann mehr als man glaubt ---> zumindest was ich gedacht habe! ;-)

Muss mich unbedingt mehr mit dieser Materie beschäftigen, den alleine schon Dein Laufroboter mit den Drei Servos und den Scheiben an den Füssen..... ist genial.

Werde mal versuchen analogservos über attiny anzusprechen, wird hoffentlich nich so komplex sein wie der RC5Sender auf einen Chip der es nicht kann.....

Werde weiterhin meine Fortschritte zu RC5 Sender posten wenns jemanden interessiert, ich hab vor das ganze zusätzlich in SMD Bauweise zu verwirklichen!

Dazu eine Frage: Kann der SMD ATtiny13 auch 50mA am Ausgang? Wenn nicht welcher Transistor ist für 38kHz geeignet?

Auf jeden Fall werd ich jetzt alles Fernsteuern was es nur gibt..... ;-)

---> nächstes Projekt Bionic-Female-Interface ;-)


Mfg und besten Dank

Harry

stefan_Z
18.12.2007, 17:33
50mA kann der Tiny denke ich schon, aber das ist eher "auf eigene Gefahr"... Zur Sicherheit lieber nen BCxx dazwischen und gut ists... 38kHz sind ja nicht wirklich viel...

X1CR
18.12.2007, 18:23
Eigene Gefahr Gut! ;-)
Mal sehen wie weit die IR-LED mit rund 40mA sendet!


(Platz sparen)

Mfg Harry

radbruch
18.12.2007, 19:11
Hallo Harry


Ich bin sprachlos! Es funktioniert!
Das freut mich sehr. Man könnte noch ein paar Optimierung durchführen, aber wenn es so funzt, ist es ja gut.

Vielleicht haben wir jetzt eine eierlegende Wollmilchsau erfunden. Den zur 36kHz-Erzeugung häufig verwendeten NE555 sticht der tiny13 trotz der geringen Mehrkosten locker aus. Er benötigt keine externen Bauteile und kann selbstständig Daten auf das Signal modulieren. Der Empfang der Daten ist sehr einfach, denn man muss nur die TOsP-Datenbits einlesen, die 36kHz verarbeitet der TOsP selbstständig. Den passenden Empfangs-tiny13 werde ich natürlich auch noch programmieren.

Mit den noch freien vier Eingangspins kann man vier Schalter abfragen und die jeweiligen Stati senden. So läßt sich eine 4bit parallele IR-Schnittstelle realisieren mit der man per IR alles möglich steuern kann.

Wenn man die empfangenen Daten nicht als RC5 interpretiert sondern als einen reinen Bitwert, dann kann man mit dem Programm alles mögliche senden. Als 16, 8, 4-bit oder beliebigen anderen Bitlängen, einfach die Bitmaske anpassen und fertig. Mit weniger Bits wird die Geschwindigkeit noch schneller und die Schaltung stromsparender. So kann der tiny13 Daten an alle senden, die einen TOsP verstehen. Die RC5-Empfangsroutinen für die AVRs lesen meist alle Bits ein und interpretieren die Daten dann als RC5.

Mit den ADCs des tiny13 kann man analoge Geber oder Potis einlesen und die Werte (z.B. 10bit Daten) mit IDs senden. Für Wetterdaten oder als proportionale IR-Fernbedienungen (bis zu 4 Kanäle in einem alten Joystick...).

Wenn man die Bitlängen (jetzt 64/128) ändert, kann man wohl auch eine für RS232 gebräuchliche Baudrate erzeugen und die Daten (mit Start, Stop und Parity) direkt auf ein Terminal oder zu einer Auswertesoftware senden.

Viele Möglichkeiten für so einen unscheinbaren 8-Pinner, oder?

Gruß

mic

X1CR
19.12.2007, 06:39
Hi, Mic

Naja, unscheinbarer 8-Pinner ist nicht ganz richtig!

KnowHow des Programmierers ist wohl die erste Instanz!

Mfg Harry

X1CR
21.12.2007, 11:08
Frohes Fest euch allen!

Mfg
Harry

pizzakurier
29.12.2007, 22:53
Hallo an alle.
Hab mich an den Code von "Radbruch" gehängt, weil ich genau
solche Tinys hier habe und nen kleienen Hand RC5 Sender bauen will.
Hier sollte man natürlich auf Batteriesparen setzen.
Also Tiny13 in Sleep legen.
Mit den richtigen Registern angesteuert auch kein Problem.
Mcucr = &B00110000 'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011000
Gimsk = &B00100000
Gifr = &B00100000

Aber : Wo in dem Code kann ich nen Interrupt auslösen lassen
bzw. in den Code durch den Irq einspringen ? (PcInt0)
Command ändern mit anderer Taste ist ja kein Hexenwerk.
Nur das Schlafen legen..... :-$
Denn mit "Senden_aktiv = 0" wird der Träger munter
weiter gesendet.
Also WO unterbrechen, dass
a: der String fertig gesendet wird, und
b: der µC an der richtigen Stelle wieder aufwacht ?
Eventuell Probleme mit Timer0 ? oder den ASM Code ?

Gruß Pizzakurier

PS: guten Rutsch an alle =D>

radbruch
29.12.2007, 23:37
Hallo pizzakurier

Mit den Sleep-Modi der tinys habe ich noch keine Erfahrungen. Das Erste worüber ich jetzt im Datenblatt (Seite 27) gestolpert bin:


If a reset occurs during sleep mode, the MCU wakes up and executes from the Reset Vector.

Also einfach einen Reset auslösen und alles beginnt von vorne. Das würde wunderbar funktionieren, wenn du nur eine feste Codesequenz senden willst. Ein Taster an Pin1 gegen GND (eventuell noch ein PullUp gegen Vcc) würde den tiny aufwecken und den Code senden lassen.

Nachdem der Code gesendet wurde (wir senden nur einmal) könnte man z.B. hier schlafen gehen:


...
'endlos wiederholen'
$asm
sleep
$end Asm
Goto Label
...

(nur theoretisch, noch nicht getestet)

Gruß

mic

pizzakurier
30.12.2007, 08:08
Hallo pizzakurier

If a reset occurs during sleep mode, the MCU wakes up and executes from the Reset Vector.
Also einfach einen Reset auslösen....
(nur theoretisch, noch nicht getestet)

mic

Genau.
Auf das bin ich noch garnicht gekommen.
Ich kann einen Pinchange-Interrupt als Reset ausführen.
Dann im Index oben die Taste auswählen, gewünschten Command setzen
und wie Du sagtest unten wieder schlafen legen.
Muss mal kucken ob ich nen PCint. als Reset beschalten kann....
Muss ich sofort kucken und testen....

Gruß Pizzakurier \:D/

@EDIT

Bei Einstellungen diesen Code einfügen :


Config Pinb.1 = Output 'ocr0b
Config Pinb.2 = Output 'led
Config Pinb.3 = Input 'taste down
Config Pinb.4 = Input 'taste up
Portb = &B00011000

Enable Interrupts 'enable global ints
On Pcint0 Int
Mcucr = &B00110000 'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011000
Gimsk = &B00100000
Gifr = &B00100000

Direkt unter Label das hier :


Label:

Enable Pcint0
!sleep

und zu guter letzt, das Int-Sub Programm:



$end Asm
Return

Int: 'Wenn Interrupt ausgelöst wird, (Taste gedrückt)
Disable Pcint0 'schalte INT0 ab
Return 'hoch zur Hauptschleife nach Befehl Sleep

Damit wird der komplette RC5 gesendet und schläft dann ein.
Bei mir liegen 2 Taster auf PB3 und PB4 mit jeweils Pullup aktiv.
Jetzt muss ich nur noch die 2 Taster auswerten für verschiedene Befehle :-)

Guten Rutsch an alle BASCOMer (und der Rest natürlich auch :-))
Pizzakurier

pizzakurier
01.01.2008, 12:17
So - Hier nun das Endergebnis :-)

Platine:
http://www.6c33.de/avr/handsender_lang/IMG_0319.JPG

gesamte Schaltung:
http://www.6c33.de/avr/handsender_lang/IMG_0320.JPG

und die Behausung:
http://www.6c33.de/avr/handsender_lang/IMG_0321.JPG

Layout:
http://www.6c33.de/avr/handsender_lang/RC5-Handsender_lang.GIF

Bascom Projekt gibts hier :
http://www.6c33.de/avr/handsender_lang/RC5-Handsender_lang.bas

und für Sprint-Layout 4 das Layout
http://www.6c33.de/avr/handsender_lang/RC5-Handsender_lang.lay
(rechtsklich - Ziel speichern unter)

Viel Spass damit.
Schaltplan brauchts für das hier glaube ich nicht ](*,)

Viele Grüsse und ein gutes neues Jahr 2008

Pizzakurier

radbruch
01.01.2008, 13:32
Hallo pizzakurier

Sehr schön gelöst mit dem Sleep (das @Edit hast du ja recht heimlich angehängt). Verblüffend schlank umgesetzt und natürlich vor dem Senden eingebaut. Super. Und das es auch mit 3V funktioniert hatte ich schon vermutet. Mich würde noch der Wert für den verwendeten Vorwiderstand für die IR-LED interessieren.

Nun haben wir die Basis für alle möglichen kleinen RC5-Anwendungen komplett. Man könnte die Sendecodes noch als #defines im Programmkopf unterbringen und das Ganze noch etwas ordentlicher dokumentieren. Aber das kann auch die Aufgabe für die nachfolgenden Anwender sein.

Noch eine kleine Anregung: Wenn man die zu sendenden Codes im EEProm ablegt, kann man für alle, die nicht in Bascom programmieren, eine fertige Hex-Datei anbieten. Zusammen mit deinem Projekt wäre das ein wohl einen Eintrag im RN-Wiki wert. Das sollten aber die BASCOMer selbst machen, denn für mich war das nur ein "Gastspiel".

Gruß

mic

pizzakurier
01.01.2008, 15:11
Hallo Mic.


Hallo pizzakurier

Sehr schön gelöst mit dem Sleep ...
Man könnte die Sendecodes noch als #defines im Programmkopf unterbringen
Noch eine kleine Anregung: Wenn man die zu sendenden Codes im EEProm ablegt, kann man für alle, die nicht in Bascom programmieren, eine fertige Hex-Datei anbieten. Zusammen mit deinem Projekt wäre das ein wohl einen Eintrag im RN-Wiki wert.

mic

Danke für die Blumen.
Der Vorwiderstand ist für eine LD271 und hat bei mir 47 Ohm.
Ein Wehrmutstropfen bleibt noch : Der RC5 code wird nur ein bis 2x gesendet und der Tiny schläft bei gedrückter Taste ein.
Muss mal probieren, ob ein
"if portb.1=1 and portb.2=1 and portb.4=1 then ..."
vor dem schlafengehen das ganze eventuell das ganze dazu bewegt, dauerhaft bei gedrückter Taste zu senden.
Dann wäre da noch das Toggle-Bit.
Aber das kann man relativ einfach mit dem Befehl "toggle" und einer Bitmaske realisieren. Braucht man für "eigene" Projekte aber kaum :-))
Interessant ist noch die RC5 Emppfangsgeschichte. Muss mal probieren, ob das mit "getrc5" in Basacom mit dem Tiny13 auch geht . ( braucht glaube ich nur Timer0) Er muss ja nicht demodulieren (macht der Tsop)
Die Geschichte mit dem Eeprom hatte ich mir auch schon überlegt.
Wäre Sinnvoll, wenn man z.B. noch ne Uart hätte zum seriell ändern.
Werd aber nu mal das Dauersenden bei Tastendruck probieren.
Melde mich.
Gruß Bernhard.

PS: Hat´s in Stuggitown auch Schnee ?
Heut N8 hats bei uns (Bad Boll) ca. 3cm (hoho) hingeworfen :-))

pizzakurier
01.01.2008, 15:58
Werd aber nu mal das Dauersenden bei Tastendruck probieren.
Sodele.
Dauersenden geht nu.
der Code vor dem Sleep funktioniert.

Label:

If Pinb.1 = 1 And Pinb.2 = 1 And Pinb.3 = 1 And Pinb.4 = 1 Then 'wenn keine Taste gedrückt...
Enable Pcint0 'PcInt einschalten
'gute Nacht :-))
!sleep
End If
Somit sendet der Code dauerhaft, solange eine Taste gedrückt wird.
Bascom-Code im vorigen Thread ist aktualisiert.
Damit bin ich nun endgültig zufrieden.
Der Code hat sehr viel Potential. Zub Bsp, wenn Timer1 durch andere Aufgaben in grösseren Prozessoren belegt ist etc.
Bin auf Antworten gespannt.
Ach ja : Warum kam der Code nicht ein JAhr früher ? :-)
Nun hab ich mich mit nem Tiny2313 rumgeschlagen, hatte das Basiswissen von jetzt über den Sleep Befehl noch nicht und liess den Tiny damals über ein Diodenmatrix auf INT0 bei Tastendruck aufwachen, weil er mit dem PCint nicht mehr aufwachen wollte. Heute weiss ich, dass die Deklaration PCMSK wichtig ist, damit er weiss, auf welche Pin´s er reagieren muss.
Aber hat grad richtig Spass gemacht, meine kleine IR Fernbedienung zu bauen. Endlich haben meine kleinen Tiny13 ein ZuHause =D>

VlG
Bernhard

radbruch
01.01.2008, 16:07
Hallo

Dass man den Code mehrfach senden sollte, hatte ich auch nicht bedacht.

Vielleicht so? (nur theoretisch)

Label:

' vermutlich ist PinB.5 (!reset) high deshalb ist PINB ohne gedrückte Taste wohl 62'


If Pinb = 62 Then 'wenn keine Taste gedrückt
Enable Pcint0 'PcInt einschalten
'gute Nacht :-)) mic: Ob das auch in einer "Condischen" funktioniert weiß ich nicht'
!sleep
Else
Rc5_code.11 = Not Rc5_code.11 'sonst toggle-Bit wechseln und weitersenden
End If

'Bitmaske auf erstes von 14 zu sendende Bits setzen' '
Rc5_bitmaske = &B0010000000000000


und die eigentliche Tastenabfrage in der Pcint0-ISR:

Int: 'Wenn Interrupt ausgelöst wird, (irgendeine Taste gedrückt)
Disable Pcint0 'schalte INT0 ab

If Pinb.1 = 0 Then 'Taste grün
Rc5_code = &B0011010010000001
End If
If Pinb.2 = 0 Then 'Taste rot
Rc5_code = &B0011010010000000
End If
If Pinb.4 = 0 Then 'Taste blau
Rc5_code = &B0011010010000010
End If

Return 'hoch zur Hauptschleife nach Befehl Sleep


Hab's nicht getestet, weil Aufbau eingemottet. Wir haben am Filderrand satte 1cm Neuschnee.

Gruß

mic

[Edit]Ich bin einfach zu langsam. Schön dass es nun endgültig funktioniert

pizzakurier
01.01.2008, 16:22
Hallo Mic.

Hammer dasselbe (ähnlich) gedacht :-)
Mittlerweile ist mein Code von 76% auf 63% geschrumpft.
Hab die ISR wegprogrammiert.
Ich mach das mit dem Interrupt alles oben beim Sleep.


Label:

If Pinb.1 = 1 And Pinb.2 = 1 And Pinb.3 = 1 And Pinb.4 = 1 Then 'wenn keine Taste gedrückt...
Enable Pcint0 'PcInt einschalten
'gute Nacht :-))
!sleep
Disable Pcint0 'PcInt ausschalten

If Pinb.1 = 0 Then 'Taste grün
Rc5_code = &B0011010010000001
End If
If Pinb.2 = 0 Then 'Taste rot
Rc5_code = &B0011010010000000
End If
If Pinb.4 = 0 Then 'Taste blau
Rc5_code = &B0011010010000010
End If

End If
Jetzt hab ich nur noch ein Problem:
Ich hab die Command´s 0,1 und 2.
Wenn ich nun Command 0 drücke, kanns passieren (nicht immer),
dasser beim loslassen den command 1 sendet. ?!?!?!?!???
Solange ich die Taste drücke, bleibt er bei Null.
Jetzt wirds bunt.

Gruß Bernhard.

radbruch
01.01.2008, 16:36
Hallo

Bitte nicht lachen, ist nur ein Verdacht:



'Hier kann man den gewünschten Code eintragen'

Rc5_code = &B0011010010000001

'Testcode: 2 Start, kein Toggle, Adresse 18, Kommando 1'

Vielleicht macht der tiny13 einen Neustart. Zeig doch nochmal das komplette Programm in der aktuellen Version.

Und nochmal mit bedingtem Schlafen und ISR versuchen. Möglicherweise "entprellt" der Aufruf der ISR auch die Taster etwas.

Gruß

mic

pizzakurier
01.01.2008, 17:06
Hallo Mic.

Bin über meine eigene Euphorie gestolpert.
Hatte die Wiederholzeit (100ms) auf 50ms reduziert.
Da hat sich mein Empfänger wohl etwas täuschen lassen.
80ms sind aber wieder ok.
Hier mein letzter aktueller Code:



'RC5-Code senden mit ATtiny13 100% Funktion mit endloser Wiederholung 18.12.07 mic'

'Die IR-LED wird mit Widerstand(!) zwischen Pin5(PB0, OC0A) und GND angeschlossen '
'Trägerfrequenz = 36kHz(Puls/Pause 1:1), Bitlänge = Trägerfrequenz/64'
'Code basierden auf den Angaben von: http://www.sbprojects.com/knowledge/ir/rc5.htm'

'Die Stellen, an denen man den zu sendenden Code und die Wiederholgeschwindigkeit'
'ändern kann, sind mit +++++++++++++++++++++++++++++++++++++++++++++++++ markiert'
'
'Code von mir ( Pizzakurier ) https://www.roboternetz.de/phpBB2/viewtopic.php?t=36253&start=66 geändert.
'Nun können mit 3 Tastern (max.4) verschiedene IR Codes gesendet werden.
'Wenn er fertig gesendet hat, geht der µC schlafen und brauch nur noch weniger als ein µA...
'Batterie ( 2x 1,5V Micro ) hält damit ewig :-))
'Danke an das tolle Forum und vor allem "radbruch" und "x1cr" für die Idee und Code.
'
'Einstellungen -----------------------------------------------------------------'
'Wir verwenden einen tiny13'
$regfile = "ATtiny13.dat"
'der mit internen 9,6MHZ getaktet wird (Fuse Takt/8 nicht gesetzt!)'
$crystal = 9600000
'Weitere, von mir noch nicht geprüfte Compileranweisungen:'
$hwstack = 32
$swstack = 8
$framesize = 16
Config Pinb.0 = Input 'ocr0a (IR-LED)
Config Pinb.1 = Input 'Taste grün
Config Pinb.2 = Input 'Taste rot
Config Pinb.3 = Input 'n/c
Config Pinb.4 = Input 'Taste blau
Portb = &B00011110 'Pullup-Widerstände für Pb.1-4 aktivieren

Mcucr = &B00110000 'Sleepmodus : 00110000 = Powerdown !
Pcmsk = &B00011110 'Maske, welche Pins einen pcint auslösen dürfen (Pinb.1-4)
Gimsk = &B00100000 'GIMSK Bit5 = PinChangeInterrupt eingeschaltet

'Dims --------------------------------------------------------------------------'
'Der zu sendende RC5-Code als 16bit-Wert'
Dim Rc5_code As Word
'Bitmaske für das zu sendende Bit aus RC-Code'
Dim Rc5_bitmaske As Word
'Teiler des Trägertaktes und Kennung des Halbbits'
'0-63 bedeutet erstes Manchester-Halbbit, 64-127 bedeutet zweites Manchester-Halbbit'
Dim Rc5_halbbit As Byte
'größer 0 bedeutet aktuelles zu sendende Bit ist gesetzt'
Dim Rc5_bit_gesetzt As Word
'Sendeflag'
Dim Senden_aktiv As Byte

'Initialisierung ---------------------------------------------------------------'

'Startwerte setzen, es findet noch keine Übertragung statt'
Senden_aktiv = 0

'Timer0 auf CTC-Mode mit OC0APin-Toggeln und OCR0A löschen nach Match bei perscale=1'
Config Timer0 = Timer , Compare A = Toggle , Prescale = 1 , Clear Timer = 1

'MatchCompareRegister setzen: 133 für 36kHz oder 126 für 38kHz'
Ocr0a = 133

'ISR für Timer0 bei Compare0A-Match definieren'
On Oc0a Rc5_isr Nosave

'MatchCompare Interrupt erlauben'
Enable Oc0a

'Interrupts generell erlauben'
Enable Interrupts

'Hauptprogramm -----------------------------------------------------------------'
'+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++'
'14 bits RC5-Code zusammensetzen in der 16 Bit Variablen Rc5_code'
'und Bitmaske auf bit13 (erstes von 14 RC5-Bits) setzen
'Bitnummer: 1111110000000000'
' 5432109876543210'
'Funktion: --sstaaaaacccccc'
'Maske: 0010000000000000'

'+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++'
'Hier kann man den gewünschten Code eintragen'

'Rc5_code = &B0011010010000001
Rc5_code = &B0011000000000000

'Testcode: 2 Start, kein Toggle, Adresse 0, Kommando 0'
'+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++'

Label:

If Pinb.1 = 1 And Pinb.2 = 1 And Pinb.3 = 1 And Pinb.4 = 1 Then 'wenn keine Taste gedrückt...
Enable Pcint0 'PcInt einschalten
'gute Nacht :-))
!sleep
Disable Pcint0 'PcInt ausschalten
End If

If Pinb.1 = 0 Then 'Taste grün
Rc5_code = &B0011010010000001
End If
If Pinb.2 = 0 Then 'Taste rot
Rc5_code = &B0011010010000000
End If
If Pinb.4 = 0 Then 'Taste blau
Rc5_code = &B0011010010000010
End If


'Bitmaske auf erstes von 14 zu sendende Bits setzen' '
Rc5_bitmaske = &B0010000000000000

'Start ist erstes Halbbit'
Rc5_halbbit = 0

'Ab hier übernimmt die ISR die Kontrolle. Wir warten, bis alle Bits gesendet sind'
Senden_aktiv = 1

Do
nop
Loop Until Senden_aktiv = 0

'+++++++++++++++++++++++++++++++++++++++++'
'Kurz warten vor der nächsten Übertragung'

Config Portb.0 = Output
Portb.0 = 1
Waitms 40
Config Portb.0 = Input
Portb.0 = 0
Waitms 80

'Das ist dann die Wiederholgeschwindikeit'
'+++++++++++++++++++++++++++++++++++++++++'

'endlos wiederholen'
Goto Label

'Ab hier folgt die ISR ---------------------------------------------------------'
Rc5_isr:
'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
PUSH R24 ; since we are going to use R24 we better save it
IN r24, SREG ; get content of SREG into R24
PUSH R24 ; we can save a register
$end Asm

'Wenn wir senden wollen'
If Senden_aktiv = 1 Then

'ermitteln wir den Status des aktuellen Bits'
Rc5_bit_gesetzt = Rc5_code And Rc5_bitmaske

'und wenn wir beim Start des ersten Halbbits sind,'
If Rc5_halbbit = 0 Then

'dann geben wir das erste Halbbit invertiert aus. (Manchestercodierung)
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Output
Else
Config Portb.0 = Input
End If
'Ende erstes Halbbit'
End If

'Beim zweiten Halbbit müssen wir nun den gewünschten Bitstatus ausgeben'
If Rc5_halbbit = 64 Then
If Rc5_bit_gesetzt = 0 Then
Config Portb.0 = Input
Else
Config Portb.0 = Output
End If
'Ende zweites Halbbit'
End If

'Bitzeit ist Trägertakt/128 , also wir zählen den Bittimer hoch'
Incr Rc5_halbbit

'Bei RC5_halbbit = 128 ist das aktuelle Bit gesendet, wir senden nun das nächste Bit'
If Rc5_halbbit = 128 Then

'Wir setzen die Bitmaske auf das nächste zu sendende Bit'
Shift Rc5_bitmaske , Right , 1

'und laden den Bittimer mit dem Startwert als Flag für erstes Halbbit.'
Rc5_halbbit = 0

'Ist das letzte Bit gesendet?'
If Rc5_bitmaske = 0 Then

'Dann sind wir fertig. Dies erkennt dann das Hauptprogramm'
Senden_aktiv = 0

'Ende Sendeflag'
End If

'weitersenden bis alle Bits ausgegeben sind'
End If

'und wiederholen bis rc5_bitmaske = 0'
End If

'Code aus der Basom-Hilfe on interrupt isr nosave'
$asm
POP R24 ;get content of SREG
Out Sreg , R24 ; Save Into Sreg
POP R24 ; get r24 back
$end Asm

Return

End 'end program


Das Prellen dürfte nicht stören, denn wenn der code erst mal gesetzt ist, ändert sich dieser nicht mehr beim prellen.
Erst mit anderer Taste wird der code neu "gesetzt".


Gruß Bernhard

radbruch
01.01.2008, 19:52
Hallo Bernhard

Dann dürfte dies nun die offizielle und funktionierende Version sein. Prima Ergebniss.

Die Wiederholfrequenz hatte ich auch im Verdacht (bei dir nun 40+80, laut Doku (http://www.sbprojects.com/knowledge/ir/rc5.htm): "As long as a key remains down the message will be repeated every 114ms."), aber dann hätte ich Probleme beim Drücken und nicht beim Loslassen erwartet. Aber egal, wenn's funzt dann gut. Viel Spaß mit deiner beneidenswert hübschen Fernbedienung.

(btw: Den nächsten Satz hatte ich bisher überlesen: "The toggle bit will retain the same logical level during all of these repeated messages." Bedeutet also, nur toggeln, wenn Taste erneut gedrückt wurde. Das ist dann oben bei meinem letzten Vorschlag nicht richtig)

Gruß

mic

X1CR
03.01.2008, 08:09
Guten Morgen Jungs,

Also, ich als Auslöser dieses Themas bin begeistert von dem Ergebniss!

Aber warum hat sich damit noch nicht früher jemand beschäftigt....?

Also ich denke das so mancher nun auf den 2313 verzichtet und alles ein bisschen kleiner baut!

Leider bin ich noch nicht dazu gekommen Sender in mein Auto einzubauen und der USB Empfänger ist auch noch nicht gebaut.

Einzige Lösung wäre weniger zu arbeiten oder den Tag zu verlängern.

Der einzige Wehrmutstropfen.... die Teile hab ich schon, nun fehlt nur noch die Umsetzung.

Mfg
Harry