Sie sind nicht angemeldet.

1

Freitag, 22. Mai 2020, 12:08

ATtiny13A: HESUNSE (CY800) Funksteckdosenprotokoll auswerten

Hallo zusammen,

ich war auf der Suche nach einer günstigen Funksteckdosenfernbedienung mit 4 Empfängern. Ein Empfänger in Reserve ist ja auch nicht schlecht, deshalb hab ich mich für dies entschieden :

Hesunse 2/3/4/5 Ways Digital RF Wireless Remote Control Switch 220V Receivers:

https://www.youtube.com/watch?v=n7p5oDoknxA

Blöderweise gibt es zwei Dinge die mich stören.

1. Beim Anlegen der Spannung schalten die Empfänger
2. Es ist ein Relais mit Schließer verbaut.



Das erste Problem ist zwar störend, da ich erstmal alle nicht benötigten Empfänger ausschalten könnte, aber ich benötige ein Wechsler-Relais.
Also fing ich an dass Ganze auf Umbaumöglichkeiten hin zu untersuchen.




















Ein Wechsler-Relais einzubauen, war mir zu gefährlich, da der Kontakt zu nahe an den 24V war.
Wäre eigentlich egal, da dass ganze eh nicht galvanisch getrennt ist.
Da dachte ich mir, dass ich selber eine Platine entwickle die dann auch nicht sofort beim Anlegen der Spannung schaltet. Also ging es erstmal darum überhaupt herauszufinden wie das Ganze funktioniert. Geholfen hat mir dabei in erster Linie diese Seite :

http://avr.börke.de/Funksteckdosen.htm

Mit meinen ersten Fragen startete ich in diesem Forum :

https://www.mikrocontroller.net/topic/487338#6099487

und wechselte dann lieber hierhin, da mir dort besser geholfen wurde :

https://www.roboternetz.de/community/thr…ll=1#post659655

Der Code ist in AVR8ASM im Atmel Studio 7 ( AS7 ) geschrieben und daher nicht jedermans Sache. Ich selber konnte auch nur mit der Hilfe eines PAP's ( Programmablaufplanes ) noch einigermaßen durchblicken, was ich da fabriziert habe.


















Hier mal ein Ausschnitt und die Quelle des verwendeten kostenlosen PAP-Designers :





https://www.heise.de/download/product/papdesigner-51889


So, jetzt ist erstmal genung.


_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

2

Montag, 25. Mai 2020, 10:49

Empängermodul CY800 ( ? ) und Amplituden Shift Keying ( ASK ) bzw. ON-OFF-Keying ( OOK )

Die Recherchen ergaben, dass es sich bei dem Empfänger vermutlich um den Baustein CY800 handelt, der mit einem 6,7458Mhz Quarz betrieben wird.

















Der Sender sendet vermutlich per Amplituden Shift Keying ( ASK ) bzw. ON-OFF-Keying ( OOK ).




Am Data-Pin des Moduls ( IN/Data ) ist auf jedenfall ohne dass eine Taste gedrückt wurde, folgendes Signal zu sehen gewesen. Das Monoflop-Signal erstmal nicht beachten :



Meine nächtse Idee war, wenn ich es schon neu mache, dass es auch stromsparend für einen evtl. Batteriebetrieb sein sollte. Aus dem stromsparensten Mode des ATtiny13A, dem PowerDown, kommt man außer mit den verschiedenen Resets, mit dem Pin Change Interrupt ( PCINT0 ), dem Level Interrupt ( INT0 ) oder dem Watchdog Interrupt ( WDT ) heraus. Ich entschied mich für den PCINT0, da der INT0 für die Erkennung der steigenden Flanke der Datenelemente benötigt wird. Damit der µC nicht ständig durch den PCINT0 aus seinem Tiefschlaf gerissen wird, habe ich ein retriggerbares Monoflop ( CD4538B ) eingebaut und dadurch kann der µC so lange schlafen, bis er vom Monoflop ( MF ), welches nun nicht mehr nachgetrigert wird, durch die fallende Flanke am PCINT0-Pin geweckt wird. Tiefer in die Analen des Stromsparens bin ich nicht eingedrungen, da dass ganze Projekt viel, viel länger dauerte als mir lieb war und ich es für dieses Projekt gar nicht brauche.

Wenn zum Beispiel die Taste A auf der Fernbedienung gedrückt wird, sieht dass Ganze dann so im Logic Analyser ( LA ) aus :

Die deutlich zu erkennenden Lücken zwischen den Paketen, nutze ich als Erkennung dass der Anfang eines Datenpaketes bevorsteht und der µC dadurch so lange schlafen kann, bis er vom Monoflop ( MF ), welches nun nicht mehr nachgetrigert wird, durch die fallende Flanke am PCINT0-Pin geweckt wird.

Dekodiert sieht dass Ganze dann so aus:



Und ein Datenpaket im Detail so :

Es sind 3 verschiedene Datenelemente ( 0, 1, f ) und ein Synchronisierimpuls ( Sync ) zu erkennen. Auch zu sehen ist dass so ein Datenpaket aus 12 Datenelementen besteht. Eine 0 wird durch zwei mal 1/4 High und 3/4 Low gekennzeichnet. Eine 1 durch zwei mal 3/4 High und 1/4 Low und dass f durch eine Kombination der beiden ( 0 & 1 ). Ein mal 1/4 High und 3/4 Low, sowie ein mal 3/4 High und 1/4 Low. Der Synchronisierungsimpuls besteht aus ein mal High und einunddreißig mal Low. Dies sind die idealen Werte. Ich habe also überlegt, wie ich dies nun verarbeiten soll. Meine Idee war es nach jeder steigenden Flanke eines Datenelementes die eingetragene Zeit zu nehmen ( wieder als ideal anzusehen ) und als Einlesezeitpunkt zu gebrauchen. Somit kam ich darauf 24 Abtastungen zu machen, da jeweils ein Datenelement aus zwei " Bits " besteht.
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

3

Mittwoch, 27. Mai 2020, 15:46

Anfang der Programmumsetzung

Zu Beginn erfolgt die Intialsierungsprozedur, wo unter anderem, alles vorbereitet wird damit der µC zuerst in den SLEEP-Mode -> PowerDown geht und durch den PCINT0-IRQ, den das regtriggerbare MF erzeugt, aus diesem geweckt werden kann. Um einen Kompromiss zwischen stromsparen und schnell genug reagieren zu können, wird für die INT0-IRQ Initialisierung, der Systemtakt auf nominal 600kHz eingestellt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
;
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
;I Erstinitialisierungen
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
;
_reset:
;
;Systemtakt ( 4,8MHz ) durch 8 teilen ( 600kHz = 1,666µs )
;
 ldi  a,1<<CLKPCE           ;Im Clock Prescaler Register Bit..
 out  CLKPR,a               ;..Clock Prescaler Change Enable setzen..
 ldi  a,1<<CLKPS1|1<<CLKPS0 ;..und CLKPS[3:0] loeschen (Sicherheitsprozedur)..
 out  CLKPR,a               ;..nun mit CLKPCE=0 und CLKPS[3:0] SYS-Takt aendern
;
;Stapelzeiger initialisieren (fuer Unterprogramme und / oder Interrupts)
;
 ;ldi  a,High(RAMEND)        ;RAMEND, also das Ende vom SRAM, ist in der.. 
 ;out  SPH,a                 ;..Definitions-datei festgelegt  
 ldi  a,Low (RAMEND)        ;Hier reicht ein Byte, weil das...
 out  SPL,a                 ;...SRAM nur 64Byte gross ist
;
;Variablen initialisieren ( r0-r31 haben unbestimmten Inhalt )
;
 clr  flag_reg              ;Allgemeines Flaggenregister loeschen
;
;Die drei Bytes des CY800-Protokolls loeschen
;
 clr  byte_2                ;Die 3..
 clr  byte_1                ;..Bytes..
 clr  byte_0                ;..loeschen
;
;Bitzaehler auf 24 Bits einstellen
;
 ldi  bit_zlr,#bit_zlr     ;Wert f. Bitzaehler laden..
;
;Codeadresse fuer Taste A laden
;
 ldi  zh,high(_code*2)      ;Z-Zeiger mit Vergleichscode-Adresse..
 ldi  zl,low (_code*2)      ;..laden
;
;Vergleichszaehler f. 3x hintereinander gueltigen Code 
;
 ldi  a,#vergleichs_zlr     ;..Vergleichszaehler..
 mov  vergleichs_zlr,a      ;..laden
;
;Sleep-Mode -> Power Down gewuenscht
; 
 sbr  flag_reg,1<<pdm       ;Power-Down-Mode FLAG setzen
;
;Ports Erstkonfiguration
; 
 sbi   DDRB,led.pla			;PORT-Bit als Ausgang f. PLA-LED
 sbi   DDRB,led.ora			;PORT-Bit als Ausgang f. SLEEP-LED
 sbi   DDRB,led.ge          ;PORT-Bit als Ausgang f. TEST-LED

 sbi   LED_PORT,led.ora     ;LED-Orange ausschalten
;
;PCINT0-IRQ einrichten
;
 in   a,PCMSK               ;Pin Change Mask Register laden..
 sbr  a,1<<PCINT0           ;..den Pin Change Enable Mask 1..
 out  PCMSK,a               ;..auswaehlen
 in   a,GIMSK               ;General Interrupt Mask Register laden..
 sbr  a,1<<PCIE             ;..Pin Change Interrupt Enable Bit setzen..
 out  GIMSK,a               ;..und somit den PCI1-IRQigeben
 ldi  a,1<<PCIF             ;Pin Change Interrupt Flag im..          
 out  GIFR,a                ;..General Interrupt Flag Register laden loeschen
 sei                        ;Alle programmierbaren Interrupts freigeben


Die Hauptprogrammschleife ( _main: ), besteht praktisch nur darin, zu unterscheiten, ob der der µC in den PowerDown,- oder ILDE-Mode versetzt werden soll. Die LED-Orange ist praktisch der Ausgang und wurde hier Testweise benutzt, um anzuzeigen, wenn in einem der SLEEP-Modes eingetreten wurde.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
;
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
;H Hauptprogrammschleife
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
;
_main:
 ;
 ;SLEEP-Mode ausschalten und auf Werkseinstellung setzen
 ;
 in   a,MCUCR				;MCU Control Register laden und..
 cbr  a,1<<SE|1<<SM1|1<<SM0	;..auf Werkseinstellung..
 out  MCUCR,a				;..setzen
;
;Pruefen welcher Sleep-Mode drann ist
; 
 sbrs flag_reg,pdm		    ;Power-Down-Mode erwuenscht?
 rjmp _idle 				;Nein -> µC in IDLE-Mode versetzen
;
;SLEEP-MODE -> Power Down
;

 ;cbi  PORTB,led.ora         ;LED-Orange einschalten T E S T Z W E C K E ###########################
 ;sbi  PORTB,led.ora         ;LED-Orange ausschalten T E S T Z W E C K E ###########################
 ;cbi  PORTB,led.ora         ;LED-Orange einschalten T E S T Z W E C K E ###########################

 in   a,MCUCR				;MCU Control Register laden..
 sbr  a,1<<SE|1<<SM1	    ;..Power-Down-Mode und Sleep Enable vorbereiten..
 out  MCUCR,a				;..und freigeben
 sleep						;µC in den Schlaf-Modus versetzen
 
 rjmp _main                 ;Arbeitsschleife ausfuehren
;
;SLEEP-MODE -> IDLE
;
_idle: 
 
 ;sbi  PORTB,led.ora		 ;LED Orange ausschalten T E S T Z W E C K E ###########################
 ;cbi  PORTB,led.ora         ;LED-Orange einschalten T E S T Z W E C K E ###########################
 ;sbi  PORTB,led.ora         ;LED-Orange ausschalten T E S T Z W E C K E ###########################

 in   a,MCUCR				;MCU Control Register laden(IDLE ist vorgegeben)..
 sbr  a,1<<SE		        ;..Sleep Enable vorbereiten..
 out  MCUCR,a				;..und freigeben
 sleep
 
 rjmp _main                 ;Arbeitsschleife ausfuehren


Im Pin Change Interrupt0 ( PCIN0 ) wird dieser erstmal gesperrt, angezeigt dass der SLEEP-Mode in IDLE geändert werden soll, weil der in dieser Routine initialisierte INT0-IRQ mit seiner steigenden Flanke, den µC nicht mehr aus dem PowerDown holen kann.
Jetzt kann auch der Systemtakt heruntergeteilt werden ( spart Strom ), da ja eh nach jeder steigenden Flanke zu Beginn eines jeden Datenelementes, ideal gesehen 550µs vergehen müssen, bis der dann vorliegende Signalpegel im Timer/Counter0 Overflow Interrupt eingelesen wird. Hier wird auch schon mal die Zeit für den später in der INT0-ISR inititalierten Timer/Counter0 Interruppt eingestellt, die die Hauptarbeit macht und erst im nächsten Posting besprochen wird.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
;
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
; PIN CHANGE INTERRUPT 0
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
;
_PCI0addr:
 
 ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.ge       ;LED-Gelb ausschalten T E S T Z W E C K E #############################
 ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.ge       ;LED-Gelb ausschalten T E S T Z W E C K E #############################
   
 in   s_sreg,SREG           ;CPU-Statusregister sichern 
;
;PCINT0 Interrupt sperren
; 
 in   ia,GIMSK				;General Interrupt Masken Register laden und..
 cbr  ia,1<<PCIE 			;..Pin Change Interruput 0 Freigabebit loeschen..
 out  GIMSK,ia				;..und somit die PCI0-IRQ sperren
; 
;Power-Down-Mode sperren
;
 cbr  flag_reg,1<<pdm       ;Power-Down-Mode FLAG loeschen
;
;INT0 Interrupt auf steigende Flanke einstellen
;
 in   ia,MCUCR              ;MCU Control Register laden..
 sbr  ia,1<<ISC01|1<<ISC00  ;..die steigende Flanke einstellen und dies..
 out  MCUCR,ia              ;..nun uebernehmen, nun dass..
 in   ia,GIMSK              ;..General Interrupt Mask Register  laden, dort..
 sbr  ia,1<<INT0            ;..dass External Interrupt Request 0 Enable bit..
 out  GIMSK,ia              ;..setzen und somit den INT0-IRQ freigeben..
 ldi  ia,1<<INTF0           ;..Nun dass External Interrupt Flag 0 Bit..
 out  GIFR,ia               ;..im General Interrupt Flag Register loeschen
;
;Systemtakt ( 4,8MHz ) durch 16 teilen ( 300kHz = 3,333µs )
;
 ldi  ia,1<<CLKPCE           ;Im Clock Prescaler Register Bit..
 out  CLKPR,ia               ;..Clock Prescaler Change Enable setzen..
 ldi  ia,1<<CLKPS2           ;..Sicherheitsprozedur nun mit CLKPCE=0 und
 out  CLKPR,ia               ;..CLKPS[3:0] SYS-Takt aendern, abschliessen
;
;Timer/Counter0 Zaehlregister fuer die Biterfassung einstellen
; 
 ldi  ia,$FF-#top           ;Wert f. TOV0-IRQ ( Normal- Mode )..
 out  TCNT0,ia              ;..ins Timer/Counter0 Zaehlregister laden

_exit_PCI0addr:
 out  SREG,s_sreg           ;Statusregister restaurieren

 ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.ge       ;LED-Gelb ausschalten T E S T Z W E C K E #############################
 ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.ge       ;LED-Gelb ausschalten T E S T Z W E C K E #############################
 
 reti						;_PCI0addr ISR verlassen

In der INT0-ISR passiert auch nicht viel und wie üblich dieser erstmal zu Beginn gesperrt. Der Timer/Counter0 wird in den Normalmode versetzt bzw. dies ist schon die Werkseinstellung, sowie die T/C0 Overflow Interrupt ohne Vorteiler initialisiert und dadurch gleichzeitig der Timer0 gestartet.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
;
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
; INTERRUPT REQUEST 0 INT0 
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
;
_INT0addr:	
 
 ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.ge       ;LED-Gelb ausschalten T E S T Z W E C K E #############################
 
 in   s_sreg,SREG           ;CPU-Statusregister sichern 
;
;INT0 Interrupt sperren
;
 in   ia,GIMSK              ;General Interrupt Mask Register laden..
 cbr  ia,1<<INT0            ;..INT0 Interrupt sperren vorbereiten und..
 out  GIMSK,ia              ;..ausfuehren..
;
;Timer/Counter0 Overflow Interrupt ( TOV0-IRQ ) einrichten
;
 in   ia,TIMSK0              ;Timer/Counter0 Interrupt Mask Register laden und.. 
 sbr  ia,1<<TOIE0            ;..Timer/Counter0 Overflow Interrupt Enable setzen..
 out  TIMSK0,ia              ;..somit den TOV0-IRQ ermoeglichen
 ldi  ia,1<<TOV0             ;Nun dass Timer/Counter0 Overflow Flag im..
 out  TIFR0,ia               ;..Timer/Counter0 Interrupt Flag Register loeschen..
 in   ia,TCCR0B              ;..dass Timer/Counter0 Control Register B laden..
 sbr  ia,1<<CS00             ;..Clock Select = 1:1 einstellen..
 out  TCCR0B,ia              ;..und den T/C0 gleichzeitig starten

_exit_INT0addr:
 out  SREG,s_sreg           ;Statusregister restaurieren
 
 ;sbi  LED_PORT,led.ge       ;LED-Gelb einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.ge       ;LED-Gelb ausschalten T E S T Z W E C K E #############################
  
 reti                       ;_INT0addr ISR verlassen
























_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

4

Donnerstag, 28. Mai 2020, 16:39

Timer/Counter0 Overflow ISR: Bits erfassen und den Ausgang umschalten

Die Timer/Counter0 Interrupt-ISR ist ziemlich verzweigt und einigermaßen komplex. Den kompletten PAP hierzu als Screenshot darzustellen ist also zu unleserlich. Ich habe ihn deshalb zerstückelt hier dargestellt, um die jeweiligen Codesequenzen besser erklären zu können. Auch der Code ist so zusammengestückelt. Wer also den PAP in seiner vollen " Schönheit " sehen möchte, sollte sich dieses hierzu benötigte Programm herunterladen und wenn ich mal alles hier Hochgeladen habe, ansehen.

Der Signalpegel wird nun erfasst ( CY800-Bits erfassen ) und dieses Bit dann innerhalb der 3 Bytes ( 24Bits ) positioniert ( Bits zusammenfassen ). Danach wird überprüft, ob alle Bits erfasst sind und wenn nicht, dann wird die INT0-IRQ für die Erfassung des nächsten Datenelementpegels wieder aktiviert. Hiernach wird der Timer0 erstmal wieder gestoppt und für den nächsten Zeitpunkt des Überlaufs, dass Timer Counter0 Zählregister eingestellt. Scharf gemacht wird ja die T/C0-Overflow-IRQ dann wieder in der INT0-ISR.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
;670 im Windows Editor
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
; Timer0 Overflow ISR ( Interrupt Service Routine )
;QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
;
_OVF0addr:
 in   s_sreg,SREG           ;CPU-Statusregister sichern 
 
 ;sbi  LED_PORT,led.pla      ;LED-PLA einschalten T E S T Z W E C K E ##############################
 ;cbi  LED_PORT,led.pla      ;LED-PLA ausschalten T E S T Z W E C K E ##############################

;
;CY800-Bits erfassen
; 
 sec			   ;High-Bit vorgeben
 sbis CY800_PIN,cy800.data ;CY800 Signalpin = 1 ?..			   
 clc			   ;..Nein -> Bit = 0 setzen
;
;Bits zusammenfassen
;
 rol  byte_0	           ;Carry-Bit und weitere Bits links rotieren..
 rol  byte_1		   ;Carry-Bit und weitere Bits links rotieren
 rol  byte_2		   ;Carry-Bit und weitere Bits links rotieren..
 dec  bit_zlr		   ;Bitzaehler um eins verringern
 brne _next_bit		   ;Alle 24 Bits erfasst? NEIN -> springen..
;
;INT0 Interrupt auf steigende Flanke einstellen
;
_next_bit:
 in   ia,MCUCR              ;MCU Control Register laden..
 sbr  ia,1<<ISC01|1<<ISC00  ;..die steigende Flanke einstellen und dies..
 out  MCUCR,ia              ;..nun uebernehmen, nun dass..
 in   ia,GIMSK              ;..General Interrupt Mask Register  laden, dort..
 sbr  ia,1<<INT0            ;..dass External Interrupt Request 0 Enable bit..
 out  GIMSK,ia              ;..setzen und somit den INT0-IRQ freigeben..
 ldi  ia,1<<INTF0           ;..Nun dass External Interrupt Flag 0 Bit..
 out  GIFR,ia               ;..im General Interrupt Flag Register loeschen

 rjmp _timer_stopp          ;
;
;Timer/Counter0 stoppen.
;
_timer_stopp: 
 in   ia,TCCR0B             ;..dass Timer/Counter0 Control Register B laden..
 cbr  ia,1<<CS02|1<<CS01|1<<CS00;..Clock Select = T/C0 stopp einstellen..
 out  TCCR0B,ia             ;..und nun den T/C0 stoppen
;
;Timer/Counter0 Zaehlregister fuer die Biterfassung einstellen
; 
 ldi  ia,$FF-#top           ;Wert f. TOV0-IRQ ( Normal- Mode )..
 out  TCNT0,ia              ;..ins Timer/Counter0 Zaehlregister laden
;
;Timer/Counter0 Overflow ISR verlassen
; 
_exit_OVF0addr:             ;Timer0 Overflow ISR verlassen
 out  SREG,s_sreg           ;Statusregister restaurieren
 
 reti                       ;_OVF0addr ISR verlassen



Hier wird der Pfad erklärt, falls der richtige Code, drei mal, direkt hintereinander erkannt wurde.

Wenn alle 24-Bits erfasst wurden, wird erstmal der Bitzähler wieder neu geladen und der Code im Programmspeicher, für die Taste A, mit den drei Bytes verglichen.

Es wird eine Pausenzeit geladen, deren Zweck ich zum Schluß erkläre.

Jetzt wird geschaut ob die Empfangenen Bits den dreimaligen Vergleich hinter sich haben und falls nicht, der Vergleichszähler aktualisiert.

Nun wird überprüft, ob zum ersten Mal die Bytes, dreimal direkt hintereinander, mit dem Code übereinstimmten, daraufhin halt einmalig der Ausgang umgeschaltet und danach, wie bei den beiden anderen Verzweigungen, zu dem Pfad für ein neues Paket gesprungen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 brne _next_bit		    ;Alle 24 Bits erfasst? NEIN -> springen..
;
;Bitzaehler auf 24 Bits einstellen
;
 ldi  bit_zlr,#bit_zlr      ;Wert f. Bitzaehler laden..
;
;CY800-Paket vergleichen
;
 lpm  code,Z+               ;Code-Byte2 laden und Zeiger inkrementieren..
 cp   code,byte_2           ;..beide Bytes vergleichen..
 brne _ungueltig            ;Der Code stimmt nicht -> springen
 lpm  code,Z+               ;Code-Byte1 laden und Zeiger inkrementieren..
 cp   code,byte_1           ;..beide Bytes vergleichen..
 brne _ungueltig            ;Der Code stimmt nicht -> springen
 lpm  code,Z                ;Code-Byte0 laden..
 cp   code,byte_0           ;..beide Bytes vergleichen..
 brne _ungueltig            ;Der Code stimmt nicht -> springen
;
;Pausenzeit laden
;
 ldi  ia,#pausenzeit
 mov  pausenzeit,ia
;
;Pruefen ob alle 3 Bytes, 3 mal direkt hintereinander gleich waren
;bzw. der Vergleichszaehler 0 ist
; 
 tst  vergleichs_zlr        ;3x positiver Vergleich?..
 breq _neues_paket          ;..JA -> Auf ein neues Paket vorbereiten
;
;Vergleichszaehler dekrementieren
;
 dec  vergleichs_zlr        
 breq _umschalten           ;Code akzeptiert -> Ausgang toggeln

 rjmp _neues_paket          ;Auf ein neues Paket vorbereiten
;
;Ausgang Umschalten
; 
_umschalten:
 
 sbi  LED_PIN,led.ora       ;LED-Orange toggeln T E S T Z W E C K E #############################
 
 rjmp _neues_paket          ;Auf ein neues Paket vorbereiten
Der Vergleichzähler erfüllt in diesem Pfad eine Doppelfunktion. Zum einen zählt er die Anzahl der positiven Vergleiche und zum Anderen verhindert dieser nach Ablauf ( Vergleichzähler = 0 ), dass der Ausgang immer wieder umschaltet, solange der Taster betätigt ist.
Die Pausenzeit dient der Erkennung, dass innerhalb einer Zeit von ca. einer Sekunde, kein einziges Mal ein gültiger Code empfangen wurde, was einer losgelassenen Taste, für mindestens dieser Zeit entspricht. Der Ausgang kann also frühestens nach dieser Zeit, durch einen erneuten Tastendruck umgeschaltet werden.

_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

5

Freitag, 29. Mai 2020, 11:42

Timer/Counter0 Overflow ISR: Bits ungültig und ein paar Screenshots vom Logic Analyser

Da die Verarbeitungsbreite der CPU ein Byte ist, wird bereits nach einem nicht mit dem Code übereinstimmendem Byte hierher verzweigt. Vielleicht ginge es auch bitweise, aber das bringt ja nichts, da der Vergleich erst stattfindet, wenn alle drei Bytes bereits eingelesen sind.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
;650,460
;CY800-Paket vergleichen
;
 lpm  code,Z+               ;Code-Byte2 laden und Zeiger inkrementieren..
 cp   code,byte_2           ;..beide Bytes vergleichen..
 brne _ungueltig            ;Der Code stimmt nicht -> springen
 lpm  code,Z+               ;Code-Byte1 laden und Zeiger inkrementieren..
 cp   code,byte_1           ;..beide Bytes vergleichen..
 brne _ungueltig            ;Der Code stimmt nicht -> springen
 lpm  code,Z                ;Code-Byte0 laden..
 cp   code,byte_0           ;..beide Bytes vergleichen..
 brne _ungueltig            ;Der Code stimmt nicht -> springen
;
;Das Paket passt nicht zum Code
;
_ungueltig:

 ;cbi  LED_PORT,led.pla       ;LED-PLA ausschalten T E S T Z W E C K E #############################
 
 ;sbi  LED_PORT,led.pla       ;LED-PLA einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.pla       ;LED-PLA ausschalten T E S T Z W E C K E #############################
 
 ;sbi  LED_PORT,led.pla       ;LED-PLA einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.pla       ;LED-PLA ausschalten T E S T Z W E C K E #############################
 
 ;sbi  LED_PORT,led.pla       ;LED-PLA einschalten T E S T Z W E C K E #############################
 ;cbi  LED_PORT,led.pla       ;LED-PLA ausschalten T E S T Z W E C K E #############################

;
;Pruefen ob alle 3 Bytes 3 mal direkt hintereinander gleich waren
;bzw. der Vergleichszaehler 0 ist
; 
 tst  vergleichs_zlr        ;3x positiver Vergleich?..
 breq _pausenzeit           ;..JA -> Pausenzeit -1
;
;Vergleichszaehler laden f. Erkennung dass der Code 3x hintereinander 
;OK war
;
_vgz_laden: 
 ldi  ia,#vergleichs_zlr    ;..Vergleichszaehler..
 mov  vergleichs_zlr,ia     ;..laden
;
;Alles fuer die Erfassung eines neuen CY800-Paketes veranlassen
;
_neues_paket:

Zur Signalisierung dass die eingelesenen Bits nicht mit dem Code im Programmspeicher übereinstimmen, wird per LED-PLA ( was ich meistens als Programm Lauf Anzeige nutze ), dies mit drei Impulsen kenntlich gemacht.

Jetzt gilt es, mit der Hilfe einer weiteren Funktion des Vergleichszählers zu ermitteln, ob die Bits deshalb ungültig sind, weil die Taste losgelassen wurde oder ob eine sonstige Störung beim Einlesen der vierundzwanzig Bitpegel vorlag. Bei einer Störung oder wenn halt noch nicht die 3 Bytes, drei mal direkt hintereinander gültig waren, ist der der Vergleichszähler ungleich Null und wird zurückgesetzt ( Neu geladen ). Dieses Rücksetzen vom Vergleichszähler dient der Realisierung der Funktion, um zu erkennen dass dreimal direkt hintereinander, die 3 Bytes mit dem Code übereinstimmten.

Wenn die Taste losgelassen wurde, dürfte es nie dazukommen, dass die Bytes dem Code entsprechen und die Pausenzeit kann ablaufen. Als Zeiteinheit wird einfach die Zeit genommen, die es dauert bis alle 24-Bits eingelesen wurden. Also 24 mal der Aufruf der T/C0 Overflow-ISR, mal einem Faktor, um ca. eine Sekunde hinzubekommen. Falls die Pausenzeit noch nicht abgelaufen ist, wird einfach so vorgegangen, wie es üblich ist, um dass nächste Bit ( Datenelement ) einzulesen ( _next_bit: ). Der Vergleichzähler bleibt also bei Null stehen.

Beim erreichen des Pausenzeitendes, wird alles so vorbereitet dass ein neues Datenpaket erfasst werden kann.

Ein dekremieren des Pausenzählers erfolgt nur einmal. Habe es nur hierhin geschoben um die Orientierung zu verbessern ( Pausenzeit -1 ).

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
;670,610
;Alles fuer die Erfassung eines neuen CY800-Paketes veranlassen
;
_neues_paket:
;
;Variablen initialisieren
;
 clr  byte_2                ;Die 3..
 clr  byte_1                ;..Bytes..
 clr  byte_0                ;..loeschen
;
;Codeadresse fuer Taste A laden
;
 ldi  zh,high(_code*2)      ;Z-Zeiger mit Vergleichscode-Adresse..
 ldi  zl,low (_code*2)      ;..laden
;
;Sleep-Mode -> Power Down vorgeben
; 
 sbr  flag_reg,1<<pdm       ;Power-Down-Mode FLAG setzen
;
;Systemtakt ( 4,8MHz ) durch 8 teilen ( 600kHz = 1,666µs )
;
 ldi  ia,1<<CLKPCE          ;Im Clock Prescaler Register Bit..
 out  CLKPR,ia              ;..Clock Prescaler Change Enable setzen..
 ldi  ia,1<<CLKPS1|1<<CLKPS0;..und CLKPS[3:0] loeschen (Sicherheitsprozedur)..
 out  CLKPR,ia              ;..nun mit CLKPCE=0 und CLKPS[3:0] SYS-Takt aendern
;
;PCINT0-IRQ einrichten
;
 in   ia,PCMSK              ;Pin Change Mask Register laden..
 sbr  ia,1<<PCINT0          ;..den Pin Change Enable Mask 1..
 out  PCMSK,ia              ;..auswaehlen
 in   ia,GIMSK              ;General Interrupt Mask Register laden..
 sbr  ia,1<<PCIE            ;..Pin Change Interrupt Enable Bit setzen..
 out  GIMSK,ia              ;..und somit den PCI1-IRQigeben
 ldi  ia,1<<PCIF            ;Pin Change Interrupt Flag im..          
 out  GIFR,ia               ;..General Interrupt Flag Register laden loeschen
;
;Timer/Counter0 stoppen.
;
_timer_stopp: 
 in   ia,TCCR0B             ;..dass Timer/Counter0 Control Register B laden..
 cbr  ia,1<<CS02|1<<CS01|1<<CS00;..Clock Select = T/C0 stopp einstellen..
 out  TCCR0B,ia             ;..und nun den T/C0 stoppen
;
;Timer/Counter0 Zaehlregister fuer die Biterfassung einstellen
; 
 ldi  ia,$FF-#top           ;Wert f. TOV0-IRQ ( Normal- Mode )..
 out  TCNT0,ia              ;..ins Timer/Counter0 Zaehlregister laden
;
;Timer/Counter0 Overflow ISR verlassen
; 
_exit_OVF0addr:             ;Timer0 Overflow ISR verlassen
 out  SREG,s_sreg           ;Statusregister restaurieren
 
 reti                       ;_OVF0addr ISR verlassen
Ich denke hier gibt es nicht viel zu erklären, da lediglich alles vorbereitet wird um auf ein Neues Datenpaket reagieren zu können.


Hier wird nach drei mal direkt hintereinander gültigen Bytes der Ausgang umgeschaltet:


Hier sind die Pegeleinlesezeitpunkte der einzelnen Bits:


_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

6

Mittwoch, 21. Oktober 2020, 21:07

Wiedereinstiegsprobleme und restliche Taster


LED-PLA hatte doch in regelmäßigen Abständen das Signal abgetastet. Was ist jetzt schon wieder los? Hatte erst mit den alten LA-Einstellungen, wie sie im Post2 im 2ten Screenshot zu sehen sind gearbeitet ( 1M Samples / 4MHz ), aber hierbei war nicht mal das Data/IN-Signal zu sehen.
Davor konnte ich nicht auf den µC zugreifen, das heißt per ISP nicht erreichen, darauf hin einen neuen µC geflashed und die Debughilfe durch LED-Gelb rausgenommen, um nicht unnötig Verwirrung zu stiften.
Zu lange Projektpausen sind überhaupt nicht gut, denn selbst den neuen µC konnte ich erst nicht flashen, denn ich hatte vergessen, das ich das ATMEL-STUDIO "als Administrator" öffnen musste. Beim Versuch den alten µC per HV-Programming wieder fit zu kriegen, hab ich durch falsch Verkabelung auch noch zusätzlich den Programmier µC abgeschossen.

Der Ausgang wird ja geschaltet, dann muss doch die Signalabtastung funktionieren. Bin schon wieder 3 Tage mit dem Wiedereinstieg beschäftigt. Ah - habe doch irgendwann mein Rechner mit einem Upgrade-Bundle ausgerüstet. Liegt hier der Hase im Pfeffer?


Genau das ist es. Der LA verarscht mich nämlich, aber diese neuen Einstellungswerte ( 50k Samples / 200kHz ) sind wohl jetzt die richtigen für mein PC-System.

Ja, da sind sie wieder schön zu sehen meine 24-Signalabtastungen ( LED-PLA ). Werde jetzt noch die den Quellcode der Testversion anhängen, der sich von der normalen, lediglich dadurch unterscheidet, das die Led's für das Debugging, je nach Wunsch, freigeschaltet werden. Am Ende von CY800_E_Test befindet sich die Codetabelle für meine entsprechenden Tastencodes (A-E). Auch den vollständigen PAP hänge ich an.

CY800_E_Test.zip

CY800Programmablaufplan.zip


Der nächste Schritt ist die Entwicklung des Platinenlayouts per KiCad, in das ich mich auch erst wieder einarbeten muss.



_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

7

Freitag, 19. März 2021, 11:04

CY800 Empfängerschaltplan

Jetzt ist es wieder eine Weile her, seit dem ich den Schaltplan erstellt hatte und ich weiß nicht mehr genau warum ich D4 in Reihe zum Emitter von Q1 gelegt hatte.
Evtl. wegen der im Datenblatt stehenden offenen Emitter-Base-Voltage ( VEB0 ) von 5V, oder weil ich irgend einen Weg bzw. eine Lücke im Layout brauchte, um eine Leiterbahn zu verlegen, wo sich der Abstand zwischen den Padanschlüssen von Anonde und Kathode anbot und ich somit eine gute Kombination der beiden Dinge sah. Glaube so etwas nie bei einem Transistor-Längsregler gesehen zu haben, also ist wohl die Layoutgeschichte wahrscheinlicher. Die Dummheitsdiode D1 ist absichtlich im GND-Zweig, weil es Layouttechnisch von Vorteil war.
------------------------------------------------------------ Jetzt fällt mir auch auf das die Kreuzung zu J4 & J7 absolut unnötig war. Sie ist sogar blöd, weil sie verwirrt.
Die Anschlüsse MISO, MOSI, SCK und /RST sind übrigens für's flashen des uC und deshalb auch auf die Pfostenstecker geführt.

Die Monoflop IC ( U2 ) dient lediglich dazu den uC ( U1 ), mit einer negativen Flanke aus seinem Tiefschlaf zu holen. Dies passiert allerdings nur, wenn es ca. 8,3ms lang nicht nachgetriggert wurde. Da der CY800 ständig irgendwelche Signale auf seinen DATA-Pin ausgibt, wollte ich ja nicht jedesmal den uC aus seinen Tiefschlaf holen, sondern nur wenn ein richtiges Protokoll zu erwarten ist und habe deshalb das MF-IC dazwischengeschaltet. Bei C3 habe ich mich für den WIMA-Typ PPS2824 (SMD-Folienkondensatoren aus metallisiertem Polyphenylensulfid ) entschieden, da er erstens bei Reichelt vorhanden ist und das PPS-Material gut für Timmingaufgaben bzw. frequenzbestimmende Schaltungen ist.

Das Signal Out_MF kann man am besten am Stiftleistenpin J7 ( MOSI ) abgreifen. Dies erwähne ich, weil ich den SMD-Trimmer RV1 ( TS53YJ104M ) nicht habe und deshalb einfach einen 39k-Widerstand benutzte, aber leider feststellen musste, das hiermt keine fallende Flanke vom MF erzeugt wurde. Erst als ich diesen fast kurzgeschlossen hatte, weil ich an diesem provisorisch ein 100k-Poti parallel anschloss und dieses soweit runterdrehen musste bis endlich diese Flanke zu sehen war. Kurz um - der Trimmer RV1 ist gut investiert. Zumindest einmal, um den Ersatzwert für RV1 herauszufinden, der bei mir eine Lötzinnbrücke ist, da ich ja nicht wirklich Strom sparen muss und somit das MF nicht so haarscharf triggern braucht.
Der Trimmer ist z.B. hier erhältlich :

https://www.tme.eu/de/details/ts53yj100k…/ts53yj104mr10/












Das DATA-Signal vom CY800 kann man einmal an J4 ( MISO ) abgreifen oder am Modul eine weitere 4-Polstiftleiste anlöten, dann hat man Vcc und GND für anndere Zwecke zur Verfügung. GND ist auch an JP1 Pin2 ( Reset ) vorhanden. Für Vcc kann ein weiterer Pfostenpin in die Durchkontaktierung am ELKO ( C4 ) auf der Seite des Minusanschluß dienen. Die Variante am CY800-Modul finde ich aber besser, es sei denn man will sparsam mit den Postensteckern umgehen.


Dies ist für mich : Den Balken erzeugt man durch einfügen von " [ " extrabox][/extrabox]" -> https://www.edv-dompteur.de/forum/index.…D=2400#post2400


Auch musste ich überlegen warum ich den Jumper JP4 ( Testbetrieb / Normalbetrieb ) dreipolig ausgeführt hatte. Dann fiel es mir ein. Zu Anfang lief alles ohne die 24 Volt und die LED-Orange, sollte mir anzeigen wenn das Relais angesteuert würde. Im endgültigem Betrieb sollte dieser "Verbraucher" eleminiert werden bzw. bei weiteren Platinen gar nicht mehr verbaut werden. Natürlich würde dies auch mit einem normalen Jumper funktionieren, aber ich dachte ein weiterer Meßpunkt kann ja nie schaden. Obwohl - wenn ich es mir jetzt genau überlege, könnte man ja bei einen normalen Jumper von der Lötseite Pin2 und 3 mit Lötzinn brücken und hätte auf der Bestückungsseite die beiden Pfostenpinne auch frei für Meßklemmen.


Es gilt noch zu beachten, dass das Relais die abgesicherten 24V weiterschaltet !!!. Also seine Kontakte nicht frei zur Verfügung stehen, da ich ja lediglich 24V-LED Streifen damit schalten will.








Die Schwarze Spule ist die Antenne vom CY800-Modul und jetzt bei mir innerhalb vom Gehäuse mit verbaut.

Der Schaltplan ist als PDF unter dem Foto und als gezippte KiCad-Datei.





24V_Funksteckdosenempfaenger.pdf
24V_Funksteckdosenempfaenger.zip


_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Machtwas« (20. März 2021, 13:13)


8

Montag, 22. März 2021, 14:06

CY800 Platinen und Tipps

Wieder mal für mich: Für Text umfließen unbedingt =Wert,left bzw. right eingeben. Nur ,left / right reicht nicht.
https://www.edv-dompteur.de/forum/index.…tID=249#post249
Eigentlich wollte ich ja die Platinen selber ätzen und hatte alles, bis auf die Ätzküvette, gekauft. Aber beim Layouten machten mir dann die GND-Verbindungen probleme, sodas ich praktisch Luftbrücken hätte setzen müssen. Jetzt bin ich ganz froh, dass dies alles nicht so klappte, denn Platinen herstelllen lassen ist viel, viel besser. Die PCB's habe ich schon seit Heiligabend oder veilleicht besser geschrieben 24.12.21 hier liegen gehabt, aber erst vor ca. 2 Wochen gelötet.
Die PCB's könnte man auch noch kleiner machen, wenn man dieses "Stromsparen" nicht benötigt, dann entfallen R2, der Monoflop-IC ( U2 ) und seine Beschaltung weg. D4 kann, so glaube ich, generell weg und muss dann durch eine Brücke ersetzt werden. Aber R3 sollte bleiben, denn er macht es möglich, das der Programmieradapter seine Arbeit bei eingelötetem CY800-Modul verrichten kann.
Allerdings ist dann aber auch das Programm nicht unerheblich zu ändern.

Übrigens gehen natürlich auch 12V-LED-Strips mit der Schaltung, wenn mit 12V eingespeist wird.



Wie hier zu sehen, gibt es drei GND-Inseln, die es gilt mit GND zu verbinden. Da die PCB-Herstellung sowieso nur als mindestens 2-Seitig angeboten wurde, habe ich natürliche die Bestückungsseite ( BS ) als vollständige GND-Fläche genutzt und mittels Durchkontaktierung über extra Durchkontaktierungen ( Via's ) oder an Bauteilpinnen, die nötigen Verbindungen zur GND-BS-Fläche hergestellt.
Oben ist die Bestückungsseite ( BS ) und rechts daneben die Lötseite ( LS ) der PCB's fotorgrafiert. Ich sehe es so, da ich ja auch THT-Bauteile verwende ( THT = englisch through-hole technology ), also Durchsteckbauteile benutze.


Und hier das KiCad-Projekt als ZIP :

CY800_24V_Funkempfaenger.zip




_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Machtwas« (24. März 2021, 22:03)


EDV-Dompteur

Administrator

Beiträge: 2 004

Wohnort: Hamburg

Beruf: Techniker

  • Nachricht senden

9

Montag, 22. März 2021, 17:41

ich weiß nicht mehr genau warum ich D4 in Reihe zum Emitter von Q1 gelegt hatte.
Das weiß ich in der Tat auch nicht.
An der Basis setzt Du eine 5,6V Z-Diode ein. Da über der Basis-Emitterstrecke etwa 0,6 bis 0,7V abfallen, beträgt die Spannung direkt am Emitter folglich ziemlich genau 5V.
Nun hast Du hinter dem Emitter aber noch diese Diode D4, über der wiederum 0,6 bis 0,7V abfallen.
Die stabilisierte Spannung hinter D4 beträgt demnach nur etwa 4,3V ...

Also wenn D4 einen Sinn erfüllen sollte (der sich mir gerade nicht erschließt, dann solltest Du in Reihe zur Z-Diode an der Basis noch eine Silizumdiode vom selben Typ wie D4 schalten, um die stabilisierte Spannung somit auf ordnungsgemäße 5V anzuheben.

Die auf diese Weise erreichbare Stabilisierung wäre dann sogar höher, als wenn Du D4 einfach weg lässt.
Der Grund liegt darin, dass eine Z-Diode in Reihe mit einer normalen Siliziumdiode eine bessere Temperaturstabilität aufweist, als eine alleinige Z-Diode.


Die Dummheitsdiode D1 ist absichtlich im GND-Zweig, weil es Layouttechnisch von Vorteil war.
Das würde ich nicht tun.
Schalte die Diode lieber mit der Anode auf Masse und der Kathode auf den Ausgang der Sicherung.
Bei Verpolung knallt dann die Sicherung durch.

Der Vorteil ist der, dass Massepotential und Minus der Spannungsversorgung gleiches Potential haben. Das ist dann relevant, wenn die Schaltung mal an eine andere Schaltung angeschlossen wird, die einen echten Massebezug hat.
So wie es jetzt ist, wären da rund 0,7V Spannungsdifferenz, was unter Umständen störend sein kann.
Eventuell irritiert diese Spannungsdifferenz auch bei Messungen, wenn man Oszi/Multimeter/Logic-Analyzer mit ihrer Masse (bzw. der schwarzen Messleitung) direkt mit Minus der Spannungsversorgung verbindet.
Kein Mensch erwartet, dass Schaltungsmasse nicht direkt mit Minus verbunden ist.
Sowas vergisst man sogar selbst, wenn man da lange nicht mehr bei war. Und dann kratzt man sich womöglich längere Zeit am Kopf, bis der Groschen (hoffentlich!) fällt.
Macht Technik dir das Leben schwör, ruf' schnell den EDV-Dompteur! ;-)

- Technische Fragen zu Eigenreparaturen bitte öffentlich im Forum stellen, nicht telefonisch! -

10

Dienstag, 23. März 2021, 14:15

D4 und D1

Also wenn D4 einen Sinn erfüllen sollte (der sich mir gerade nicht erschließt, dann solltest Du in Reihe zur Z-Diode an der Basis noch eine Silizumdiode vom selben Typ wie D4 schalten, um die stabilisierte Spannung somit auf ordnungsgemäße 5V anzuheben. Die auf diese Weise erreichbare Stabilisierung wäre dann sogar höher, als wenn Du D4 einfach weg lässt. Der Grund liegt darin, dass eine Z-Diode in Reihe mit einer normalen Siliziumdiode eine bessere Temperaturstabilität aufweist, als eine alleinige Z-Diode.
Das ist ja das Schöne an einer 5V6-Z-Diode, das da der Temperaturkoeffizient ( Temperaturbeiwert ) ungefähr bei 0 liegt.
Eine weitere Idee zu D4 könnte gewesen sein, dass es möglich ist über den Öffner zu J2 ( 24Vgnd ) einen Kurzschluß zu machen und dann die Emitter-Basis-Durchbruchspannung ( Veb0 ) von 5V bei aufgeladenem C4, den BC547C ( Q1 ) zerstören könnte.

Schalte die Diode lieber mit der Anode auf Masse und der Kathode auf den Ausgang der Sicherung. Bei Verpolung knallt dann die Sicherung durch.
Da dieser Schusseligkeitsfehler sehr beliebt ist, bin ich lieber für meine Methode mit D1, da muss man dann keine Sicherung wechseln.
J2 ( 24Vgnd ) bzw. GND_IN, soll halt die Masse sein ( GND ), meiner künstlich hochgelegten, hätte ich einfach ein anderes Symbol verpassen sollen, aber wie du schon schreibst ist man ja ein Gewohnheitstier, deshalb hatte ich auch gar nicht weiter darüber nachgedacht und es ist sicherlich sehr verwirrend, wenn man diesen Umstand nicht kennt oder vergisst. Aber dies ist eine gute Überleitung zu meinem nächsten Posting.



_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

11

Dienstag, 23. März 2021, 15:55

Wenn es mal nicht funktioniert, könnte es an der Batterie vom Sender liegen.

Jetzt wollte ich die 4te Platine in Betrieb nehmen und wunderte mich, dass diese nicht funktioniert. Jetzt war es doch von Vorteil, dass ich JP4 ( TEST / NORM ) 3-Polig ausgeführt hatte, denn so konnte ich den Jumper von Pin2/3 abziehen und über 5V mittels, 4k7-Widerstand, eine Verbindung zu Pin3 herstellen und somit das Relais bzw. den Transistor Q3 testen, denn PB3 hatte Low-Potential. Ob ich zu diesem Zweck JP4 3-Polig ausgeführt hatte fällt mir jetzt nicht mehr ein.

Tja - was nun, PB3 muckst sich nicht?






Es musste also wieder der Logic Analyser ( LA ) her. Nun war das Problem, dass ich zwar von den alten Screenshots her wusste, dass DATA/IN grün ist usw., aber welche Klemme war dies noch?


Ach hier findet sich dies, also D5 bzw. Channel 5.

Also die wichtigsten Signale wieder aufgelegt ( DATA/IN und MONOFLOP ), aber jetzt kommt teilweise ein falscher Code für die Taste D zum Vorschein. Ach wieder was vergessen, denn ich muss ja den Trigger beim MF-Signal setzen und zwar auf fallende Flanke. Hm - sieht immer noch teilweise seltsam aus. Ausserdem stört die weißtransparente Schrift bei RCencode. Deswegen habe ich die pre-trigger capture ratio auf 17% gestellt, weil mir zu diesem Zeitpunkt nicht wieder eingefallen ist, dass man das Bild bzw. die Signale einfach nach rechts ziehen kann.


Wieder mal ganz schön blöd die Sache. Also zog ich mir wenigstens den Bereich ins Sichtfenster wo der RCencode stimmt.


Jetzt muss ich wieder LED's im Programm aktivieren, damit ich sehe was da schief läuft. Das heißt auf jeden Fall die Einlesezeitpunkte darstellen, was über LED-PLA lief.
Der RCencode sieht gut aus, aber was zeigt LED-PLA denn da wieder für unregelmäßige Impulse. Ach ja, das hatte ich doch schon mal. Äh - 50k Samples / 200kHz waren doch richtig ?


Egal, dann versuch ich halt andere Einstellungen. Na geht doch ! Aber warum schaltet PB3 jetzt nicht, wenn der RCencode doch stimmt ???


Ich muss mir mal die Abtastzeitpunkte bzw. Einlesezeitpunkte genauer anschauen.
Ah - der Anfang ist gut, aber dann zwei Einsen anstatt zwei Nullen. Wie kommt das denn jetzt ? Gut das es noch alte Screenshots von der Taste A gab, so konnte ich sehen, das die Zeit bei den " langen " Impulsen ( 1,4xxms ) gar nicht richtig ist, denn diese Zeit war bei allen Impulsen ca. 1,100ms lang. Irgendwie bin ich dann darauf gekommen die Batteriespannung vom Sender zu messen, welche unbelastet nur noch ca. 10V betrug. So habe ich 12V fremdeingespeist und alles war gut. Nun dachte ich, dass ich die Batterie ja mal mit 12V, einmalig, aufladen könnte und 50mA erschien mir hierbei nicht zu hoch, aber es brachte nichts.












Vielleicht gibt und gab es die Probleme mit dem LA nur, weil ich den falschen Treiber eingestellt hatte.
Ich meine dies, was man links im Screenshot sieht ist richtig für diesen 24Mhz-China Logic Analyzer mit 8 Kanälen.

Und falls im Step 4 nichts angezeigt wird, dann den USB-Stecker abziehen, das Programm schließen, danach den USB-Stecker wieder einstecken, das Programm starten und die Einstellungen erneut vornehmen.

Ach, da fällt mir ein, falls man nach dem Ändern der FUSES nicht mehr auf den uC per ISP zugreifen kann, ist es erforderlich den ISP-Takt zu verringern.
Bei mir ging es dann mit 64kHz.



_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »Machtwas« (24. März 2021, 18:50)


EDV-Dompteur

Administrator

Beiträge: 2 004

Wohnort: Hamburg

Beruf: Techniker

  • Nachricht senden

12

Donnerstag, 25. März 2021, 16:04

Das ist ja das Schöne an einer 5V6-Z-Diode, das da der Temperaturkoeffizient ( Temperaturbeiwert ) ungefähr bei 0 liegt.
Ach ja, ich glaube mich zu entsinnen, dass es bei der so ist.
Btw.: Warum setzt Du eigentlich keinen 7805 ein?
Die Dinger sind billig, wundervoll stabil, jahrzehntelang zuverlässig, praktisch unkaputtbar und mit guten Schutzfunktionen ausgestattet, gegen Überstrom und Überhitzung.


Zitat

Eine
weitere Idee zu D4 könnte gewesen sein, dass es möglich ist über den
Öffner zu J2 ( 24Vgnd ) einen Kurzschluß zu machen und dann die
Emitter-Basis-Durchbruchspannung ( Veb0 ) von 5V bei aufgeladenem C4,
den BC547C ( Q1 ) zerstören könnte.
J2? Den finde ich in Deinem Plan nicht.
Aber bei nur 5V Ausgangsspannung kann Dir die Basis-Emitter-Diode nicht in Sperrichtung durchknallen, die verkraftet mehr.
Wäre Deine Ausgangsspannung aber höher, dann wäre die sinnvollere Maßnahme eine Diode antiparallel zum Transistor: Anode auf den Emitter und Kathode auf den Kollektor.


Da dieser Schusseligkeitsfehler sehr beliebt ist, bin ich lieber für meine Methode mit D1, da muss man dann keine Sicherung wechseln.
Da habe ich früher genauso gedacht, aber schon seit vielen Jahren bevorzuge ich doch tatsächlich die "unelegante" Methode mit der Sicherung, die bei Verpolung fetzt.
Mit der Begründung tue ich mich allerdings schwer, denn in Deiner Schaltung entfällt der wichtigste Vorteil (kein Spannungsabfall über Längsdiode im Normalbetrieb). Bei Dir ist eine Diode in Flussrichtung sogar mderat vorteilhaft, weil deren Spannungsabfall die Leistung über dem Regeltransistor etwas senkt.

Wenn es tatsächlich so häufig vorkommen kann, dass die Schaltung verpolt angeschlossen wird, dann würde ich halt eine Diode in Flussrichtung hinter die Sicherung setzen.
Du schriebst zwar, es hätte layouttechnische Vorteile gehabt, die Diode in den Massepfad zu setzen, aber da hätte eine Drahtbrücke dann doch sicherlich den gleichen layouttechnischen Vorteil geboten, wie ich stark annehme.

Es ist ja Deine Schaltung, Du kannst natürlich machen, was Du willst.
Aber für mich persönlich gilt: "Masse ist Masse, ist Masse!"
Eine Abweichung davon ist nach meinen Maßstäben kein guter Stil.
Macht Technik dir das Leben schwör, ruf' schnell den EDV-Dompteur! ;-)

- Technische Fragen zu Eigenreparaturen bitte öffentlich im Forum stellen, nicht telefonisch! -

13

Mittwoch, 31. März 2021, 14:57

Ein Schotte springt nicht über seinen Schatten ;-)

Hallo Desi,

schön das sich mal jemand findet der Ahnung hat und mit mir meine Schaltung diskutiert. Ich habe Elektronik nur von den simpelsten Grundlagen her gelernt. Ein besonderes Talent habe ich hierfür auch nicht und bin auch eher ein Lernlegastheniker als ein Autodidakt.

Btw.: Warum setzt Du eigentlich keinen 7805 ein?
Die Dinger sind billig, wundervoll stabil, jahrzehntelang zuverlässig, praktisch unkaputtbar und mit guten Schutzfunktionen ausgestattet, gegen Überstrom und Überhitzung.

Irgendwie komm ich als Korinthenkacker nicht über meinen schottischen Schatten und dachte : " Warum soll ich das doppelt so teuer machen, es reicht ja so ". Z-Diode ( 2ct ), BC547C ( 3ct ), R 0805 ( 2ct ) vs. 78L05 ( 11ct ) , 2x C 0805 ( 4ct ). Deine Argumente sind natürlich aus gesundem Menschenverstand entstanden, aber so ist das nun mit mir, und in Bezug auf stromsparend mit dem 78L05 bestimmt auch vorteilhafter.

J2? Den finde ich in Deinem Plan nicht.
Aber bei nur 5V Ausgangsspannung kann Dir die Basis-Emitter-Diode nicht in Sperrichtung durchknallen, die verkraftet mehr.
Wäre Deine Ausgangsspannung aber höher, dann wäre die sinnvollere Maßnahme eine Diode antiparallel zum Transistor: Anode auf den Emitter und Kathode auf den Kollektor.

Hm- vielleicht erklärt ein zusätzlicher DB-Ausschnitt mein Argument, sowie der betreffende Schaltplanausschnitt. Diode antiparallel zum Transistor schützt doch bei ... ? :

Eine weitere Idee zu D4 könnte gewesen sein, dass es möglich ist über den Öffner zu J2 ( 24Vgnd ) einen Kurzschluß zu machen und dann die Emitter-Basis-Durchbruchspannung ( Veb0 ) von 5V bei aufgeladenem C4, den BC547C ( Q1 ) zerstören könnte.
Ich meinte also das es an J5 zu einem Kurzschluß zu J2 kommen könnte, woraufhin ja F1 auslöst und der Kollektor von Q1 offen wäre.
Nun habe ich aber gerade gesehen, dass beim BC547 eine Veb0 von 6V gilt. Somit also D4 erst recht keinen Sinn macht. Wieder so ein Schussleligkeitsfehler, wobei ich natürlich schwören hätte können, dass dort auch beim BC547, 5V gestanden hat.


_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

EDV-Dompteur

Administrator

Beiträge: 2 004

Wohnort: Hamburg

Beruf: Techniker

  • Nachricht senden

14

Dienstag, 6. April 2021, 12:24

Deine Argumente sind natürlich aus gesundem Menschenverstand entstanden, aber so ist das nun mit mir, und in Bezug auf stromsparend mit dem 78L05 bestimmt auch vorteilhafter.
Das wage ich zu bezweifeln.
Du verbrätst durch Deine Z-Diode 5,6mA. Selbst ein Standard 7805 bewegt sich in der gleichen Region, wobei es auch sparsamere Ausführungen gibt (einfach mal Datenblätter vergleichen, der wird ja von verschiedenen Herstellern gefertigt).

Die Anzahl der Lötstellen ist identisch.
7805 plus zwei Entkoppelkondensatoren = sieben Lötstellen.
Transistor plus Z-Diode plus Widerstand = sieben Lötstellen.

Der 7805 glänzt aber in Bezug auf Stabilität, Langzeit-Zuverlässigkeit und Schutzfunktionen.
Der ist kurzschlussfest etc.

Würde es Sinn machen, oder Geld sparen, statt einem 7805 so eine Transistorlösung einzusetzen, dann würde das so gemacht werden und dann gäbe es den 7805 gar nicht, weil den dann kein Mensch kaufen würde.


Hm- vielleicht erklärt ein zusätzlicher DB-Ausschnitt mein Argument, sowie der betreffende Schaltplanausschnitt. Diode antiparallel zum Transistor schützt doch bei ... ? :
Die Diode antiparallel zum Transistor ist hier ja überflüssig, weil Du nur 5V erzeugen willst.
Bei größerer Ausgangsspannung würde sie den Transistor schützen, wenn der Kondensator hinter dem Transistor voll geladen ist, dann aber die Eingangsspannung weg fällt, oder gar kurzgeschlossen wird.
Denn dann verschont die antiparallele Diode den Transistor vor Rückwärtsspannung. Der Kondensator entlädt sich dann über die Diode.

Die Maßnahme ist ohne Zusatzmaßnahmen aber eh nicht doll. Sie ist zwar voll wirksam, wenn die Eingangsspannung kurzgeschlossen wird. Aber sie ist nur bedingt wirksam, wenn die Eingangsspannung einfach (hochohmig) weg fällt, denn dann wäre die Basis-Emitter-Diode des Transistors noch immer etwas gefährdet.

Relevant ist das eh nur bei großen Kapazitäten hinter dem Transistor.
Beim 7805 braucht man keine großen Kapazitäten hinter dem Regler, da summieren sich nur die Entkoppelkondensatoren, mit denen man in der Praxis kaum auch nur auf einen Mikrofarad kommt.


Btw.: Betragen Deine 24V eigentlich wirklich 24V?
Oder stammen die aus einem 24V-Trafo mit Gleichrichter und Elko?
- In letzterem Fall musst Du mit dem Spitzenwert rechnen, also 24V mal Wurzel (2). Abzüglich der zwei Diodenstrecken im Gleichrichter wären das dann im Leerlauf rund 34V (etwas Toleranz durch Netzspannungsschwankung muss auch noch berücksichtigt werden).
Das wird dann für einen 7805 schon grenzwertig. Dafür gibt es andere Linearregler, die damit besser klar kommen.
Macht Technik dir das Leben schwör, ruf' schnell den EDV-Dompteur! ;-)

- Technische Fragen zu Eigenreparaturen bitte öffentlich im Forum stellen, nicht telefonisch! -

15

Mittwoch, 7. April 2021, 21:06

Spannungsversorgung CY800_EM

Btw.: Betragen Deine 24V eigentlich wirklich 24V?
Oder stammen die aus einem 24V-Trafo mit Gleichrichter und Elko?

Die Spannung stammt von einem " LED-Trafo " Marke Meanwell ( LPV-60-24 ). Hier kann man sich die Spannung bei z.B. 2,5A Last ansehen :

https://www.mikrocontroller.net/topic/485624#6079877


_Machtwas_
CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

Zur Zeit ist neben Ihnen 1 Benutzer in diesem Thema unterwegs:

1 Besucher