Hallo alle zusammen, da ich mit meinem Latein was PIC-Programmierung betrifft so langsam am ende bin, dachte ich mir ich frag mal hier um Hilfe... Womit ich dann auch direkt bei meinem Problem wäre: Ich versuche beim PIC16F84A den PORT RA4 als Ausgang zu nutzen. Da dieser Port aber ein open-drain-Ausgang besitz, hab ich nen 4,7K Widerstand als pullup an RA4 verwendet. Aber im Betrieb tut sich rein gar nichts... D.h. RA4 egal ob 0 oder 1 in PORTA steht ist stets auf Masse geschaltet??? Gibt es dafür ne logische Erklärung? Wäre Euch für jeden Ratschlag sehr dankbar. Anbei noch ein Programmbeispiel, mit dem ich die ganze Zeit am ausprobieren bin, was sich an RA4 tut. Das Programm macht nichts anderes als abwechselnd die Ausgänge RA3 und RA4 zu setzen bzw rückzusetzen. list P=16F84A include <p16F84A.inc> ERRORLEVEL -302,-305 __config _XT_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF ;****************************** PIC Initialisieren ****************************** org 0000 goto PICINIT PICINIT org 0008 clrf PORTA ; reset PORTA clrf PORTB ; reset PORTB bsf STATUS, RP0 ; Bank 1 clrf TRISA ; PortA Ausgang bcf TRISB, 7 ; RB7 Ausgang bcf OPTION_REG, NOT_RBPU ; Pull-ups ein bcf OPTION_REG, T0CS bcf STATUS, RP0 ; Bank 0 clrf PORTA ; reset PORTA clrf PORTB ; reset PORTB ;********************************* Programm-Start ******************************** START btfsc PORTA, 3 ; Abfrage PORTA RA4 aktiv? goto rueck bsf PORTA, 4 ; Ausgang RA4 aktiv bsf PORTA, 3 call Zeitschleife goto START rueck bcf PORTA, 4 ; Ausgang RA4 aktiv bcf PORTA, 3 call Zeitschleife goto START Vielen DANK für Eure Hilfe Gruß TIC
Rührt sich am RA3 etwas? Versuche mal, eine interne Variable und nicht das Output-Register selbst für die Abfrage zu verwenden. RA4 ist auch noch T0CKI. Was ist während Reset, geht da RA4 wegen des PullUps hoch? Evtl. PullUp überprüfen. Evtl. ist die Zeitschleufe so kurz, dass zu wenig Zeit bleibt, das Pin über R hochzuladen (kapazitive Last).
Hallo Profi, RA3 wechselt schön im sekundentakt den Pegel. Den Timer0 hab ich vorsichtshalber mal dem internen Takt zugewisen, damit es mit RA4 nicht zu irgendwelchen Problemen kommen kann... (auf was für Ideen man kommt, wenn einfach keine logische Erklärung mehr hat...) Ich hab leider kein Oszi zur Hand, daher messe ich auch mit nem Multimeter. Damit erkennt man aber auch ganz gut, dass sich was an RA3 tut. RA4 hatte ich auch schon ohmisch (ohne pullup) durgemessen. Dabei sollte ja eigentlich immer zwischen Hochohm- und Nierderohmbereich gewechselt werden. Allerdings bestätig sich auch heirbei mein geschildertes Problem, da ich immer nur nen niederohmigen Zustand an RA4 messe. Wie meinst du das mit der internen Variable? PORTA in bel. Register schieben und von dort aus den Zustand überprüfen? Vielen Dank für die Unterstützung! Gruß TIC
Schreib mal ein nop zwischen die beiden bsf's. bsf nutzt einen read-modify-write Zyklus. Der erste bsf schreibt ganz am Ende des Zyklus und der zweite liest ganz am Anfang des nächsten Zyklus die Pin-Werte aus, modifiziert das Bitmuster und schreibt es wieder. Ist der letzte Zugriff noch nicht wirklich an den Pins angekommen liest er 0. Das hatte ich kürzlich auch, habe stundenlang gesucht... Nie zwei solcher Befehle nacheinander schreiben! Uwe
Diese verfixte nop war doch tatsächlich die Ursache meines Problems... Wär ich nicht draufgekommen. Nach Abändern des Programms hat tatsächlich auch RA4 ebenso wie RA3 den Takt erzeugt. Herzlichen Dank Uwe!!! Für alle dies noch interessiert hier nun das funktionierde Programm: ;PIC Initialisieren org 0000 goto PICINIT PICINIT org 0008 clrf PORTA ; reset PORTA clrf PORTB ; reset PORTB bsf STATUS, RP0 ; Bank 1 clrf TRISA ; PortA Ausgang bcf TRISB, 7 ; RB7 Ausgang bcf OPTION_REG, NOT_RBPU ; Pull-ups ein bcf STATUS, RP0 ; Bank 0 clrf PORTA ; reset PORTA clrf PORTB ; reset PORTB ; Programm-Start START btfsc PORTA, 3 ; PORTA RA3 aktiv? goto rueck bsf PORTA, 4 ; Ausgang RA4 aktiv nop ; DAS WAR DER ÜBELTÄTER bsf PORTA, 3 ; Ausgang RA3 aktiv call Zeitschleife goto START rueck bcf PORTA, 4 ; Ausgang RA4 inaktiv nop bcf PORTA, 3 ; Ausgang RA3 inaktiv call Zeitschleife goto START Gruß TIC
Kleiner Hinweis noch. Verwende das nächste mal die LAT-Register. Dadurch verhindest du dieses PRoblem. http://www.fernando-heitor.de/index.php?option=com_smf&Itemid=27&topic=1160.0
Der 16f84 hat leider kein LAT-Register. Aber gut zu wissen, dass es sowas gibt...
achso, da fällt mir gerade ein: tritt diese Problem nur bei bsf oder auch bei bcf auf? Müsste doch vom logischen her, selbes Prinzip sein...
Das Problem dürfte immer dann auftreten, wenn direkt nach dem Schreiben ein Port wieder gelesen wird. bsf PORTA,4 movf PORTA,w wird auch nicht unbedingt eine 1 in Bit4 vom W-Register lesen falls PORTA,4 vor dem bsf 0 war. Das ganze ist wohl nicht nur ein Problem vom Open-Drain Ausgang PORTA,4 der ist allerdings besonders betroffen, weil sein Eins-Zustand ja über einen externen Pullup erzeugt wird. Ist der zu groß oder eine hohe Lastkapazität dran, dann bleibt der Ausgang noch eine ganze Weile nach dem setzen auf logisch Null. Ich hatte den gleichen Effekt neulich mit PORTA,2 und 3. Ich muss wohl mal erforschen, ob das ein Problem an allen Leitungen ist. Wenn ja frage ich mich allerdings warum meine LCD-Ansteuerung an POTB seit Jahren unauffällig läuft, da gibt es mehrere solche kritischen Stellen...
Folgendes wir sollen in der Ausbildung die Leds laufen lassen doch leider geht eine der Leds nicht da RA4 kein Signal an die LEDS schickt bitte um Hilfe. Welchen Code oder Befehl brauchen wir dazu oder geht dies garnet??
Wie habt ihr denn die LEDs angeschlossen?! Schau mal in die "Pinout Discription". RA4 ist ein OD (Open Drain Ausgang). Das heist du musst dieses LED im Sink-Mode.. also +5V---Widerstand---LED>--RA4.. anschliessen. mfg Schoasch
Danke, aber Softwaretechnisch ist es also nicht möglich oder sehe ich dies falsch!
Wie sollte das denn möglich sein wenn es ein Open Drain Ausgang ist? Du könntest lediglich die Schaltung etwas "umpfuschen".Dazu müsstest du die LED zwischen RA4 und GND hängen und einen Pull-Up mit 1k an RA4. Aber Jedesmal wenn du RA4 auf 0 setzt fließt ein Strom in den PIC und die LED wird kurz geschlossen. http://www.sprut.de/electronic/pic/grund/ioports.htm
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.