Ich befasse mich erst seit einigen Monaten mit der Programmierung von PIC's. Für mich als Laie (von Beruf Schlosser) ein faszinierendes Thema. Die HP Sprut.de ist mir dabei ein ständiger Begleiter und ich hab schon einige kleinere Projekte nachgebaut. Bin grade bei der Stoppuhr mit PIC 16F84 gelandet. Habe die Schaltung exakt nachgebaut und siehe da, sie funktioniert. Meine Idee war, die kleinen 7-Segment Anzeigen durch große 100mm Anzeigen zu ersetzen. Habe die Schaltung modifiziert und als Treiber (High) UND2981A und als Treiber(Low) ULN2803A verdrahtet. Habe die Schaltung mit einfacher Ansteuerung getestet und sie funktioniert. Nun mein Problem: Da die kleinen Digits direkt bzw. gem. Anode über einen PNP Transistor an den Pic gingen brauchten sie um zu leuchten jeweils ein Low Pegel am Ausgang. Mit den beiden Treiber IC's ist es aber umgekehrt. Was muss ich nun im Programm ändern? ich habe in meiner Unwissenheit schon verschiedene Einstellungen (ISR,Initalisierung etc.) ausprobiert. Die Anzeigen bleiben immer dunkel. Wäre klasse wenn ihr Profis mir einen Tipp geben könntet.
Kalle schrieb: > Wäre klasse wenn ihr Profis mir einen Tipp geben könntet. Du meinst also die drei Programme (oder waren es vier) die im Internet kursieren kennen wir alle auswendig? Merke: du willst Hilfe und wir sollen helfen. Dann zeige uns genau was du hast, denn wir sind es leid uns nach träglich die Informationen aus dem Internet zu holen nur weil du zu faul dazu bist.
Kalle schrieb: > Was muss ich nun im Programm ändern? Überall da wo die betreffenden Ports gesetzt o. gelöscht werden, das genaue Gegenteil tun, fettig.
Gefunden. ; 7-Segment-Tabelle Segmente addwf PCL, f retlw B'00011000' ; 0 retlw B'11011110' ; 1 retlw B'00110010' ; 2 retlw B'01010010' ; 3 retlw B'11010100' ; 4 retlw B'01010001' ; 5 retlw B'00010001' ; 6 retlw B'11011010' ; 7 retlw B'00010000' ; 8 retlw B'01010000' ; 9 Du musst einfach alle '0' durch '1' ersetzen, und vice versa.
Oh je, du bist ja klasse drauf. Ich hab immer gedacht so ein Forum ist dazu da um sich zu helfen. Mich als faul zu beschimpfen tut mir echt weh, zumal ich 14 Stunden am Tag arbeite. Wenn ich hier in ein Wespennest gestochen habe , entschuldige ich mich dafür.Aber trotzdem danke für deine schnelle Antwort.
Das war nicht wirklich auf dich gemünzt. Sowas passiert hier dutzende mal am Tag, bzw. ist quasi Standard, da fällt es schwer durchgängig freundlich zu bleiben.
Kalle schrieb: > Danke für die Antwort, aber das habe ich getan und nichts passiert. Dann steck noch woanders der Hund drin. An der SW sollte es aber nicht liegen. Tut's der µC überhaupt?
Kalle schrieb: > Mit den beiden Treiber IC's ist es aber umgekehrt. > Was muss ich nun im Programm ändern? ich habe in meiner Unwissenheit > schon verschiedene Einstellungen (ISR,Initalisierung etc.) ausprobiert. > Die Anzeigen bleiben immer dunkel. Ich denke nicht, daß das Problem nur am zu ändernden Programm liegt - da müsste sich zumindest irgend etwas tun, d.h. die falschen Segmente und/oder die falschen Digits angesteuert werden und irgendwas müsste aufblinken, wenn auch unlesbar. Aber "alles dunkel" deutet für mich auf ein anderes Problem hin, z.B. falsche Polarität der Anzeige.
Kalle schrieb: > Da die kleinen Digits direkt bzw. gem. Anode über einen PNP Transistor > an den Pic gingen brauchten sie um zu leuchten jeweils ein Low Pegel am > Ausgang. Gut analysiert. > Mit den beiden Treiber IC's ist es aber umgekehrt. Richtig. > Was muss ich nun im Programm ändern? Welchem Programm. Ich sehe keines. Also kann man nur allgemein sagen, dass vor der Ausgabe sowohl der Segmente (was hinz Vorschlag macht) als auch der Digits (was er vergessen hat) die betroffenen bits invertiert werden müssen.
Ich hab die Schaltung mit einem einfachen Programm, mit dem selben Pic getestet. Also Multiplexing mit einfacher Zeitschleife, Ansteuerung jeder einzelnen Anzeige etc. alles funktioniert.Habe dann das Programm von Sprut(Stoppuhr) mit meinen Änderungen in der 7-Segment Tabelle (also bit 0 auf 1 gesetzt) und Portregister modifiziert. Ich werde am besten mal meine Änderungen im ASM-Code schicken.
MaWin schrieb: > Welchem Programm. Es geht vermutlich um dieses Lernbeispiel: http://www.sprut.de/electronic/pic/programm/stop.htm
Kalle schrieb: > Portregister modifiziert Scheint das dabei was schief lief. Ich würde da mal ansetzen zu suchen.
MaWin schrieb: > als > auch der Digits (was er vergessen hat) die betroffenen bits invertiert > werden müssen. Mea culpa. Und auch noch vergessen hab ich die Initialisierung der Ports und die Behandlung des Dezimalpunkts. Morgen ist auch noch ein Tag.
Vielen Dank für eure Tipps, werde alles nochmal überprüfen. Schicke Morgen mal den Code. Also schlaft gut.
hinz schrieb: > Und auch noch vergessen hab ich die Initialisierung der Ports Was sollte sich da geändert haben, das er andre Ports verwendet, hat er doch nie erwähnt.
Thomas E. schrieb im Beitrag #5402868 > Es geht vermutlich um dieses Lernbeispiel: > http://www.sprut.de/electronic/pic/programm/stop.htm Dann muss er halt alle bsf PORTA und bsf PORTB gegen bcf PORTA und bcf PORTB ersetzen und alle bcf PORTA und bcf PORTB gegen bsf PORTA und bsf PORTB.
Hier mal der Code in asm. Meine Änderungen sind unterstrichen alles
Andere ist nicht verändert worden. Die 4 Siebensegmente sind genauso
angeschlossen wie in der Sprutschaltung, also an die selben
Ausgansports.
list p=16f84a ;definiert den verwendeten Prozessor
#include <p16f84a.inc> ;in diesem File stehen die Adressen und
Bitnamen
ERRORLEVEL -302
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
; Variablennamen vergeben
w_copy Equ 0x20 ; Backup für Akkuregister
s_copy Equ 0x21 ; Backup für Statusregister
Ziffer1 Equ 0x22 ; Wert des LSD
Ziffer2 Equ 0x23 ; Wert der zweitkleinsten Stelle
Ziffer3 Equ 0x24 ; Wert der zweitgrößten Stelle
Ziffer4 Equ 0x25 ; Wert des MSD
Digit Equ 0x26 ; Ziffernzähler
ar Equ 0x27
Timer2 Equ 0x28 ; Vorteiler von 50 Hz auf 10 Hz
;**************************************************************
; los gehts mit dem Programm
org 0
goto Init
;**************************************************************
; die Interuptserviceroutine
org 4
intvec
bcf INTCON, GIE ; disable Interupt
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;
movlw D'131' ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
movwf TMR0
; Intrupt servic routine
Int_serv
bcf PORTA, 0 ; Ziffer1 aus
bcf PORTA, 1 ; Ziffer2 aus
bcf PORTA, 2 ; Ziffer3 aus
bcf PORTA, 3 ; Ziffer4 aus
decf Digit,f ; Ziffernzähler verringern
;Digit=4: anzeigen Ziffer 4
;Digit=3: anzeigen Ziffer 3
;Digit=2: anzeigen Ziffer 2
;Digit=1: anzeigen Ziffer 1
;Digit=0: andere Aktionen, keine Anzeige
btfsc STATUS, Z
goto Int_0 ; Z-Flag=1 ergo Digit=0
movfw Digit
movwf ar
decf ar, f
btfsc STATUS, Z
goto Int_1 ; Digit=1
decf ar, f
btfsc STATUS, Z
goto Int_2 ; Digit=2
decf ar, f
btfsc STATUS, Z
goto Int_3 ; Digit=3
goto Int_4 ; Digit=4
Int_0
movlw 5
movwf Digit
btfss PORTA, 4
goto Int_end ; Stop-Taste gedrückt
decf Timer2, f ; von 5 bis 0 zählen (50 Hz / 5 = 10 Hz)
btfss STATUS, Z
goto Int_end ; Timer2 <> 0
movlw 5
movwf Timer2
incf Ziffer1, f ; 1/10 Sekunden erhöhen
movlw D'10'
subwf Ziffer1, w
btfss STATUS, Z
goto Int_end ; 1/10 Sekunden <> 10
clrf Ziffer1
incf Ziffer2, f ; 1/10 Sekunden erhöhen
movlw D'10'
subwf Ziffer2, w
btfss STATUS, Z
goto Int_end ; 1 Sekunden <> 10
clrf Ziffer2
incf Ziffer3, f ; 10 Sekunden erhöhen
movlw D'6'
subwf Ziffer3, w
btfss STATUS, Z
goto Int_end ; 10 Sekunden <> 6
clrf Ziffer3
incf Ziffer4, f ; 1 Minuten erhöhen
movlw D'10'
subwf Ziffer4, w
btfss STATUS, Z
goto Int_end ; 1 Minuten <> 10
clrf Ziffer4
goto Int_end
Int_1
movfw Ziffer1 ; Wert der 1. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bsf PORTA, 0 ; 1. Ziffer einschalten
goto Int_end
Int_2
movfw Ziffer2 ; Wert der 2. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bsf PORTA, 1 ; 2. Ziffer einschalten
goto Int_end
Int_3
movfw Ziffer3 ; Wert der 3. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bsf PORTA, 1 ; 3. Ziffer einschalten
goto Int_end
Int_4
movfw Ziffer4 ; Wert der 4. Ziffer
call Segmente
movwf PORTB ; Segmente einschalten
bsf PORTA, 3 ; 4. Ziffer einschalten
goto Int_end
Int_end swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
bcf INTCON, T0IF ; Interupt-Flag löschen
bsf INTCON, GIE ; enable Interupt
retfie
; 7-Segment-Tabelle
Segmente
addwf PCL, f
retlw B'11100111' ; 0
retlw B'00100001' ; 1
retlw B'11001101' ; 2
retlw B'10101101' ; 3
retlw B'00101011' ; 4
retlw B'10101110' ; 5
retlw B'11101110' ; 6
retlw B'00100101' ; 7
retlw B'11101111' ; 8
retlw B'10101111' ; 9
;**************************************************************
; Port A/B auf Ausgabe stellen
Init
movlw B'00000000'
movwf PORTA
movwf PORTB ; Anzeige dunkel
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11110000' ; PortA RA0-RA3 output
movwf TRISA
movlw B'00000000' ; PortB alle output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
; Zeit 0 einstellen
clrf Ziffer1
clrf Ziffer2
clrf Ziffer3
clrf Ziffer4
movlw 5
movwf Digit ; Ziffernzähler einstellen
; 250 Hz-Timer-Interupt einstellen
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'10000100' ; internen Takt zählen, Vorteiler zum Timer0, 32:1
movwf OPTION_REG
movlw D'131' ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
movwf TMR0
movlw 5
movwf Timer2 ; 50Hz -> 10 Hz Teiler
bsf INTCON, T0IE ; Timer0 interupt erlauben
bsf INTCON, GIE ; Interupt erlauben
loop
goto loop ; eine Endlosschleife
;**********************************************************
end
gerade den Code überflogen Ist das nicht so das zwischen loop und goto loop irgend ein Code stehen sollte? Sonst macht der nichts. Sorry läuft wohl im interrupt dann nehme ich alles zurück, und.....
Hier mal der Schaltplan mit den großen Anzeigen. Vorwiderstände sind nur für den DP nötig. Ich gehe über ein regelbares Netzteil mit 10 Volt rein und die Schaltung (Verpolungsschutz, Treiber etc.) verbraucht ca. 2,4 V sodass zur Ansteuerung der 7-Semente ca.7,6 V übrig bleiben. Das bringt sie gerade so zum leuchten dass man es noch gut erkennen kann. Die der Stromverbrauch der Segmente bewegt sich dann in einem unkritischem Bereich.Wie gesagt habe ich die Schaltung mit dem selben PIC mit einfachen Testprogrammen (multiplexen, einzelne Ansteuerung der Digits)ausprobiert und sie machen das was sie sollen. Ich vermute, dass der Fehler irgendwo in dem Interruptprogramm liegt.
Beitrag #5403418 wurde von einem Moderator gelöscht.
Servus, das hat zwar vermutlich nichts mit dem eigentlichen Fehler zu tun (den konnte ich in Deinem Code auch noch nicht entdecken - der sieht eigentlich richtig aus), aber: Die SB130 ist sehr seltsam platziert - als Verpolungsschutz wirkt sie so nicht für den PIC und den Spannungsregler. Außerdem verschiebt sie das Massepotential zwischen PIC und den Treibern. Die sollte wohl besser direkt in die (+)-Leitung vom Netzteil.
Kalle schrieb: > Vorwiderstände sind nur > für den DP nötig. Nein, brauchst du für alle Segmente, der vom DP ist lediglich größer.
In der Orginalschaltung von Sprut sind Transistoren in den Anodenleitungen. Diese negieren das Signal gleichzeitig. Dein jetziger Anodentreiber tut das nicht. Das gleiche bei dem Segmenttreiber. Der ULN2803 negiert jetzt das Signal was vorher nicht war. Wenn du beide Treiber miteinander austauschst könnte es funktionieren. Oder wie schon erwähnt im Programm alle Portausgaben negieren.
Oh, da geb ich dir Recht. Die schützt ja den Spannungsregler nicht. Werde sie gleich umlöten. Hat aber keine Auswirkung auf den Ablauf, da ich bei meinen Versuchen diese weggelassen habe. Aber vielen Dank für den guten Tip.
Sehr interresanter Vorschlag. Werde ich mal ausprobieren und melde mich dann.
Manni schrieb: > In der Orginalschaltung von Sprut sind Transistoren in den > Anodenleitungen. Diese negieren das Signal gleichzeitig. Dein jetziger > Anodentreiber tut das nicht. Das wars dann glaube ich. Den Code für die Segmenttreiber wieder Retoure auf Original. Manni schrieb: > Das gleiche bei dem Segmenttreiber. Der > ULN2803 negiert jetzt das Signal was vorher nicht war. Nein das tut er nicht, passt also, das dies geändert wurde.
Teo D. schrieb: > Nein das tut er nicht, passt also, das dies geändert wurde. trotzdem muss ich die Segmentausgaben jetzt negieren.
Teo D. schrieb: > Den Code für die Segmenttreiber wieder Retoure auf Original. Stimmt doch gar nicht! Mit den Transistoren wird das Digit durch Low-Pegel aktiviert, mit dem Treiber aber durch High-Pegel -> muss also gegenüber der original-Programmversion invertiert werden!
Manni schrieb: > Teo D. schrieb: >> Nein das tut er nicht, passt also, das dies geändert wurde. > > trotzdem muss ich die Segmentausgaben jetzt negieren. Du meinst sicher ER muss?! Wie kommst du drauf? (bin grad zu faul selber zu denken, sorry)
Thomas E. schrieb: > -> muss also > gegenüber der original-Programmversion invertiert werden! Hat er doch so gemacht, also wieder zurück....
Habe mir deinen Vorschlag mal zu Brust genommen, wird aber daran scheitern dass der ULN ein NPN Array ist und nur nach GND schalten kann. Beim UDN ist es umgekehrt. Der ist ein PNP und kann nur nach VSS schalten.
Kalle schrieb: > Habe mir deinen Vorschlag mal zu Brust genommen, wird aber daran > scheitern dass der ULN ein NPN Array ist und nur nach GND schalten kann. ULN2803 Invertiert. ULN2981 Invertiert nicht!
Teo D. schrieb: > Wie kommst du drauf? > (bin grad zu faul selber zu denken, sorry) Der ULN2803 muss invertiert angesteuert werden. Vorher war ein L notwendig um ein Segment einzuschalten. Jetzt ist ein H notwendig um den ULN2803 nach Ground durchzuschalten. ok?
Manni schrieb: > Jetzt ist ein H notwendig um den ULN2803 nach > Ground durchzuschalten. ok? Ja. Verschwurbelt war, das ich vom TO bereits geänderten Code sprach und du vom unveränderten Original Code. :(
Manni schrieb: > ein Segment einzuschalten. Jetzt ist ein H notwendig um den ULN2803 nach > Ground durchzuschalten. ok? Und bei den Anoden haben im original die Transistoren invertiert und die Treiber tun es nicht, also müssen auch diese Signale invertiert werden. Soweit ich sehe, hat Kalle das aber schon alles richtig gemacht.
Kalle schrieb: > Habe mir deinen Vorschlag mal zu Brust genommen, wird aber daran > scheitern dass der ULN ein NPN Array ist und nur nach GND schalten kann. Da hast du recht, aber das Problem ist jetzt klar. Wie wäre es vor jeden Treiber noch einen Cmos Negator zu setzen. Dann stimmt wieder alles.
Wenn der Schaltplan so mit dem Aufbau übereinstimmt, sind aber beim UDN2981 die Ein- und Ausgänge vertauscht! Pins 1..8 sind nämlich die Eingänge, 11..18 die Ausgänge.
Gute Idee. Ist das richtig gedacht von mir, dass ich den Negator mit einem N-Channel und einem P-Channel Mosfet aufbauen kann?
Ne ist richtig. Die Schaltung würde sonst nicht mit meinen Testprogrammen funktionieren.
Sorry, du hast natürlich Recht. Im Schaltplan ist es verkehrt angeschlossen. Aber auf meiner Platine ist es richtig herum. Schicke nochmal die Änderung
Kalle schrieb: > Gute Idee. Ist das richtig gedacht von mir, dass ich den Negator mit > einem N-Channel und einem P-Channel Mosfet aufbauen kann? Sorry, was soll denn daran eine gute Idee sein? Das wäre für mich Kapitulation und hilf- und aussichtsloses herumdoktoren an Symptomen. Eine Invertierung der Signale kann man ebenso gut (nein, besser!) per Software-Anpassung machen. Und wenn wirklich das das Problem wäre, wären die Segmente nicht einfach nur dunkel, sondern würden halt was falsches Anzeigen (Minus-Zeichen statt 0 o.ä.).
Hier die Änderung im Schaltplan. Sorry ich hoffe das hat nicht allzuviel Verwirrung gestiftet.
Da gebe ich dir natürlich Recht. Die Beste Lösung wäre, das Programm zum Laufen bringen. Ich weiß auch nicht ob so ein Negator schnell genug schalten kann. Wären dann vielleicht auch wieder neue Fehlerquellen die ich mir einbauen würde.
Chaos.... Beide Treiber sind aktiv Hi. Der zuletzt gepostet Code macht das. Wenn NICHTS leuchtet, ist der PIC falsch konfiguriert oder die HW ist fehlerhaft. Du schriebst ja, das du eben diesen Aufbau schon getestet hast. Also sollten die Segmente eine gemeinsame Anode besitzen? Dann bleiben nur noch die Treiber über, bei denen was nicht passt.
hinz schrieb: > Immer noch keine Widerstände... Das juckt die Treiber herzlich wenig. Die Lebensdauer der LEDs könnte aber massiv verkürzt werden....
Kalle schrieb: > Hier mal der Schaltplan mit den großen Anzeigen. Wie kommt man auf so abstruse Schaltungen ? Was macht die Diode in GND ? > Vorwiderstände sind nur für den DP nötig. Nein, natürlich nicht, wie kommt man auf so einen Unsinn ? Bei Sprut findet man so einen Unsinn nicht, der hat Widerstände drin und keine dumme Diode. Und wenn denn mal die Anzeigen wirklich common anode sind, bei Mouser steht common cathode aber im Datenblatt common anode https://www.mouser.de/ProductDetail/Kingbright/SA40-19GWA?qs=DkZGzo4b%252bTL8vrYSjxcvgg== Kalle schrieb: > Hier die Änderung im Schaltplan. Häh ? Thomas E. schrieb: > Wenn der Schaltplan so mit dem Aufbau übereinstimmt, Das auch noch. Thomas E. schrieb: > Soweit ich sehe, hat Kalle das aber schon alles richtig gemacht Im Programm scheint es zu passen. Manni schrieb: > Wenn du beide Treiber miteinander austauschst könnte es funktionieren Dann braucht er common cathode statt common anode Displays.
An alle freundlichen Menschen die mich hierbei unterstützt haben. Die Schaltung funktioniert jetzt. Der Quarz hat sich verabschiedet. Habe jetzt einen 16f627a drin (hatte keinen Quarz mehr) und es läuft. Vielen vielen Dank für eure Mühe
Teo D. schrieb: > Dann steck noch woanders der Hund drin. An der SW sollte es aber nicht > liegen. Tut's der µC überhaupt? Kalle schrieb: > Ich hab die Schaltung mit einem einfachen Programm, mit dem selben Pic > getestet. :( Kalle schrieb: > Der Quarz hat sich verabschiedet. Muss nicht sein, der 16f84(a) hat da etwas Schwierigkeiten, manche Quarze anschwingen zu lassen. Da hilft ein 1MOhm parallel dazu.
Hallo Was hast du letzendlich alles geändert? Ich versuche seit fast einer Woche den selben kode mit pic16f84a und bin dabei erfolgslos. Hat jemand vielleicht noch in Tipp?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

