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 :)
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.
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 :(
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.
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.
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 ??
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)
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...
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
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 :)
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.
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.
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.
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 ...
>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.
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
:)
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...
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.
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 ...
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
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
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
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
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
>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!
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
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