Hallo,
ich habe hier eine kleine Schaltung mit dem Attiny 2313.
Genauer gesagt handelt es sich um die 8 Kanal IR Fernbedienungsschaltung
von Pollin (v1.1).
Nachdem ich den Attiny 2313 gewechselt und mit einer modifzierten
Quellcode beschrieben habe, was auch soweit funktioniert, steh ich aber
noch vor einem Problem.
die Frage ist:
Wie kann ich es anstellen, dass wenn ich Taste 1 drücke - Relais 1 zieht
und gezogen bleibt bis ich zB. Taste 3 oder 2 oder 8 usw. drücke und
dann das entsprechende Relais der zuletzt gedrückten Taste gezogen
bleibt während das von Taste 1 wieder abfällt. (es muß also beliebig
schaltbar sein, unabhängig von der Reihenfolge der jeweils gedrückten
Tasten)
Ich möchte also keinen Toggelbetrieb oder Repeatbetrieb und auch keinen
Impulsbetrieb (wie er derzeit in der schaltparameter.inc eingestellt
ist)sondern sich gegenseitig entriegelnde Ausgänge an PortB.
Da ich zugegebenermassen ein blutiger Anfänger in Sachen AVR bin,
bräuchte ich hier wirklich weiterführende Hilfe in Form von konkreten
Lösungsansätzen.
Die Frage ist, läßt sich das ohne Weiteres mit der Software lösen oder
brauchts dafür eine Zusatzbeschaltung an den Ports ala FlipFlop oä und
wenn ja, wie müßte das aussehen.
Vieleicht habt ihr ja einen Schaltungsvorschlag bzw. einen Vorschlag wie
der Quellcode zu ändern ist, würde mich freuen.
achja, ich benutze das AVR Studio 4 (Freeversion) und einen Multiprog
2003XXL in Verbindung mit PonyProg V.2.0.7
für jemanden der sich auskennt sicher eine hilfreiche Antwort.
Im Moment kann ich damit nicht wirklich viel anfangen.
Ich kann in den vorhandenen Dateien diesen Eintrag nicht finden.
ich hab ne *.hex, eine *.asm, die deklara.inc und die
schaltparameter.inc
wie gesagt, ich bin momentan noch nicht auf dem Wissenstand um solche
kurzen Antworten ohne größere Erklärung wirklich auswerten zu können -
aber ich bemüh mich....
Hi
Na ja, dann will auch ich mal einen konkreten Lösungsansatz schreiben:
Du kaufst zusätzlich ein Relais und eine Diode. Auch einen Transistor.
Die Schaltung findest du sicherlich in irgendeinem Tutorial. Dann nimmst
du dein modifiziertes Programm und setzt das Port-Bit, wenn du eine
Taste drückst. Drückst du eine andere, dann löscht du das Portbit. Ist
doch ganz einfach. Und in Zeile 48 mußt du aufpassen, das die
freigesetzten Elektronen nicht den Worbantrieb stören oder den
Fluxkompensator auslösen.
Mal im Ernst, du schreibst uns, das du bei Pollin etwas gekauft hast.
Das ist schön, für Pollin, denn damit verdient er sein Geld und für
dich, denn nun hast du was zum basteln. Dann schreibst du uns, das du
das Programm modifiziert hast. Auch das ist schön für dich, dabei hast
du sicherlich etwas gelernt. Aber dann die Aufforderung an uns, konkrete
Lösungsansätze zu liefern ist schon fast unverfroren. Wenn du mal Zeit
hast, dann besuch mich, setz dich vor meinen PC und beantworte deinen
Thread. Wenn du Hilfe willst, dann ist es schon wichtig, Informationen
zu liefern. z.B. in welcher Sprache du zuhause bist und wie weit deine
Kenntnisse um die Hardware reichen. Auch nicht schlecht ist ein
Quellcode, wenn du schon etwas modifiziert hast, damit man dann gezielt
ansetzen kann.
Gruß oldmax
Ach ja, das muß ich noch los werden. Erwarte nicht, das wir uns nun alle
bei Pollin diese Fernsteuerung kaufen und diese studieren, damit wir dir
sagen, wie du damit Relais schaltest. Wie bereits gesagt, du willst
etwas damit machen und da ist es an dir auch die erforderliche
Information ´zu liefern, wenn du Hilfe brauchst. So wie es aussieht,
gibt es ein Assemblerlisting. Das ist die Datei mit der Endung ".ASM"
Schau dir diese erst einmal im AVR Studio an und suche die Stellen, wo
du die Ports einliest (In <Register>, <Port>). Das wär dann schon mal
ein Hinweis, wo deine Tastenwerte landen. Vielleicht hast du glück, und
du findest einen Ausgang für eine LED bspw. (Out <Port>, <Register>)
Nun ist es dann angebracht, sich hier in die Tutorials einzulesen. Da
gibt es dann sicherlich Hinweise, die du ausprobieren kannst.
Gruß oldmax
@oldmax
zunächstmal war die Frage nicht wie ein Relais mit nem Tiny angesteuert
werden kann, denn soweit reichen meine Kenntnisse.
µC ist für mich allerdings Neuland.
Der Satz das konkrete Lösungsansätze gewünscht sind bezieht sich
vornehmlich auf genau solche Kommentare oder besser gesagt auf die
Vermeidung Selbiger, wie du sie hier abgegeben hast.
Ich wende mich an die User in einem Forum weil ich Hilfe brauche und auf
die Erfahrung dieser Leute setze und nicht weil ich dumm angesülzt
werden will.
In einer "Sprache" bin ich momentan noch garnicht zu Hause, da wie schon
erwähnt, diese Materie Neuland für mich ist.
Soweit zu deinem ersten Kommentar.
Der Zweite war da schon etwas hilfreicher.
Um weitere Infos zu liefern - und mit dem Vorschlag hast du durchaus
recht - hier die org. Assembler Datei.
1
*/
2
.include "tn2313def.inc" ;Namen benannter Bytes und Bits bekannt machen
3
.include "deklara.inc" ;Konstanten und Variablen
4
5
;Beginn des Programmspeichers, reservierte Adressen für Reset und Interrupts:
6
.cseg ;Programmspeicher
7
.org 0 ;ab Adresse 0
8
rjmp RESET ;Reset Handler
9
rjmp exti0 ;External Interrupt0 Handler
10
rjmp nix;INT1 ;External Interrupt1 Handler
11
rjmp nix;TIM1_CAPT ;Timer1 Capture Handler
12
rjmp TIM1_COMPA ;Timer1 CompareA Handler
13
rjmp nix;TIM1_OVF ;Timer1 Overflow Handler
14
rjmp nix;TIM0_OVF ;Timer0 Overflow Handler
15
rjmp nix;USART0_RXC ;USART0 RX Complete Handler
16
rjmp nix;USART0_DRE ;USART0,UDR Empty Handler
17
rjmp nix;USART0_TXC ;USART0 TX Complete Handler
18
rjmp nix;ANA_COMP ;Analog Comparator Handler
19
rjmp nix;PCINT ;Pin Change Interrupt
20
rjmp TIM1_COMPB ;Timer1 Compare B Handler
21
rjmp nix;TIMER0_COMPA ;Timer0 Compare A Handler
22
rjmp nix;TIMER0_COMPB ;Timer0 Compare B Handler
23
rjmp nix;USI_START ;USI Start Handler
24
rjmp nix;USI_OVERFLOW ;USI Overflow Handler
25
rjmp nix;EE_READY ;EEPROM Ready Handler
26
rjmp nix;WDT_OVERFLOW ;Watchdog Overflow Handler
27
28
nix: ;eine Falle für unerlaubte Interrupts (Prog-Fehler)
Hi
Und jetzt erwartest du, das ich mir die Zeit nehme, den Code bearbeite
und dir genau sage, wo du ansetzen sollst. Dazu nochmal ein Zitat:
>und auf die Erfahrung dieser Leute setze und nicht weil ich dumm >angesülzt
werden will.
Warum wirst du denn dumm angesülzt ? Es ist die Art, wie du hier im
Forum auftrittst. Du willst Hilfe, nicht ich oder ein anderer
hilfsbereiter Experte. Und so solltest du ein wenig dem folgen, was dir
emfohlen wird. Auch dazu ein Zitat:
>Schau dir diese erst einmal im AVR Studio an und suche die Stellen, wo>du die Ports einliest (In <Register>, <Port>). Das wär dann schon mal>ein Hinweis, wo deine Tastenwerte landen.
Was machst du ? Du stellst hier den kompletten Code rein so nach dem
Motto: "Sucht mal fleißig"
Der Code ist doch prima kommentiert. Lesen und verstehen ist dein Bier,
nicht meines.
trotzdem, eine kleine Hilfe geb ich dir mal:
1
.cseg ;Programmspeicher
2
.org 0 ;ab Adresse 0
3
rjmp RESET ;Reset Handler
4
rjmp exti0 ;External Interrupt0 Handler
5
rjmp nix;INT1 ;External Interrupt1 Handler
6
rjmp nix;TIM1_CAPT ;Timer1 Capture Handler
7
rjmp TIM1_COMPA ;Timer1 CompareA Handler
8
rjmp nix;TIM1_OVF ;Timer1 Overflow Handler
9
rjmp nix;TIM0_OVF ;Timer0 Overflow Handler
10
rjmp nix;USART0_RXC ;USART0 RX Complete Handler
11
rjmp nix;USART0_DRE ;USART0,UDR Empty Handler
12
rjmp nix;USART0_TXC ;USART0 TX Complete Handler
13
rjmp nix;ANA_COMP ;Analog Comparator Handler
14
rjmp nix;PCINT ;Pin Change Interrupt
15
rjmp TIM1_COMPB ;Timer1 Compare B Handler
16
rjmp nix;TIMER0_COMPA ;Timer0 Compare A Handler
17
rjmp nix;TIMER0_COMPB ;Timer0 Compare B Handler
18
rjmp nix;USI_START ;USI Start Handler
19
rjmp nix;USI_OVERFLOW ;USI Overflow Handler
20
rjmp nix;EE_READY ;EEPROM Ready Handler
21
rjmp nix;WDT_OVERFLOW ;Watchdog Overflow Handler
22
23
nix: ;eine Falle für unerlaubte Interrupts (Prog-Fehler)
24
rjmp nix ;Falle...
25
; reti ;zurück...
Überall, wo "rjmp nix" steht, ist ein Interrupt, der nicht vorgesehen
ist und der den Controller in einen "unbedienbaren Zustand" setzt.
Eigentlich kannst du das auch gleich vergessen, denn dich interessieren
andere Interrupts, z.B. "rjmp exti0". Dieser Interrupt taucht auf, wenn
eine Taste betätigt wird und du landest bei:
1
exti0: ;ISR, externer Interrupt, Impuls vom TSOP1736
2
in srsk,sreg ;PSW sichern
3
in it3,tcnt1l ;Zeitstempel
4
in it4,tcnt1h ;holen
5
mov it1,it3 ;und
6
mov it2,it4 ;kopieren
7
sub it1,zsl ;Impulsbreite (Differenz neu-alt)
8
sbc it2,zsh ;berechnen
9
mov ibl,it1 ;und
10
mov ibh,it2 ;sichern
11
mov zsl,it3 ;Zeitstempel dieses Interrupts
12
mov zsh,it4 ;als Impulsbeginn merken
13
cpi status,17 ;relevanter Teil das Telegramms fertig?
14
brlo exti00 ;nein, weiter...
15
rjmp exti0_15plus ;ja, separat behandeln...
16
exti00: ;Telegramm ist noch nicht fertig
17
; usw
So, nun kannst du dich auch mal selbst ein wenig mit dem Programm
auseinander setzen. Interessant ist vielleicht noch die Initialisierung,
u. A.
1
ldi wl,$ff ;alle Pins von
2
out porta,null ;L-Pegel an PortA
3
out portb,null ;L-Pegel an PortB
4
out ddra,wl ;PortA als Ausgang
5
out ddrb,wl ;PortB als Ausgang
Für eine Ausgabe an ein Relais suchst du dir einen freien Portpinvon
Port a oder B. Ach ja, da hilft ein Blick in das Datenblatt, falls du es
noch nicht hast. Kannst du über Google finden.
So, mehr Zeit hab ich erst mal nicht.
Gruß oldmax
Wie geht man beispielsweise vor?
Erst mal, und das ist ganz wichtig, keine Angst.
Repekt - ja. Neugier - ja. Aber Angst - nein.
Auch der größte und längste Code ist analysierbar. Es dauert ein wenig
aber im Endeffekt lernt man mit der Herausforderung. Hier schlagen doch
eh immer wieder im Forum Typen auf, die sich Projekte suchen, die 10
Schuhnummern zu groß und zu schwer für sie sind, und die auf die
Aufforderung doch mit etwas einfacherem anzufangen, immer kommen mit
'Aber ich will das doch lernen und ausserdem wächst man mit der
Herausforderung'. Ich bin zwar nicht ihrer Meinung (denn sonst müssten
sie nicht hier im Forum fragen) aber diesmal kannst du sie dir
ausnahmsweise zum Vorbild nehmen.
OK. Genug Vorgeplänkel.
Was wissen wir.
In dem Programm geht es um 2 Themenkreise. Da ist auf der einen Seite
ein Programmteil mit Infrarot-Empang samt Decodierung. Und auf der
anderen Seite werden Ausgänge angesteuert. Der Infrarot-Teil
interessiert uns nicht. Wir suchen den Relais Teil.
Nachdem das klar ist, fangen wir einfach mal an.
Programme folgen einem generellen Muster
Am Anfang erfolgt ein Sprung in die Initialisierung, in der die Hardware
eingestellt wird, Dinge initialisiert werden und alles vorbereitet wird.
Der Sprung steht ganz am Anfang
1
rjmp RESET ;Reset Handler
also suchen wir mal, wo RESET ist.
1
reset: ;Initialisierung
2
clr null ;immer 0
3
ldi wl,1<<clkpce ;Schreibschutz Taktvorteiler
4
out clkpr,wl ;aufheben
5
...
was da genau alles passiert, soll uns momentan nicht weiter kümmern. Wir
verfolgen den Code weiter nach unten und stossen auf
das ist aber nett vom Original-Programmierer, dass er die obligate
Hauptschleife auch 'mainloop' genannt hat. Damit wissen wir: hier ist
das Herz des Programms - die Steuerzentrale. Die Drehscheibe, von der
alles ausgeht.
Jetzt studieren wir mal ein wenig die Kommentare in der Hoffnung, dass
sie nicht allzu falsch sind. Da steht 'neues Telegramm eingetroffen?' -
'ja, abarbeiten' Das klingt doch schon mal nicht schlecht. Das klingt
genau nach dem was wir suchen um den Fuss in die Tür zu bekommen. Mit
'Neues Telegram' wird wohl das Infrarot-Telegram gemeint sein, welches
die Fernsteuerung losschickt, wenn man eine Taste drückt. Na und was
wird wohl abarbeiten sein? Genau - das könnte was mit den Relais zu tun
haben.
Da wird also ein Sprung nach 'job_neues_byte' gemacht.
Na dann sehen wir doch mal dort nach
1
job_neues_byte: ;es ist ein neues Byte eingetroffen
2
cbr flags,1<<neubyte ;Jobflag entwerten
3
ldi yl,low(toz-1) ;Pointer vor Timeout-Zähler
4
ldi yh,high(toz-1) ;im SRAM
5
ldi zl,low(bimu*2-5) ;Pointer 5 vor Bitmust
6
...
und auch da verschaffen wir uns erst mal einen ersten Überblick, in dem
wir die Kommentare lesen. Tun wir das, dann stossen wir nach einigen
Zeilen auf etwas interessantes.
1
...
2
;Tastencode wurde in Tabelle gefunden
3
lpm wh,z+ ;Mode-Bits holen
4
lpm wl,z+ ;Schaltzeit holen
5
lpm r0,z+ ;Bitmuster PortA holen
6
sbrs wh,toggel ;hat dieser Portpin Toggelmode? - ja...
7
rjmp job_neues_byte2 ;nein, weiter...
8
;dieser Schaltbefehl hat Toggelmode
9
brts job_neues_byte_e ;ja, Repeat-Bit im empfangenen Byte? - ja...
10
;es ist das erste Byte des Telegramms
11
in r1,porta ;Port einlesen,
12
eor r1,r0 ;Bit toggeln
13
out porta,r1 ;und zurückschreiben
14
lpm r0,z+ ;Bitmuster PortB holen
15
in r1,portb ;Port einlesen,
16
eor r1,r0 ;Bit toggeln
17
out portb,r1 ;und zurückschreiben
18
lpm r0,z+ ;Bitmuster PortD holen
19
in r1,portd ;Port einlesen,
20
eor r1,r0 ;Bit toggeln
21
out portd,r1 ;und zurückschreiben
22
rjmp job_neues_byte_e ;fertig...
Da ist bereits von den Ports die Rede und das Pins getoggelt werden.
Sieht man sich den Code an, dann stösst man auf die Sequenz
1
...
2
in r1,porta ;Port einlesen,
3
eor r1,r0 ;Bit toggeln
4
out porta,r1 ;und zurückschreiben
5
...
und das ist eigentlich schon recht eindeutig. Da wird der Zustand vom
Port A gelesen, ein oder mehrere Bit, welche offenbar in r0 stehen
werden rein-ge-xodert (und damit getoggelt) und das Ergebnis geht wieder
an den Port A.
Heureka: Das ist die Stelle an der die Relais getoggelt werden! Hier ist
dein Angriffspunkt und hier kannst du eingreifen. Jetzt analysierst du
noch, wie r0 zu seinem Wert kommt (das ist nicht wirklich schwer) und
wie da ganz offensichtlich der Zusammenhang mit den Spalten A, B, D in
ist, und du hast deinen Fuss soweit in der Tür, dass du anfangen kannst,
das Programm zu modifizieren und an deine Bedürfnisse anzupassen.
Und das ganze war gar nicht mal so schwer zu finden, wenn man nicht
dasteht wie das Kaninchen vor der Schlange und sich vor dem scheinbaren
vielem Code in die Hose macht.
Karl Heinz Buchegger schrieb:> Erst mal, und das ist ganz wichtig, keine Angst. Repekt - ja. Neugier - ja. >
Aber Angst - nein.
Der hat doch keine Angst, der ist einfach faul.
Electronics'nStuff schrieb:> Karl Heinz Buchegger schrieb:>> Erst mal, und das ist ganz wichtig, keine Angst. Repekt - ja. Neugier - ja. >> Aber Angst - nein.>> Der hat doch keine Angst, der ist einfach faul.
In dubio ....
:-)
(Ich weiß schon, dass er einen Dummen sucht, der ihm die Anpassung
macht. Ich mach sie ihm nicht. Denn ich bin der Meinung, dass jemand der
gerade mal mit Nagelschere und -Feile umgehen kann, nicht versuchen
sollte ein Schrott-Auto wieder flott zu machen. Aber den Tip, wie er die
Spur kontrollieren kann, und das er den Rahmen auf einer Streckbank
ausrichten muss, den kriegt er)