Forum: Mikrocontroller und Digitale Elektronik Multisim - PIC Schaltung arbeitet nicht!


von Nico (Gast)


Angehängte Dateien:

Lesenswert?

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
von TK (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von TK (Gast)


Lesenswert?

>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

von TK (Gast)


Lesenswert?

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

von TK (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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.

von PIC N. (eigo) Benutzerseite


Lesenswert?

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.

von Nico (Gast)


Lesenswert?

>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

von TK (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von TK (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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ß

von TK (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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ß

von Mastereric (Gast)


Lesenswert?

Hi
schau mal bei www.oshonsoft.com/pic.html
guter PIC Simulator mit LCD , 7 Segment, Stepper und mehr

Gruss Mastereric

von PIC N. (eigo) Benutzerseite


Lesenswert?

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.
von Franko P. (sgssn)


Lesenswert?

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.
von Moko (Gast)


Lesenswert?

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.
von Franko P. (sgssn)


Lesenswert?

jaja, wieder reingefallen... :-))

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.