16F84 basierte digitale Zündung
- Version PCM5.4 -
übersicht

Prinzip.
Der Teil der CDI (Capacitive Discharge Ignition) ist auf der Seite " fixed ignition" beschrieben. Der PIC empfängt die Impulse aus dem 36 Grad-Sensor und:
- Verzögert den Impuls bei niedriger Drehzahl (RPM).
- Verarbeitet diesen Impuls sofort bei hoher Drehzah
- zwischen diesen zwei Extremen, verzögert der PIC die Impulse nach der programmierten Kurve.
Lassen Sie uns dies sehen im Detail ...
Die Impulse des 12°-Pickup lösen direkt über D7 R7 C10 die Zündung(SCR) aus.
(Wenn der Motor nur ein Pickup hat,
schließen Sie den 36 Grad-Eingang an, und lassen Sie den 12
Grad-Eingang offen)
Gleichzeitig werden die Impulse aus dem 36°-Pickup auf 5 Volt
durch die Zenerdiode D9 begrenzt und steuern dann dem PIC-Eingang
(Pin 10).
( Die PIC-Eingänge erkennen eine Spannung die höher ist als 1,8 V.Das bedeutet,dass die Spannung des
Pickup-Signal mind.2 Volt betragen muss)
Bei jedem guten Impuls vom 36° Sensor, blinkt die grüne LED D1.
Einen verzögerten Impuls, nach der Kurve voraus programmiert,
finden Sie am Pin8 und am Schalter der Zündspule ,T1 über D2, R7, C10.
Ein +5 V-Ausgang ist verfügbar unter RA2 (zum Beispiel zum Betrieb einer LED), wenn die maximale Drehzahl erreicht ist. Der Ausgang RA3 ist ein invertiertes (Zünd)Signal (revcoil)
Wege der 12 und 36 Grad Signale:
Es werden 2 Zündfunken erzeugt:
ein vor dem TDC (oberen Totpunkt)(vom 36 Grad Pickup)
und einen weiteren am TDC (vom 12 Grad Pickup - wenn angeschlossen)
Dieser zweite Zündfunke ist überzählig.


Max. Zündungs Frequenz 730Hz.

z.B.: 88000rpm mit EINER Zündung pro Rotation und 44000rpm mit 2 Zündungen pro Rotation (wie bei der XT)
Kompatibilität mit 2 stufigen Pickup(s).
Wenn das Signal wie folgend aussieht wie in Fall A,können Sie diese CDI benutzen,und alle bereiche damit Steuern
| This ignition need either 2 pickups: |
or only one pickup |
1st
pickup at 36° BTDC:![]() and 2nd pickup at 12° BTDC: ![]() |
Positive than negative:![]() |
But not negative than positive!![]() |
Funktionsprinzip des Programms
Einfacher Programmstart
Zu Beginn des Programms, der minimal Bereich wird festelegt:
movlw 0xff ; rpmhi = FF initially
movwf rpmhi
Schutz der Zündspule
Nach 0,5 Sekunde ohne Impulse, ist der PIC der Auffassung, dass der Motor gestoppt ist, und reinitialisiert die Zündung.
; if rpm count > 1400h, 5120 x 100us=0.5 Sec, then
it is assumed that the
; motor has stopped. Reinitialize system.
movlw 0x14
subwf rpmhi,W
btfsc STATUS,Z ;
rpmhi - 14 = 0 ?
goto start ; yes
Drehzahlbegrenzung:
bei mehr als 8000 RPM, ist die Verzögerung zwischen dem Pickup-Signal und dem Zündfunke auf 0ms festgelegt.
maxadv clrf rtdset ; > 8000RPM retard value = 0ms
bsf rpmmax ; turn led on
Unter 1000 rpm, ist die Verzögerung zwischen dem Pickup-Signal und dem Zündfunke auf 5ms festgelegt.
maxret movlw 31h ; < 1000RPM
movwf rtdset ; retard value = 31h (~4.9ms)
bsf rpmmax ; turn led on
(Sie können eine andere RPM-Fix Begrenzung innerhalb der 131 Kurven-Werte verwenden)
Erweiterte Berechnung:
Zwischen dem höchsten und dem niedrigsten RPM-Wert,der PIC führt eine Messung der Dauer zwischen 2 Pickup Impulse [die Anzahl an 100us (hundert microsecondes) der Zeitspanne zwischen zwei Impulsen],um Rückschlüsse auf die Geschwindigkeit Motors zu ziehen.
Nach Ermittelung der Geschwindigkeit, berechnet der PIC die Position im Diagramm bzw.Tabelle.
caladv movlw d'74' ; rpmhi/lo - 74
subwf rpmlo,F ; rpmlo = rpmlo - 74
btfss STATUS,C
decf rpmhi,F
; divide result by 4
bcf STATUS,C
rrf rpmhi,F
rrf rpmlo,F ; / 2
;
bcf STATUS,C
rrf rpmhi,F
rrf rpmlo,F ; / 4
Der Wert der Verzögerung (Variable retlw) wird aus einer Tabelle der 131 Werte ermittelt.
map org h'200' ; store map at 200h
addwf PCL,1 ; add W + PCL
; *********** INSERT YOUR OWN VALUES HERE *******************
retlw 31h ;4,9ms 1000rpm
retlw 30h ;4,8ms 1016rpm
retlw 2Fh ;4,7ms 1023rpm
Die Wahl zwischen 2 Tabellen erfolgt durch einen Jumper.
kein Jumper = Tabelle #1 in h200
mit Jumper = Tabelle #2 in h300
btfss table ; is table select low?
bsf PCLATH,0 ; yes,then select table N°2 at h'300'
Der PIC empfängt den Impuls vom Sensor auf 36°.
Er wartet, bis eine Zeit = retlw * 100us, dann nach dieser Verzögerung, wird ein Impuls(Dauer 2ms) an den Thyristor gesendet.
;****************** YOU CAN MODIFY THE DWELL VALUE BELLOW ********
movlw .20 ; 20 X 100uS = 2mS
movwf dwell ; set dwell time

Dauer des Zündfunkes:
Die Dauer des Zündfunkes kann nicht durch die CDI gesteuert
werden, Sie ist abhängig von den Werten des Kondensators und der
Zündspule. Aber wir können die Impulsdauer, die den Thyristor schaltet
beeinflussen. Diese Impulsdauer (genannt: Verweilzeit,Dwell Time) kann
für einige langsame Thyristoren verändert werden, aber ohne
Auswirkungen auf die Dauer des Zündfunkens:
Ein Reverse-Ausgang ist verfügbar an pin8 zum Ansteuern eines
Drehzahlmessers:

beispiel:
Der PIC misst die Dauer zwischen 2
Pickup-Impulsen. Also er ist in der Lage die Motordrehzahl zu
berechnen.
Ist die Geschwindigkeit 1000RPM, der PIC sucht in den
131 Zeilen die ERSTE Zeile.
Warum?
Bei 1000RPM, die Dauer zwischen 2 Impulsen ist
mit 60ms ein Funken überzählig.
(Ohne den
überzähligen Funke wäre die Dauer 120ms)
Umgerechnet
in Mikrosekunden: 60ms = 60.000µs
Wie gesagt (siehe höher), der PIC zählt in 100µs
Schritten.
Bei 1000rpm,der PIC zählt 600 Schleifen von
100µs dauer zwischen 2 Pickup-Impulsen.
Dann der PIC unter
Verwendung folgender Formel berechnet :
; 131 - -------------------
; 4
Die Formel wird daher:
; 600 - 74
; 131 - -------- = 0
; 4
Die Formel gibt Null, so dass der PIC die erste Zeile aus der Tabelle nimmt (Der PIC addiert immer 1 höher),
die erste Zeile zurück: retlw 31h ;4,9ms 1000rpm
(Wie Sie wissen : Semikolon Präfix einen Kommentar und h bedeuten, Hexadezimal)
31 (hexadezimal) = 49 (dezimal)
Also wird der PIC 49 Schleifen von 100 microsekunden warten.
49 x 100µsek = 4900µsek = 4,9 Millisekunden
dann wird der PIC 4,9 ms nachdem Pickup-Impuls warten, bevor ein Zündfunke erzeugt wird.
Ist die Geschwindigkeit 1015rpm, der PIC sucht in den 131
Zeilen nun die ZWEITE Zeile.
Warum wieder ?!
Bei
1015rpm, die Dauer zwischen 2 Impulsen (mit einem überzähligen
Funke) 59,1 ms
Umgewandelt in Mikrosekunden: 59.1ms = 59100µs
Wir wissen, dass der PIC in 100us schritten zählt.
Auf
1015rpm, dem PIC zählt 591 Schleifen von 100us zwischen 2
Impulsen
Also der PIC verwendet nun die Formel mit diesen Werten:
;
591 - 74
;
131 - --------
;
4
;
517
;
131 - ---
;
4
;
;
131 - 129,25 = 1,75 = 1 (wir benutzen den
Integerwert)
;
Die Formel gibt eine EINS, damit verwender der
PIC die zweite Zeile der Tabelle (1 +1)
dort steht der Wert:
retlw 30h
30 (hexa) = 48 (dezimal)
Der PIC wartet nun 48 Schleifen von 100mikroseconden.
48 x
100µsek = 4,8 milliseconds
so dass der PIC 4,8 ms nachdem
Pickup-Impuls wartet, bevor ein Zündfunke erzeugt wird.
Und so weiter, bis 8000RPM und die LETZTE Zeile, wo der PIC
den
Befehl retlw 0h bekommen
wird.
Was bedeutet, dass er wie folgend warten muss: 100µs
x 0 = keine Verzögerung
so
dass der PIC sofort
einen
Funken auslöst.
((Einschränkung: Selbst wenn Sie schreiben "retlw 0h"
der untere Wert ist 100us (0.1ms) .Das bedeutet, dass Sie keinen
Zündfunken zum EXAKT genau gleichen Zeitpunkt haben können,
wie der Pickup-Impuls erfolgt.)
Sie denken nicht wirklich so ?
Bei 8000rpm, die Dauer
zwischen 2 Impulsen (mit einem überzähligen Funken) ist 7,5
ms
Umgewandelt in Mikrosekunden: 7,5 ms 7500µs
Bei
8000rpm, der PIC zählt 75 Schleifen von 100µs zwischen 2
Impulsen
Mit Hilfe der Formel:
;
75 - 74
;
131 - -------
;
4
;
1
;
131 - ---
;
4
;
;
131 - 0,25 = 130,75 = 130 (Integer-Wert)
;
Der
PIC holt die Zahl der Zeile (130 +1) = 131 ,also die letzte
Zeile.
Die Kurve ist also definiert durch die 131 Punkte, und
erlaubt ein gewisses Tuning.Aber die Genauigkeit ist recht grob:
+
/ - 1 ° bei 1660rpm
+ / - 5 ° bei 8330rpm
Das kommt nur
von der verwendeten "Maßeinheit" für die Messung
der Dauer zwischen 2 Impulsen, um die Zündverzögerung zu
berechnen. Diese Laufzeiten sind gezählt, in 100µs
Einheiten.
100µs Einheiten sind bei niedriger Drehzahl klein
genug,aber nicht für hohe Drehzahlen geeignet!
(Eine 10µs
Einheit wäre präziser, aber auf der anderen Seite wäre
die Tabelle zehn Mal größer,
und ein 8MHz Quartz
verbessert die Genauigkeit nicht.)
Wie man die Kurve ändert?
2Es gibt 2 Möglichkeiten: Manuell oder mit Hilfe eines Excel-Arbeitsblattes.
So ändern Sie die Wert der Zündverzögerung ,Sie können die Hexadezimal-Werte direkt in der Tabelle eingeben.
Beispiel:
Angenommen, Sie wollen eine Verzögerung von 7.9ms zwischen den Pickup-Impuls und der Zündung bei 1000 rpm:
- 7.9ms = 79 Schleifen von 100µs
- Verwendenden Sie einen wissenschaftlichen Taschenrechner zum konvertieren von 79 in Hexadezimal-Wert:79 (dezimal) = 4F (hexadezimal)
- ersetzen retlw 31h ; 4,9ms 1000rpm
map org h'200' ; store map at 200h
addwf PCL,1 ; add W + PCL
; *********** INSERT YOUR OWN VALUES HERE *******************
retlw 31h ;4,9ms 1000rpm
retlw 30h ;4,8ms 1016rpm
retlw 2Fh ;4,7ms 1023rpm
retlw 2Fh ;4,7ms 1030rpm
- von retlw 4Fh ; 7,9ms 1000rpm
Die Tabelle ist jetzt:
map org h'200' ; store map at 200h
addwf PCL,1 ; add W + PCL
; *********** INSERT YOUR OWN VALUES HERE *******************
retlw 4Fh ;7,9ms 1000rpm
retlw 30h ;4,8ms 1016rpm
Mit Hilfe eines Excel-Arbeitsblattes:
Schauen Sie bitte in das Tutorial
Erstellen Sie Ihre eigene Kurve mit diesem Excel-Arbeitsblatt
:
Dieses Blatt verwendet DECHEX (fr)
oder DEC2HEX (uk)
oder DEC.N.HEX (nl)
oder DEC.TILL.HEX (sw) function enthalten im Analysis-Toolpak.
Installieren Sie das Analysis ToolPak und Solver, indem Sie auf das Menu Tools klicken und wählen Sie Add-Ins. Wenn die Analysefunktionen im Add-Ins Dialogfeld nicht aufgelistet sind, klicken Sie auf Durchsuchen und suchen Sie auf dem Laufwerk den Ordner-Namen und Dateinamen für die Analysefunktionen-Add-In, Analys32.xll - diese ist in der Regel im MicrosoftOffice\Office\Library\Analysis Ordner enthalten - oder starten Sie das Setup-Programm, wenn es nicht installiert ist (Sie werden wahrscheinlich Ihre Microsoft Office CD-ROM benötigen). Wählen Sie die Analysefunktionen und Solver im Kontrollkästchen und klicken Sie auf OK.
Sollte dies nicht funktionieren, können Sie die Funktion DEC2HEX auszuprobieren. In einer neuen Zelle schreiben Sie: =DEC2HEX(24) funktioniert es?
Wenn ja, "Refresh" der Zelle F17 erzwingen,
(kopieren Sie die Formel aus F17, löschen , fügen Sie diese in
F17 ein)
damit Excel die Formel erneut berechnet.
(Es scheint, dass, wenn Excel auf einen Fehler
stösst, die Berechnung nicht mehr erneut erfolgt)
- Geben Sie die Pickup-Position in Zelle D6 (z.B.: 32 BTDC)
- Geben Sie die RPM-Beschränkung in Zelle D8 (z. B.: 6200)
- Geben Sie die 131 Werte vor, dass Sie in Spalte C (z.B. 8 für 500RPM 8,7 für 625RPM aund so weiter ...)
- Bearbeiten Sie die Kurve mit dem "Grafik-Tabelle"-Reiter: Punkt und wählen Sie dann einen Wert, bewegen sie ihn nach oben oder unten
- Sie können die gesamte Kurve nach oben oder unten verschieben, indem Sie ein "shift"-Wert in die Zelle D10 ändern
- Sobald die Kurve fertig gezeichnet ist, wählen Sie und kopieren Sie die 131 blau-Werte vom Anfang retlw ..... (Spalte E)
- Bearbeiten Sie die Quelldatei (*. ASM) mit einem guten Editor wie ConTEXT (Freeware)
- Fügen Sie diese 131 Zeilen vom Anfang retlw, in die Tabelle ein.
map org h'200' ; store map at 200h
addwf PCL,1 ; add W + PCL
; *********** INSERT YOUR OWN VALUES HERE *******************
retlw 31h ;4,9ms 1000rpm
retlw 30h ;4,8ms 1016rpm
retlw 2Fh ;4,7ms 1023rpm
. . . . . . . . . .
retlw 0h ;0ms
; *********** END OF YOUR OWN VALUES *******************
retlw 31h ;in case of overlap
-
Speichern Sie die Datei *.ASM
Extra erweitert:
Es ist auch eine grössere Vorzündung möglich,als es die Pickup-Position erlaubt.Was ist "Extra erweitert" ?
PIC Programmierung.
- Kompilieren Sie die ASM-Datei mit MPASMWIN:
- Installieren und
starten Sie mpasmwin.exe.
- Wählen Sie den PIC
- Navigieren und wählen Sie die *.ASM-Datei (zB: C:\cdi\bikeign.asm)
- Assemblieren Sie die Datei (= transformieren nach *.HEX je nach Prozessor-Typ).
- Die kompilierte Datei ist verfügbar in C:\cdi\bikeign.hex
- Kompilieren Sie die ASM-Datei mit MPASMWIN:
- Stecken Sie den PICr 16F84/16F628 in den
PIC-Programmierer-Sockel.
Den einen den Ich benutze - Transferiere *.HEX-Datei in den PIC mit ICPROG
- Der PIC 16F84/16F628 Baustein kann nun in die Zündung eingebaut werden.
In der Animation unten, kann man sehen (in weiß), das Signal
vom Pick-up (Anschluss an PIC-Eingang pin10)
und das Signal für die Zündspule
(SCR) (PIC-Ausgang, zwischen D2 und R9) bei verschiedenen
Geschwindigkeiten zwischen 1300rpm zu 6000rpm:

Wir sehen:
bei hoher Drehzahl (U/min), ist das Ausgangssignal ist in der gleichen
Zeit wie das Pickup-Signal, also vor dem oberen Totpunkt (TDC).
bei niedriger Drehzahl (U/min), ist das Ausgangssignal dem
Eingangssignal zeitverzögert, also am oberen Totpunkt (TDC).
Software.
Sources
| PCM5.4 | .ASM |
| PIC16f84 + quartz (1000-8000rpm) |
Source
16f84 |
| PIC16f84 + quartz
(1500-16000rpm) |
Source 16f84 |
| PIC16f628 no quartz
(1000-8000rpm) |
Source 16f628 |
Download: right click / Save link as...
Schaltpläne & Layouts.
| PCM5.4 | Schema | PCB | Componants | Part list | Eagle Files |
| CDI for XT400-550-600 |
Schema.PDF | circuit.PDF | componants.PDF | liste.TXT | SCH+BRD |
Platine (PCB).
realisierung.
| pin 3 | +12Vcc (battery) | brown |
| pin 2 | spark coil | orange |
| pin 1 | Alternator | red |
| pin 4 | Kill switch | white/black |
| pin 8 | 12° pickup | white/green |
| pin 7 | 36° pickup | white/red |
| pin 5 | pickup common ground | green |
| pin 5 | CDI ground | black |
| pin 6 | alternator ground | brown |

Tests.
- Ziehen Sie die Zündkerze und legen Sie sie auf dem Zylinderkopf damit die Kerze Kontakt zur Masse hat.
- Entfernen Sie den 16f84/16f628-Chip aus dem Sockel.
- Nur die Alternatoranschlüsse der Lichtmaschine mit der CDI verbinden (Also nicht +12 V, den Sensor, den Kill-Schalter)
- Kick-Starter mehrmals betätigen um großen Kondensator C11 aufzuladen.
- Messen Sie die Spannung zwischen Anode und Kathode vom Thyristor T1. Der Wert sollte ca. um 150V DC betragen.(Die Spannung nimmt langsam ab, weil der Kondensator sich über das Multimeter entlädt...)
-

- Messen, 30 Sec. warten, Messung wiederholen: die Spannung sollte abnehmen, während das Multimeter abgeklemmt war.
- Kick-Starter wieder mehrmals betätigen um großen Kondensator C11 neu aufzuladen.
- Berühren Sie den Anschluss vom 12deg Eingang mit einem Draht,der an die +12 V (Batterie) angeschlossen ist,zur Auslösung der Zündspule (SCR).
- Sie sehen nun einen Funken an der Zündkerze.
- Schließen Sie alle Drähte von den Pickups an. (Aber keine Verbindung mit +12 V und keine Verbindung mit dem Kill-Schalter)
- Kickstarter betätigen, der 12deg Pickup muss einen Impuls bei jeder Umdrehung erzeugen, dieser Impuls schaltet den Thyristor T1 über D7, R9, C10 und produziert einen Zündfunken.
- Stecken Sie den 16f84/16f628 Chip ,in der richtigen Richtung,in die Fassung!. Stecken Sie die +12 V Versorgungsspannung auf.
Versionen.
- Version 1.0:
- Initial release.
- Version 1.1:
- PCB: U3D and U3B inversion to make the PCB easier.
- Program: Modification of the explanations.
- Version 2.0:
- Schematic: Adding R15+R16. value of R2,R7,R10,C7. JP7=ground
- PCB: Adding R15+R16, JP7=gnd, pin
connection of bridge D4, thyristor Q1, U4, moving SIOV RV1 - Program: Advance calculation correction.
- Version 2.1:
- Schematic: Value of C7, C9
- Excel sheet: version= XLSA1.3
- Version PCM2.2:
- Program: Advance calculation
modification. (15000RPM max, dwell=2ms) - Excel sheet: version= XLSA1.4
- Program: Advance calculation
- Version PCM2.8:
- Program: Modification of register definitions.
- Excel sheet: version= XLSA2.2
- Version PCM3.0:
- Program: Advance calculation
correction. (26000RPM max at dwell=1ms) - Possibility of large advance values.
- Excel sheet: version= XLSA3.0
- Program: Advance calculation
- Version PCM3.2:
- Program: Advance calculation correction. (80000RPM max at dwell=1ms)
- Excel sheet: version= XLSA3.2
- Version PCM4.2:
- Program: simplification, 4MHz
crystal, suppression extra pluses at low RPM, reliabily. 1000 to 8000rpm - Excel sheet: version= XLSA4.2
- Program: simplification, 4MHz
- Version PCM4.3:
- Program: same as PCM4.2 but 1500 to 16000rpm (2strokes curve).
- Excel sheet: version= XLSA4.3
- Version 5.0:
- With DB9 connector
- Version 5.1:
- Corrections in software for XT400. Adding a program
for XT600, 2 strokes.
- Corrections in software for XT400. Adding a program
- Version 5.2:
- Suppress D4, R6,R7 values.
- Version 5.3:
- 2 map selectables. - ASM for 16f628 available
- Version 5.4:
- Improve RESET circuit R7+C12











