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.....
:
Bearbeitet durch User
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 vom Autor 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.
:
Bearbeitet durch User
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.ä.).
:
Bearbeitet durch User
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.