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
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 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, 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..
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ß