Forum: Mikrocontroller und Digitale Elektronik PIC16F57 Initialiesierung


von Johannes Rietz (Gast)


Lesenswert?

Hallo Forumgemeinde.

Ich habe da ein paar kleine Probleme mit dem PIC16F57 ... unzwar ist mir 
die Initialiesierung nicht so ganz einleuchtend ... habe vorher den 
PIC16F84A programmiert ... dies viel mir recht leicht aber bei diesem 
neuen PIC ???

zBsp.: will ich PORTA als Ausgang definieren und einfach nur eine LED an 
PORTA,0 an und wieder aus machen! im Datenblatt ist es doch so erklärt 
das es garkein echtes TRIS-Register mehr gibt oder ? Das Bänke rücken 
vom 16F84A sollte damit ja umgangen sein...

      movwf     B'00000000'
      tris      PORTA

Ist das bereits die Initialiesierung für PORTA

so dann:

m1    bsf       PORTA,0
      call      wait
      bcf       PORTA,0
      call      wait
      goto      m1

dadrunter halt die Warteschleife!!!

vill kann mir wer helfen ...

als Config habe ich:

      __CONFIG        _CP_OFF & _WDT_OFF & _XT_OSC


vielen dank im vorraus :)

von Jens (Gast)


Lesenswert?

Der 16F57 ist stark eingeschränk, auch was die Stacktiefe betrifft. Da 
muss ich mir aber erstmal das Datenblatt ziehen, mit dem Teil habe ich 
noch nicht gearbeitet.

von Johannes Rietz (Gast)


Lesenswert?

Hallo danke für die schnell Antwort ...
Das dieser Pic in seinen möglichkeiten eingeschränkt ist habe ich im 
Datenballt gesehen...
Was genau ist der Stack nochmal ... da wo ich zwischen Ergebnisse 
speichere???

zum Beispiel den Wert eine Zählschleife ???

Ich Entschuldige mich schonmal für meine Unwissenheit :(

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Nein, bei diesen PICs kannst du noch keine Variablen im Stack ablegen. 
Der PIC legt bei Unterprogramm- (call) und Interruptaufrufen dort seinen 
letzten Programmcounter ab um nach dem Rücksprung zu wissen wo es im 
Hauptprogramm weiter geht.

von Jens (Gast)


Lesenswert?

Der Stack ist nur für Unterprogramme interessant, da wird die 
Rücksprungadresse gespeichert. Hast du PortA ordnungsgemäß definiert? 
Wie sieht dein Wait aus? Poste am besten mal das Programm.
Die Initialisierung sieht übrigens so aus:

movlw    00H    ; dein movwf ist falsch, damit schreibst du W in Adresse 
0
tris     PORTA

Viel Erfolg.

von Johannes Rietz (Gast)


Lesenswert?

Aber wie soll ich dann einen Wert speichern ???
Ich muss doch loop1, loop2 ,loop3 ein Speicherzelle im Ram vergeben, 
nehmen wir mal:

loop1   Equ     0x07
loop2   Equ     0x08
loop3  Equ  0x09

zum Beispiel:

Wait
  movlw  D'40'
  movwf  loop3

M3      movlw   D'250'
        movwf   loop2


M2      movlw   .110
        movwf   loop1

M1      nop
        nop
        nop
        nop
    nop
        nop
        decfsz  loop1,f
        goto    M1

        decfsz  loop2,f
        goto    M2

  decfsz  loop3,f
  goto    M3
        retlw   0

Das funktioniert aber ??? oder was
Naja das speicher ich ja auch im Ram oder ??

von Johannes Rietz (Gast)


Lesenswert?

Sry naklar habe ich movlw benutzt; (lade wert in Akku)
und nicht movwf; (lade wert in Register)

von Sven S. (stepp64) Benutzerseite


Lesenswert?

retlw ohne call geht immer schief...
Am Ende brauchst du eine Hauptschleife, in der Art:

main    goto main

Der PIC lädt sonst den nächsten Befehl aus dem Flash, der nach deinem 
Code dort steht und da das nicht definiert ist, geht das auch schief.

Sicher das die RAm-Adressen 0x07 - 0x09 nicht schon durch Register 
belegt sind? Kommt mir etwas niedrig vor (ohne jetzt das Datenblatt 
gelesen zu haben)

von Johannes Rietz (Gast)


Lesenswert?

Hm oben benutze ich ich call ... das mir schon klar das call ein aufruf 
eines unterprogrammes ist...

ja das kam mir auch komisch vor aber ich bin mir nicht sicher ob da noch 
schon andere Register drin sind...

von Jens (Gast)


Lesenswert?

Wait ist soweit ok, zumindest beim schnellen drüberschauen, aber warum 
springst du mit retlw zurück. Ist zwar nicht ganz falsch, aber unüblich.
Außerdem fängt der RAM erst bei 08H an, deine loop1 schreibst du in 
PortC, das kann nicht klappen.

So müsste es klappen...

PORTA   equ     0x05
loop1   Equ     0x08
loop2   Equ     0x09
loop3   Equ     0x0a

von Johannes Rietz (Gast)


Lesenswert?

Hm ich bin noch auf arbeit ... fahr nach hause und melde mich von dort 
... ja hm wieso muss ich PORTA auch zuweissen das wird doch schon in der 
include gemacht???

Ja mit den Ram Adressen hast du recht ...

Ich danke nochmals für die schnell Hilfe :)

von Jens (Gast)


Lesenswert?

Ja, hast natürlich recht. Ich nutze das include-File nicht, deshalb 
fehlte da für mich im ersten Moment was.

von Johannes Rietz (Gast)


Lesenswert?

Hm ich nutze diese include Datei ich bezweifel das diese vollständig 
ist, da ich dort nichts von PORTC; PORTD; PORTE sehe die der 16F57 ja 
haben soll...

  LIST  p=16F57
; P16F5X.INC  Standard Header File, Version 4.00    Microchip 
Technology, Inc.
  NOLIST

; This header file defines configurations, registers, and other useful 
bits of
; information for the 16F5X microcontrollers.  These names are taken to 
match
; the data sheets as closely as possible.  The microcontrollers included
; in this file are:

;    16F59
;    16F57
;    16F54


; There is one group of symbols that is valid for all microcontrollers.
; Each microcontroller in this family also has its own section of 
special
; symbols.  Note that the processor must be selected before this file is
; included.  The processor may be selected the following ways:

;       1. Command line switch:
;       C:\ MPASM MYFILE.ASM /P16F54
;  C:\ MPASM MYFILE.ASM /P16F57
;  C:\ MPASM MYFILE.ASM /P16F59
;       2. LIST directive in the source file
;       LIST   P=16F54
;  LIST   P=16F57
;  LIST   P=16F59
;       3. Processor Type entry in the MPASM full-screen interface

;======================================================================= 
===
;
;     Revision History
;
;======================================================================= 
===

;Rev:   Date:   Reason:

;1.00  12/09/03 Initial release for the PIC16F54/F57
;1.10  05/28/04 Update to add PIC16F59

;======================================================================= 
===
;
;       Generic Definitions
;
;======================================================================= 
===

W                            EQU     H'0000'
F                            EQU     H'0001'

;----- Register Files 
-----------------------------------------------------

INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0005'
PORTB                        EQU     H'0006'

;----- STATUS Bits 
--------------------------------------------------------

PA2                          EQU     H'0007'
PA1                          EQU     H'0006'
PA0                          EQU     H'0005'
NOT_TO                       EQU     H'0004'
NOT_PD                       EQU     H'0003'
Z                            EQU     H'0002'
DC                           EQU     H'0001'
C                            EQU     H'0000'

;----- OPTION Bits 
--------------------------------------------------------

T0CS                         EQU     H'0005'
T0SE                         EQU     H'0004'
PSA                          EQU     H'0003'
PS2                          EQU     H'0002'
PS1                          EQU     H'0001'
PS0                          EQU     H'0000'

;======================================================================= 
===
;
;       Processor-dependent Definitions
;
;======================================================================= 
===

        IFDEF __16F54
           __MAXRAM H'01F'
        ENDIF

;----------------------------------------------------------------------- 
---

        IFDEF __16F57
                                                ; Register Files
PORTC                     EQU     H'0007'
           __MAXRAM H'07F'
        ENDIF

;----------------------------------------------------------------------- 
---

        IFDEF __16F59
                                                ; Register Files
PORTC                     EQU     H'0007'
PORTD                     EQU     H'0008'
PORTE                     EQU     H'0009'
           __MAXRAM H'0FF'
        ENDIF

;======================================================================= 
===
;
;       Configuration Bits
;
;======================================================================= 
===


_CP_ON                       EQU     H'0FF7'
_CP_OFF                      EQU     H'0FFF'
_WDT_ON                      EQU     H'0FFF'
_WDT_OFF                     EQU     H'0FFB'
_LP_OSC                      EQU     H'0FFC'
_XT_OSC                      EQU     H'0FFD'
_HS_OSC                      EQU     H'0FFE'
_RC_OSC                      EQU     H'0FFF'





        LIST



Wei gesagt die Config sieht dann so aus:

        __CONFIG        _CP_OFF & _WDT_OFF & _XT_OSC

Ich hoffe das hilt dir ein wenig ... :) bin dann kurz weg.

von gast (Gast)


Lesenswert?

Wieso hat der PIC 16F57 Port D und E ?
Der hat laut Datenblatt A,B und C Ports.

von Johannes Rietz (Gast)


Lesenswert?

Oh ja entschuldige der PIC hat wirklich nur PORTA, PORTB, PORTC
Mein Fehler !!!

Weiss nun wer wie man den PIC vernümpftig Initialisiert???

von Jens (Gast)


Lesenswert?

Endweder du findest eine include-Datei nur für den 16F57, schmeißt aus 
deiner jetzigen alles sinnlose wie PortD, PortE etc raus oder 
verzichtest auf Include völlig und machst es so wie von mir oben 
beschrieben.


[picasm]

      __CONFIG        _CP_OFF & _WDT_OFF & _XT_OSC

list p=16F57

INDF            EQU     H'0000'
TMR0            EQU     H'0001'
PCL             EQU     H'0002'
STATUS          EQU     H'0003'
FSR             EQU     H'0004'
PORTA           EQU     H'0005'
PORTB           EQU     H'0006'

loop1           Equ     0x08
loop2           Equ     0x09
loop3           Equ     0x0a


        movlw     00H
        tris      PORTA
        tris      PORTB
        tris      PORTC

m1      bsf       PORTA,0
        call      wait
        bcf       PORTA,0
        call      wait
        goto      m1


Wait    movlw  D'40'
        movwf  loop3

M3      movlw   D'250'
        movwf   loop2


M2      movlw   .110
        movwf   loop1

M1      nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loop1,f
        goto    M1

        decfsz  loop2,f
        goto    M2

        decfsz  loop3,f
        goto    M3
        return


end

[/picasm]

Ich habe hier kein Assembler oder so was zum testen, aber aus der kalten 
heraus würde ich sagen, mit obigen Programm blinkt die LED, 
vorausgesetzt natürlich, ich habe nicht noch irgendwo etwas übersehen.

von Jens (Gast)


Lesenswert?

Da fehlte natürlich was...

> PORTB           EQU     H'0006'
PORTC          EQU      H'0007
> loop1           Equ     0x08

von holger (Gast)


Lesenswert?

Gehört vieleicht nicht ganz zum Thema, aber meine Güte
was willst du mit dieser PIC Gurke. Nimm einen 16F873
oder was noch moderneres und werd damit glücklich.

von Johannes Rietz (Gast)


Lesenswert?

OKay Jens ich werde es morgen mal probieren ... ich werds mal brennen...
Ja was will ich mit der Krücke ddas is ne gute Frage ... daraus wird nen 
LED CUBE der aus 5 mal 5 mal 5 Leds besteht und wo sich fast jede Led 
ansteuern lässt ...

von holger (Gast)


Lesenswert?

>Ja was will ich mit der Krücke ddas is ne gute Frage ... daraus wird nen
>LED CUBE der aus 5 mal 5 mal 5 Leds besteht und wo sich fast jede Led
>ansteuern lässt ...

Hast du einen Schaltplan plus Programm dafür mit PIC16F57?
Falls nicht ist dieser PIC ja wohl ein Griff ins Klo.
Schau dich mal bei den PIC18F um. Das ist eher das was du
brauchst.

von Johannes Rietz (Gast)


Lesenswert?

Der kleine reicht aber für meine Anwendung aus und ist exrem billig 70 
CENT  ... Dein PIc ist zwar ein supoer Gerät aber ich benötige die 
Funktionen nicht und kostet auch so um die 4-5 Euro

:)

von Johannes Rietz (Gast)


Lesenswert?

Hm Ich denke das wird schon klappen ... ja SChaltplan steht fast und das 
Prgrammieren ist kein Problem sowie die Initialisierung hinhaut ... vill 
hast du da noch eine Aanregung für mich ... und es wird nicht von einem 
PIC gesteuert 5 Stück kommen zum Einsatz, die dann zusammen arbeiten...

von holger (Gast)


Lesenswert?

Du bist aber optimistisch ;)

Das Ding hat:
Einen 8Bit Timer
2 Level Call Stack
2kB Flash
78 Byte RAM

Das Ding hat nicht:
I2C, SPI, UART per Hardware
Keine Interrupts.

Schaun wir mal wie weit du damit kommst.

von Johannes Rietz (Gast)


Lesenswert?

Die Pics können sich doch über btfss unterhalten ... das doch kein ding

von Jens P. (picler)


Angehängte Dateien:

Lesenswert?

So, ich habe das Programm zu Hause mal durch den Assembler gejagt und 
natürlich waren noch ein paar kleine Macken drin. Jetzt läuft es ohne 
Probleme durch. Allerdings habe ich jetzt keine Lust mehr, das auf dem 
Steckbrett zu testen, zumal ich den PIC nicht habe. Das kannst du ja 
machen ...

von Sven S. (stepp64) Benutzerseite


Lesenswert?

An deiner stelle würde ich mir das mit diesem PIC wirklich noch mal 
überlegen. Der 16F883 kostet bei Angelika 1,60. Bei 5 Stück wären das 
4,50 mehr. Alleine deine 125 LEDs werden schon einiges kosten (zumindest 
wenn du blaue nimmst), da fallen die paar Euro mehr nicht ins gewicht. 
Du sparst dir bei der programmierung allerdings eine Menge Ärger. 
Alleine mit zwei Stacklevels bist du schnell an der Grenze. Und 78 Byte 
RAM aufgeteilt auf vier Bänke ist auch nicht sehr programmierfreundlich. 
Mit dem 883 hättest du diese Anzahl Bytes scon in der 1. Bank und 
müsstest nicht immer Umschalten. Die 883 könnten sich dann auch über 
UART, SSP oder I2C unterhalten.

Aber probier es halt mit dem 57er. Kannst ja erst mal nur eine Ebene 5x5 
ansteuern und versuchen 2-3 verschiedene Lichtmuster darzustellen. Wenn 
dir das gelingt und du noch Reserven hast, dann könnte dein Würfel auch 
was werden. Ich würde mir allerdings einen so alten PIC nicht mehr antun 
(genausowenig wie den 16F84).

Gruß
Sven

von sascha (Gast)


Lesenswert?

pic16f84a der wird in der Berufschule eingesetzt deshalb

Und noch was

Autor: Jens A: (picler)
Datum: 27.08.2009 22:34
Angehängte Dateien:

    * LEDBlink_16F57.asm (804 Bytes, 9 Downloads) | Codeansicht

das program hat immer noch Bug kp wieso
kann mir einer da helfen ??????????????

THX im vorraus

von Maik W. (werner01)


Lesenswert?

was für ne angelika?

von Jens P. (picler)


Lesenswert?

reichelt elektronik GmbH & Co. KG
Geschäftsführerin: Angelika Reichelt
Elektronikring 1
26452 Sande Germany

Alles klar?

von John (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Sascha,

im Programm LEDBlink_16F57.asm wird der Reset-Vector nicht 
berücksichtigt. Es ist beim 16F57 bei 0x7FF. An dieser Stelle muss ein 
Sprung zum Programmstart erfolgen. Siehe Programm in Anhang.

In /C:\Programme\Microchip\MPASM Suite\Template\Code/ gibt es Vorlagen 
für der einzelnen Prozessoren, in denen solche grundlegende Dinge schon 
drin sind.

Gruß
John

von sascha (Gast)


Lesenswert?

Danke dafür

von sascha (Gast)


Lesenswert?

HAllo
Könnte mir einer mit 18f45K20 helfen
ich kriege net den Interrup zum laufen
und bei Konfiguration
weil das nimmt er net an __CONFIG  _CP_OFF & _PWRTE_ON & _WDT_OFF &
 nur das nimmt er an _XT_OSC
Danke im vorraus

von sascha (Gast)


Lesenswert?

Habe es hinbekommen

Aber wegen  Konfiguration
weil das nimmt er net an __CONFIG  _CP_OFF & _PWRTE_ON & _WDT_OFF &
 nur das nimmt er an _XT_OSC
Danke im vorraus
wenn einer mir da weite hilft wäre cool

von sascha (Gast)


Lesenswert?

Sorry Läute
Ich habe Problem mit 16f737
Konfiguration

das ist kann ich net kann mir einer sagen wie und wo kann ich mir das so 
duch lessen

von holger (Gast)


Lesenswert?

>das ist kann ich net kann mir einer sagen wie und wo kann ich mir das so
>duch lessen

Was ist das denn für eine Sprache?
Ich versuchs mal:

Du dich shiessen kugel runde durch kopf deiner?

>Ich habe Problem mit 16f737
>Konfiguration

Nicht nur damit!

von sascha (Gast)


Lesenswert?

ach komm
so schlimm ist es net

von sascha (Gast)


Lesenswert?

Könnte mir einer helfen den Pic16f737 zum laufen  bringem
 mit Konfiguration
weil das will er net akzeptieren

  LIST  P=16F8737        ; Verwendeter PIC= PIC16F84a
  include <P16f737.INC>      ; Includefile for P16F84A

;**********************************************************************
;---------- Konfiguration ------------------------------
; bis 4 MHz: Power on Timer, no Watchdog, XT-Oscillator

     __CONFIG       _CP_OFF & _WDT_OFF & _XT_OSC

von sascha (Gast)


Lesenswert?

Wenn einer die suchen wird.
Hier hier sind die

PIC16f737

  include <P16f737.INC>      ; Includefile for P16F84A

;**********************************************************************
;---------- Konfiguration ------------------------------

__CONFIG _CONFIG1, _CP_OFF & _CCP2_RC1 & _DEBUG_ON & _VBOR_4_2 & 
_BOREN_0 & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC


__CONFIG _CONFIG2, _BORSEN_0 & _IESO_OFF & _FCMEN_OFF

;**********************************************************************
;STARTUP Startadresse
  ORG     0x000        ; Prozessor
  goto    Main        ; gehe zu
;---------- Interrupt ---------------------------------------
; Hier steht die Interrupt Service Routine
  ORG  0x0004
  goto  Interrupt        ; gehe zu Interrupt
;**********************************************************************


Main:
  bsf      STATUS, RP0        ; Setze in Register STATUS das Bit RP0 auf 
1
  movlw  B'00011110'        ; Speicher B'00011110' in das 
Arbeitsregister W
  movwf  TRISA          ; Kopiere Inhalt von W in das Register TRISA
  movlw  B'11100000'        ; Speicher B'00000000' in das 
Arbeitsregister W
  movwf  TRISB          ; Kopiere Inhalt von W in das Register TRISB
  movlw  B'00000000'        ; Speicher B'00000000' in das 
Arbeitsregister W
  movwf  TRISC          ; Kopiere Inhalt von W in das Register TRISB
  bcf     STATUS, RP0        ; Setze in Register STATUS das Bit RP0 auf 
0

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
Noch kein Account? Hier anmelden.