Hi ich habe ein kleines Problem mit Multisim. Und zwar hab ich mir ne kleine Schaltung aufgebaut mit einem PIC16F84A! Ich war mir nicht sicher ob ich einen Takt anschließen soll, denn Im PIC konnte man unter Eigenschaften schon nen Takt auswählen, mh komisch! Im Anhang ist ein Bild der Schaltung. Kurz was zum Programm es ist nur eine einfache Simulation für einen Komfortblinker, sprich 1xBlinkhebel Tippen = 3x Blinken. Und hier meine ASM Datei: ;*********************************************************************** ;Grundeinstellungen ;*********************************************************************** List p=16F84A ;Welcher Prozessortyp? include "P16F84A.inc" ;Einbinden einer Include Datei ;*********************************************************************** ;Einsprungvektoren ;*********************************************************************** ORG 0x000 ;power on reset vector goto mainl ;*********************************************************************** * ;Konfiguration der Ports ;*********************************************************************** * start: bsf STATUS,RP0 movlw B'00000011' movwf TRISA movlw B'00000000' movwf TRISB bcf STATUS,RP0 ;*********************************************************************** * ;Variablennamen vergeben ;*********************************************************************** * loops Equ 0x22 loops2 Equ 0x23 ;Zähler für Warteschleife ;*********************************************************************** * ;Hauptprogramm ;*********************************************************************** * mainl: BCF PORTB,1 BTFSC PORTA,0 PORTA,0 LOW ist goto mainr ;*********************************************************************** * mainr: BCF PORTB,0 BTFSC PORTA,1 call highr goto mainl ;*********************************************************************** ** highl: call wait BTFSS PORTA,0 call links goto mainl ;*********************************************************************** ** highr: call wait BTFSS PORTA,1 call rechts goto mainr ;*********************************************************************** * links: BSF PORTB,0 BTFSC PORTA,1 goto mainr call wait BCF PORTB,0 call wait BTFSC PORTA,1 goto mainr BSF PORTB,0 BTFSC PORTA,1 goto mainr call wait BCF PORTB,0 goto mainr ;*********************************************************************** *** rechts: BSF PORTB,1 BTFSC PORTA,0 goto mainl call wait BCF PORTB,1 call wait BTFSC PORTA,0 goto mainl BSF PORTB,1 BTFSC PORTA,1 goto mainl call wait BCF PORTB,1 goto mainl ;*********************************************************************** ***** ;Warteschleife (einstellbar) 1200ms=1,2s [D'1200'] ;*********************************************************************** ***** wait movlw .1000 movwf loops wait1 movlw .110 movwf loops2 wait2 nop nop nop nop nop nop decfsz loops2, F ;1 ms vorbei? goto wait2 ;nein, noch nicht decfsz loops, F ;250 ms vorbei? goto wait1 ;Nein, noch nicht retlw 0 ;das Warten hat ein Ende return end ;*********************************************************************** ******** Das eigentliche Problem ist nicht das Programm, sondern dass die Simulation in Multisim nicht läuft. Wenn ich in Multisim z.B. dem RA0 nen Impuls aufs Auge drücke tut sich am Ausgang nichts (Relais zieht nicht an). Kann mir da jemand weiter helfen iwas ist falsch. Greuß Nico
:
Gesperrt durch Moderator
Also zuerst würde ich mal einen externen Takt anschließen - oder wie soll der PIC sonst arbeiten? Dann würde ich mich mal im Programm mit Interrupts beschäftigen und vor allem mal mit den sog. Special-Function-Registern. So funktioniert das Programm nämlich auch nicht! Alleine schon der Versuch einen 'movlw .1000' in ein Register zu schieben wird wohl so nicht ganz klappen. Im Datenbuch stehen doch diverse Programmroutinen, wie mit welchen Registern umzugehen ist. Also die Devise lautet: ERST DAS DATENBUCH LESEN (und zwar ALLES) und dann anfangen zu programmieren. Gruß TK
Hi, danke erstmal! Ja ok dann ist das mit dem Takt klar war nur verwirrt, dass man bei den Eigenschaften schon nen Takt einstellen kann. Die Warteschleife ist nicht von mir geschrieben aber gut 'movlw .1000' geht nicht, weil max 255 als Dez geschrieben werden können (8bit)? Wieso sollte das Programm so nicht funktionieren abgesehen von der Warteschleife? Interrupts benutze ich doch überhauptnicht!? Ich habe die Ein/Ausgänge klar definiert. Ja und sonst benutze ich doch weiter keine Special Funktion Register. Sry bin relativ neu auf dem Gebriet..
>Interrupts benutze ich doch überhauptnicht!?
Genau das ist ja auch das Problem. Egal ob Interrupts benutzt werden
oder
nicht - es gibt auch hier eine Einsprungadresse - und da sollte immer
ein RETFIE stehen. Sicherheitshalber sollte man sich NICHT auf die
Vorgaben der SFR nach einem Power-On verlassen (alles schon selbst
erlebt)!! Also 'clrf INTCON' benutzen. Am besten auch noch
OPTION-Register belegen. Dann kann die Warteschleife evtl. mit einem
Timer realisiert werden.
Gruß
TK
Ach so - noch ein Nachtrag: >BCF PORTB,1 >BTFSC PORTA,0 >PORTA,0 LOW ist >goto mainr An dem Code-Schnippsel stimmt ja wohl auch was nicht, oder??? Gruß TK
So und jetzt Nachtrag der Letzte: Wie soll denn überhaupt ein L-Pegel an den Tastereingängen erkannt werden? Du betreibst die Pins im 'Floating'-Betrieb wenn die Taster nicht gedrückt sind. Das geht auch in die Hose! Gruß TK
Ja stimmt ist aber nur ein fehler beim kopieren hier ins forum. mainl: BCF PORTB,1 BTFSC PORTA,0 call high l goto mainr So sollte es aussehen.
Ja gut, da könnte man doch evtl. die internen Pull-Down Widerstaände aktivieren. Ne verdammt sind ja nur Pull-Ups, ja dann halt Pull downs an die Eingänge.
>Genau das ist ja auch das Problem. Egal ob Interrupts benutzt werden >oder nicht - es gibt auch hier eine Einsprungadresse - und da sollte immer >ein RETFIE stehen. Aber wenn wir das INTCON gelöscht haben kann es doch gar nicht mehr zu einem Interrupt kommen, da wir doch hier sämtliche Interupt Enable bits inklusive des GIE Bits auf 0 bzw. disable gesetzt haben. Nehmen wir and, dass ich es so machen würde bedeutet das, dass ich bei der Einsprungadresse direkt den RETFIE Befehl schreibe. Problem ist nur, dass er ja nach dem Interupt selbstständig dass GIE Bit wieder setzt. (Welches ich ja nur 1x Am Anfang des Programmes gelöscht habe) >Sicherheitshalber sollte man sich NICHT auf die >Vorgaben der SFR nach einem Power-On verlassen (alles schon selbst >erlebt)!! Also 'clrf INTCON' benutzen. Okay hab ich zwar selber noch nicht erlebt aber gut, schaden kann es ja nicht. >Am besten auch noch OPTION-Register belegen. >Dann kann die Warteschleife evtl. mit einem >Timer realisiert werden. Das OR ist ja bei Power on schon auf FF, was soll ich da noch ändern? Den Part verstehe ich noch nicht ganz.. Nochmal zur Warteschleife, diese würde funktionieren oder? Hier wird ja nur Dezimal 250 geschrieben. Wie aber mache ich das jetzt, wenn ich mehr brauche in meinem Fall rund 1sec..? Danke soweit! Wait movlw D'250' ; 250 ms Pause movwf loops Wai movlw .110 ; Zeitkonstante für 1ms movwf loops2 Wai2 nop ; nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto Wai2 ; nein, noch nicht ; decfsz loops, F ; 250 ms vorbei? goto Wai ; nein, noch nicht retlw 0 ; das Warten hat ein Ende end
Also die Schleife sollte jetzt so funktionieren. Dann nochmal was Grundlegendes: An Adr 0x04 im Programmspeicher liegt die Einsprungadr für die Interrupts. Jetzt stell Dir mal vor, du bekommst einen unsauberen Spannungspegel auf der Versorgungsleitung - vielleicht wegen HF, EMV oder einfach nur, weil die Versorgungsspannung beim Einschalten prellt! Der PIC kann laut Datenblatt in Abh. der Oszillatorfrequenz bis ca. 2.6V intern noch arbeiten. Ab da KÖNNEN Registerinhalte undefinierte Werte annehmen!!! Und dabei reicht es schon aus, wenn die Spannung für wenige us unter diesen Pegel fällt. (Jetzt kann man natürlich den Powen-On-Timer in den CONFIG-Fuses setzten, was auf jeden Fall sinnvoll ist!) Das kann auch dazu führen, daß z.B. das INTCON-Register zufällig Interrupts aktiviert. Das führt wiederum dazu, daß ein Interrupt an Adr 0x04 springt. Dummerweise liegt bei dir da schon Programmcode. Mit einem RETFIE wird zwar das GIE-Bit gesetzt, aber wenigstens läuft der Rest des Programms OHNE einen STACK-OVERFLOW weiter. Das sind nämlich Fehler (wenn Sie denn mal auftreten), die man unendlich lange suchen muß! Gleiches gilt für alle anderen SFR und GPR genauso. Eine sinnvolle Initialisierungsroutine sieht wie folgt aus: ORG 0x00 GOTO init ORG 0x04 RETFIE init (jetzt die PORTS vorgeben) (jetzt ALLE GPR auf 0 setzen) (jetzt ALLE SFR auf Initwerte setzen) (jetzt EVTL GPR vorbelegen) main clrwdt (hier die Hauptroutine vorgeben) goto main ORG (letzte Adresse) forever goto forever (>> wenn Programm jemals bis dahin kommt, gabs einen FATAL-ERROR, daher in eine Forever-Schleife eintreten, die dann den Watch-Dog aktiviert) Gruß TK
Es geht in dem angehängtem Bild nur darum, ob es mit dem Takt so funktionieren würde bzw. was daran falsch ist, denn er arbeitet nicht! Einen normalen Quarz finde ich in Multisim nicht. LG
Hallo, wieso nimmst Du nicht ein Steckboard und bestückst dieses mit einem minimalen Aufwand an Bauteilen (also 5V Versorgung mit 100nF Kondensator, Quarz / oder besser Resonator und evtl. eine LED)? Ich kenne das Simulationsprogramm nicht. Sollte aber gehen. Takt am OSCIN, Versorgungsspannung an VDD und VSS, MCLR auf H (am besten mittels 10k -> siehe Datenblatt). Gruß TK
Also es will immer noch nicht hinhauen! Ich habe jetzt ein total simples Programm geschrieben nur zum testen! Hier mal kurz der Code: List p=16F84A include "P16F84A.inc" ORG 0x00 goto Init ORG 0x04 RETFIE loops Equ 0x22 loops2 Equ 0x23 Init bsf STATUS,RP0 movlw B'00000011' movwf TRISA movlw B'00000000' movwf TRISB bcf STATUS,RP0 main BTFSC PORTA,0 BSF PORTB,0 BTFSC PORTA,1 BCF PORTB,0 call wait call wait Die Zeitschleife lasse ich jetzt mal weg. In den Bildern kann man meinen aufbau sehen und wie ich mit dem PIC arbeite. Vielleicht kann mir wer weiter helfen... LG Nico Bild1: http://www.bilder-hochladen.net/files/ib5-26.jpg Bild2: http://www.bilder-hochladen.net/files/ib5-27.jpg Bild3: http://www.bilder-hochladen.net/files/big/ib5-28.jpg
Auf der Homepage von NI habe ich eine kleine Anleitung gefunden damit komme ich aber auch nicht weiter.. http://zone.ni.com/devzone/cda/tut/p/id/5629 Übrigens, wurde hier für den PIC auch kein externer Takt angelegt! Hoffe immer noch auf Hilfe! Gruß
Also ich hab keine Ahnung, was das mit der Simulation soll??? Wenn Du mit einem PIC arbeitest, dann nimm bitte auch ein Microchip TOOL!!! MPLAB ist kostenfrei und hat einen Simulator eingebaut, ein Programmiertool, eine Entwicklungsumgebung usw.... Ich bin mir nicht sicher, ob der 16F84A einen internen Oszillator hat, aber ich glaube nicht. Daher muß eine ext. Quelle vorhanden sein. Übrigens müssen die FUSES vor dem Programmieren bzw. Simulieren richtig gesetzt sein, sonst funktioniert dein Programm auch nicht (also OSC auf XT setzen, WatchDog AUS, Rest ist egal.) PS: nach dem letzten CALL wait sollte irgendwann auch mal wieder ein goto main kommen. Gruß TK
TK wrote: > Also ich hab keine Ahnung, was das mit der Simulation soll??? > Wenn Du mit einem PIC arbeitest, dann nimm bitte auch ein Microchip > TOOL!!! > MPLAB ist kostenfrei und hat einen Simulator eingebaut, ein > Programmiertool, eine Entwicklungsumgebung usw.... Alles schon passiert, es hat aber kein LCD Tool. In MPLAB funktioniert alles! > Ich bin mir nicht sicher, ob der 16F84A einen internen Oszillator hat, > aber ich glaube nicht. Daher muß eine ext. Quelle vorhanden sein. Hat er! > Übrigens müssen die FUSES vor dem Programmieren bzw. Simulieren richtig > gesetzt sein, sonst funktioniert dein Programm auch nicht (also OSC auf > XT setzen, WatchDog AUS, Rest ist egal.) Passiert im Quelltext! > PS: nach dem letzten CALL wait sollte irgendwann auch mal wieder ein > goto main kommen. Copy Paste Fehler, da ist ein goto main! > Gruß > TK Danke
Sorry, das mit der LCD Anzeige ist natürlich Unsinn. Ich war gerade mit meinen Gedanken wo anders... Es geht mir eigentlich nur darum mit dem Programm mehr Praxis zu kriegen, damit mann später vielleicht nochmal sachen mit dem PIC simulieren kann. Ich meine MPLAB ist ja schön und gut aber es verfügt aber eben nicht über solche Tools wie LCD. Gruß
Hi schau mal bei www.oshonsoft.com/pic.html guter PIC Simulator mit LCD , 7 Segment, Stepper und mehr Gruss Mastereric
Hi, den habe ich bereits aber der stellt seltsame sachen mit dem Z-Flag an! Siehe hier: Beitrag "Kleines Problem mit dem Z-Flag" Und da ich mit dem Z-Flag arbeite..
Beitrag #6419845 wurde von einem Moderator gelöscht.
Beitrag #6462372 wurde von einem Moderator gelöscht.
Beitrag #6462373 wurde von einem Moderator gelöscht.
Beitrag #6462375 wurde von einem Moderator gelöscht.
Hi Nico ich weiss ja nicht, wie du zu dem PiC16F84 gekommen bist. Zum Anfangen ist das ein sehr unglückliches Modell. Deutlich bessere Nachfolger sind z.B. der PIC16F627A. Auch der Preis ist da besser. Alle PIC's, die nach dem F nur eine 2-stellige Zahl haben, gehören zur ersten Generation des PIC16. Aktuell haben die PIC16 in der 3. Generation eine 4-stellige Zahl und sind auch gut in C programmierbar. Gruß
Beitrag #6462458 wurde von einem Moderator gelöscht.
Ich denke, das wird er nach 11 Jahren, die der Thread alt ist, auch nicht mehr wissen ;)
Beitrag #6462462 wurde von einem Moderator gelöscht.
Beitrag #6462464 wurde von einem Moderator gelöscht.
Beitrag #6463263 wurde von einem Moderator gelöscht.
Beitrag #6463267 wurde von einem Moderator gelöscht.
Beitrag #6463268 wurde von einem Moderator gelöscht.
Beitrag #6471013 wurde von einem Moderator gelöscht.
Beitrag #6508206 wurde von einem Moderator gelöscht.
Beitrag #6530574 wurde von einem Moderator gelöscht.
Beitrag #6530905 wurde vom Autor gelöscht.
Beitrag #6611909 wurde von einem Moderator gelöscht.
Beitrag #6613454 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.