Forum: Mikrocontroller und Digitale Elektronik Pic 16f877 Assembler


von d.caine (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen ,
Wir haben in der Schule folgendes Projekt.
Wir sollen eine Steuerung für eine Säge mit automatischer Stangenzufur 
machen.Haben uns eine Test Platine gebastelt an der wir 6 Drucktaster 
und 4 Led´s angelötet haben. Die Taster dinen uns als eingänge die LEDS 
als Ausgänge nur um zu sehen ob alles richtig läuft. Die Taster sind an 
die IO´s und an die Masse gelötet. die  leds an die IO´s und Masse 
dazwischen 1k Widerstände. Also etwas ganz einfaches.
Haben mit Mühe das Programm in mp lab gemacht das ich als .txt Datei 
angehängt habe.Noch dazu sind wir Anfänger in sowas also Bitte falls 
Antworten kommen dan auch genau sagen was gemeint ist .

Dieses programm haben wir dan mit dem Brenner von sprut in den pic 
geladen aber es tut sich nix.
BItte bitte ..wo könnte der/die Fehler sein ??

von Stefan (Gast)


Lesenswert?

MCLR nicht auf Plus gelegt ?

von d.caine (Gast)


Lesenswert?

Ne, MCLR ist auch über einen Taster an die Masse angeschlossen.
Der Taster ist aber offen.Heist also ich kann MCLR mit der Masse 
verbinden wenn ich will.Dachte so geht das Restten des pics.

von Stefan (Gast)


Lesenswert?

Ist MCLR an Plus ?

von d.caine (Gast)


Lesenswert?

Nein

von Stefan (Gast)


Lesenswert?

Dann mach das mal. Sonst läuft der nämlich nicht.

von d.caine (Gast)


Lesenswert?

Okay mache ich gleich.

von d.caine (Gast)


Lesenswert?

So, MCLR ist mit 5V verbunden.
Und es tut sich nix.

von d.caine (Gast)


Lesenswert?

Habe noch 2 pins an denen die LED´s sind auf 1 gestellt nur um zu sehen 
ob sie leuchten.
Nix.

von Stefan (Gast)


Lesenswert?

Kann mal ein Testprogramm schicken.
Muß nur wissen welche LEDs sollen an sein,
und welcher Quartz hast du verwendet ?

von Holger W. (holgerw)


Lesenswert?

Die Main muss immer in einer Schleife laufen, bei dir macht sie das 0x20 
mal und dann ? springt der PIC ins leere. Also vor dem end ganz unten 
müsste zumindest noch ein Sprung auf sich selbst erfolgen oder eben 
wieder zu main.

halthier: goto halthier    ;lässt ihn anhalten

Fang doch mal vorne an, du initialisierst PORT D als Ausgang und löschst 
alle LED. Schalte sie doch mal ein und lass dein Programm stoppen (z.b. 
mit so einem Goto auf sich selbst) und schaue ob es bis dahin geht.

Wir wissen auch nichts über die Beschaltung, der MCLR sollte übrigends 
nicht direkt an +5V sondern am besten über einen Widerstand (ca. 
2,2k-4,7k)
Hast du Quarz dran, entsprechende Kondensatoren, was für eine 
Spannungsquelle ? Config Werte ?

Holger

von d.caine (Gast)


Lesenswert?

Okay Leute von Anfang an. Quartz? Hat der pic nicht einen Internen den 
man benutzen kann? Habe nämlich garkeinen angeschlossen.
Das Programm kann ich auch so ändern das die LED´ leuchten.
Das mit den Quartz war mir von anfang an nicht einleuchtend und meine 
Vermutung war auch das es damit zutun haben könnte.

von Holger W. (holgerw)


Lesenswert?

Wenn du die LEDs leuchten lassen kannst ist das doch schon was. Dann im 
Programm schrittweise vorgehen und jede Funktion prüfen durch LED 
ein/aus/toggeln.
Ja der sollte einen internen Oszillator haben. Aber wir kennen deine 
config ja nicht.

Holger

von d.caine (Gast)


Lesenswert?

Was ist die Config ?
Wie und wo mache ich die ?

von Holger W. (holgerw)


Lesenswert?

www.sprut.de lesen

von Stefan (Gast)


Lesenswert?

Der hat keinen internen Oscillator. Du mußt einen
Quartz dran anschließen.

von W.S. (Gast)


Lesenswert?

d.caine schrieb:
> Haben mit Mühe das Programm in mp lab gemacht das ich als .txt Datei
> angehängt habe.

Ja, sieht noch ein bissel sehr anfängerig aus.

Mach dir beim Assemblerprogrammieren mit den PIC16Fxxx am besten eine 
Art Vorlage, die du dann immer benutzt, etwa so:
(an den verwendeten Assembler notfalls anpassen)

       INCLUDE P16F877.PIC
       SEG CODE

; Fuse-Konfiguration
   ORG   2007h
;        DCBA9876543210
   DATA  11111101000110b
;                      - 00=LP 01=XT 10=HS 11=RC
;                    --- 1=WDT enable
;                   ---- 0=PWTE enable
;                  ----- 00=prot.all
;                        01=upper3/4prot
;                        10=upper1/2prot
;                        11=unprotected
  (die Fuses hab ich grad nicht auswendig gelernt)

; ID-Konfiguration
         ORG     2000h
         DATA    1     ; na eben was du hier willst
         DATA    2
         DATA    3
         DATA    4

; EEPROM-Vorgaben
         ORG     2100h
MyByte:  DATA    irgendwas
MyStr:   DATA    'hallihallo',0


; Code-Beginn
       ORG     0
       CLRF    Status         ; alle Flags (ohne Z) löschen
       CLRF    PCLATH
       GOTO    Start

       ORG     4

; Interrupt-Routine
; =================
Interrupt:
       MOVWF    RetteW             ; W retten
       SWAPF    Status,W           ; Flags in W holen

       .. hier kommt alles rein, was
       die Interrupts behandelt

; Interrupt-Ende:  Flags & W restaurieren
I.End: SWAPF    RetteFlags,W   ; gerettete Flags in W
       MOVWF    Status         ; Flags restaurieren
       SWAPF    RetteW,F       ; W restaurieren
       SWAPF    RetteW,W
       RETFIE


Start:
       hier schreib, was du halt brauchst


immerzu:

       hier schreib, was der PIC immerzu tun soll


       GOTO   immerzu
       END

Und nochwas: Rücke ein und benutze Ausdrücke. Also nicht so
MARKE2
DECFSZ   0x20,1   ;Wert 1 von Wert in 0x20 abziehen

sondern (ebenfalls wieder assemblerspezifisch)

           SEG   RAM
           ORG   20h
MyCounter: DS    1
MyLongInt: DS    4

und dann im Code
Marke2:    DECFSZ   MyCounter,F

Wenn dein Assembler keine Segmente (SEG xxx) und Reservierung von 
Speicherplatz (DS nn) versteht, dann mußt du leider mit

MyCounter:  EQU  20h
MyLongInt:  EQU  21h

zurechtkommen oder noch schlimmer

#define  MyCounter  0x20

schreiben. Wenn dein Assembler nicht ,W und ,F versteht, dann 
deklarierst du das dir lieber selber, denn damit wird der Code lesbarer 
und für dich auch übersichtlicher.

Nochwas zur Hardware:
Gerade die 16Fxxx PIC's sind eigentlich sehr gutmütige Gesellen. Aber 
man sollte an beide VCC-Beine je einen Stütz-Kondensator (z.B. 100 nF) 
schalten und MCLR mit ca. 10 kOhm auf VCC ziehen und zugleich mit ca. 
2.2 nF gegen GND abblocken. Ansonsten braucht der PIC natürlich einen 
Takt, den man entweder per Quarz oder per Keramikschwinger macht. Zum 
Programmieren ist es gut, RB3 dezent auf GND zu ziehen (10..22 kOhm), 
damit er nicht aus Versehen in den LoVolt-Programmiermodus gerät. RB6 
und RB7 kann man benutzen, wenn man sie als Ausgänge verwendet, 
ansonsten sind Entkoppel-Widerstände nötig. PIC's haben starke Portpins, 
also sollte man vermeiden, damit kapazitive Lasten (z.B. MOSFETS) damit 
direkt zu treiben. Bei sowas ist ein Entkoppel-R nötig.

W.S.

von K. J. (Gast)


Lesenswert?

hi beim groben rüber schauen einen Fehler gefunden ;-)

clrw     PORTD                  ;Alle LED´s aus

das heißt clrf,

zum tehma Template nutze folgendes das macht das alles übersichtlicher: 
http://www.grautier.com/grautier/archives/87-ASM-PIC16xxx-Template.html

von tt2t (Gast)


Lesenswert?

Wie sieht denn Deine CONFIG aus?

von Ottmar K. (wil1)


Lesenswert?

@ d.caine
Hallo
Schau Dir mal Deine Initialisierung an! Es fehlt das CONFIG-WORT (s. u.) 
Nach dem Reset werden die Ausgänge an den PORTS als ANALOGE EINGÄNGE 
initialisiert. Dazu müssen im Register ADCON die I/O von analog auf 
digitale I/O umgestellt werden.
Es ist immer gut das Datenblatt zu lesen!

EXAMPLE 3-1: INITIALIZING PORTA
FIGURE 3-1: BLOCK DIAGRAM OF RA3:RA0 AND RA5 PINS
FIGURE 3-2: BLOCK DIAGRAM OF RA4/T0CKI PIN

NOTE:
On a Power-on Reset, these pins are con-
figured as ANALOG inputs and read as '0'.

BCF STATUS, RP0
;
BCF STATUS, RP1
; Bank0
CLRF PORTA
; Initialize PORTA by  clearing output  data latches
BSF STATUS, RP0 ; Select Bank 1
MOVLW 0x06   ; Configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0xCF ; Value used to initialize data direction
MOVWF TRISA Set RA<3:0> as inputs RA<5:4> as outputs
                  ; TRISA<7:6>are always read as ’0’.

Weiterhin fehlt das CONFIG-WORT (bei AVR auch Fuses genannt)

list      p=16f877            ; list directive to define processor
#include <p16f877.inc>        ; processor specific variable definitions

_CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & 
_WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm 
file.
; The lables following the directive are located in the respective .inc 
file.
; See respective data sheet for additional information on configuration 
word.

Im Ordner von MPLAB einfach mal nach einem Beispiel-ASM-File suchen (für 
jeden PIC ist dort eines niedergelegt!), dann werden die gröbsten Fehler 
vermieden

mfG Ottmar

von d.caine (Gast)


Lesenswert?

SO Leute
Ich danke euch für eure Hilfe.Habe die meisten Vorschläge befolgt, und 
nun
funktioniert alles wie sein soll.
Die Testplatine habe ich auch verbessert, also erstmal ein 
Keramikresonator drangelötet da war dann auch erst leben in dem Käfer. 
:-)
Naja....aller Anfang ist schwer.

DANKE DANKE an alle die sich Mühe gegeben haben.

Der Thread kann geschlossen werden.

Gruss caine

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.