PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Kleines Problem mit Assembler



Destroyer
17.11.2014, 16:09
;************************************************* *********************
; This file is a basic code template for object module code *
; generation on the PIC16F54. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker. *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;************************************************* *********************
; *
; Filename: BioPic_V01.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
;************************************************* *********************
; *
; Files required: P16F54.INC *
; *
; *
; *
;************************************************* *********************
; *
; Notes: *
; *
; *
; *
; *
;************************************************* *********************

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

__CONFIG _CP_ON & _WDT_ON & _HS_OSC

; '__CONFIG' directive is used to embed configuration word 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.

;***** VARIABLE DEFINITIONS
TEMP_VAR UDATA
HeizTime0 res 1
HeizTime1 res 1
Sekunde res 1
HeizTime3 res 1
PrellTime res 1


;************************************************* *********************
RESET_VECTOR CODE 0x1FF ; processor reset vector
goto start

MAIN CODE 0x000
start
Init
CLRWDT ; Watchdog zurücksetzen
movlw 0x0C ; Definition für Port A laden
tris PORTA ; Definitioon in Port A eintragen
movlw 0x9F ; Definition für Port B laden
tris PORTB ; Definitioon in Port B eintragen
movlw 0x07 ; Definition für Option Register laden
option ; Definitioon in Option eintragen
CLRWDT ; Watchdog zurücksetzen

;==================================
;=== ===
;=== Hauptporogramm Schleife ===
;=== ===
;==================================
Anfang
goto Schritt_1_abfrage
CLRWDT ; Watchdog zurücksetzen ; Watchdog zurücksetzen
goto Anfang

;==================================
;=== ===
;=== Ansteuerung Summer wenn OK ===
;=== ===
;==================================

Schritt_1_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt1_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_1

goto Schritt_1_abfrage

Schritt1_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_8
goto Schritt_1_abfrage

Schritt_2_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt2_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_2
goto Schritt_2_abfrage

Schritt2_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_1
goto Schritt_2_abfrage

Schritt_3_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt3_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_3
goto Schritt_3_abfrage

Schritt3_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_2
goto Schritt_3_abfrage



Schritt_4_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt4_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_4
goto Schritt_4_abfrage

Schritt4_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_3
goto Schritt_4_abfrage



Schritt_5_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt5_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_5
goto Schritt_5_abfrage

Schritt5_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_4
goto Schritt_5_abfrage

Schritt_6_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt6_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_6
goto Schritt_6_abfrage

Schritt6_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_5
goto Schritt_6_abfrage


Schritt_7_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt7_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_7
goto Schritt_7_abfrage

Schritt7_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_6
goto Schritt_7_abfrage

Schritt_8_abfrage
CLRWDT
BTfss PORTB,0 ; Dir auf 0?
goto Schritt8_links ; beginne Schritte
BTfsc PORTB,1 ;Step auf 1?
goto schritt_8
goto Schritt_8_abfrage

Schritt8_links
CLRWDT
BTfsc PORTB,1 ;Step auf 1?
goto schritt_7
goto Schritt_8_abfrage





schritt_1
CLRWDT
BSF PORTA,0
BCF PORTA,1
BCF PORTB,5
BSF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell1
BTfss PORTB,1 ;Step auf 0?
goto Schritt_2_abfrage
goto schritt_1

Schritt_prell1
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_1_abfrage
goto schritt_1

schritt_2
CLRWDT
BSF PORTA,0
BCF PORTA,1
BCF PORTB,5
BCF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell2
BTfss PORTB,1 ;Step auf 0?
goto Schritt_3_abfrage
goto schritt_2

Schritt_prell2
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_2_abfrage
goto schritt_2







schritt_3
CLRWDT
BSF PORTA,0
BSF PORTA,1
BCF PORTB,5
BCF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell3
BTfss PORTB,1 ;Step auf 0?
goto Schritt_4_abfrage
goto schritt_3

Schritt_prell3
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_3_abfrage
goto schritt_3





schritt_4
CLRWDT
BCF PORTA,0
BSF PORTA,1
BCF PORTB,5
BCF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell4
BTfss PORTB,1 ;Step auf 0?
goto Schritt_5_abfrage
goto schritt_4

Schritt_prell4
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_4_abfrage
goto schritt_4


schritt_5
CLRWDT
BCF PORTA,0
BSF PORTA,1
BSF PORTB,5
BCF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell5
BTfss PORTB,1 ;Step auf 0?
goto Schritt_6_abfrage
goto schritt_5

Schritt_prell5
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_5_abfrage
goto schritt_5

schritt_6
CLRWDT
BCF PORTA,0
BCF PORTA,1
BSF PORTB,5
BCF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell6
BTfss PORTB,1 ;Step auf 0?
goto Schritt_7_abfrage
goto schritt_6

Schritt_prell6
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_6_abfrage
goto schritt_6


schritt_7
CLRWDT
BCF PORTA,0
BCF PORTA,1
BSF PORTB,5
BSF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell7
BTfss PORTB,1 ;Step auf 0?
goto Schritt_8_abfrage
goto schritt_7

Schritt_prell7
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_7_abfrage
goto schritt_7
schritt_8
CLRWDT
BCF PORTA,0
BCF PORTA,1
BCF PORTB,5
BSF PORTB,6
BTfss PORTB,0 ; Dir auf 0?
goto Schritt_prell8
BTfss PORTB,1 ;Step auf 0?
goto Schritt_1_abfrage
goto schritt_8

Schritt_prell8
CLRWDT
BTfss PORTB,1 ;Step auf 0?
goto Schritt_8_abfrage
goto schritt_8



RETLW 0
; remaining code goes here
END ; directive 'end of program'

Destroyer667
17.11.2014, 16:18
Habe ein Kleines Programm geschrieben eine Art Schrittmotor Treiber
jedoch scheint das Programm irgendwo einen Fehler zu haben den ich nicht entdecke
habe an die 4 Ausgänge LEDs gehängt und von Start an Leuchten nur die erste und letzte
komm daher nicht weiter
vielleicht kann mir ja hier jemand helfen
mfg Destro

witkatz
18.11.2014, 00:16
von Start an Leuchten nur die erste und letzte
Die erste und die letzte LED werden in Schritt 1 gesetzt, also bleibt deine Schrittkette wohl in Schritt 1 hängen. Sorry, wenn ich keinen Spaß am korrigieren Deines Code habe. Als Tipp: ich benutze für solche Fälle den Simulator in MPLAB und takte mich durch die Schritte mit simulierten IO-Pins durch. So kannst du die Software-Schrittkette auch ohne Hardware testen. Ein Flußdiagramm (PAD) mit klarer Übersicht der Schritte und der dazugehörigen Ausgänge und Schaltbedingungen würde vielleicht von vornherein helfen, Fehler zu vermeiden und die Fehlersuche zu erleichtern. Sonst wird einem von dem rauf/runterscrollen in dem unkommentierten Spaghetti-Code schwindelig.

Möglicherweise liegt abe die Ursache gar nicht in der Software, sondern in der Beschaltung? Auch ein elektrisches Problem könnte verhindern, dass die Takte erkannt werden und die MCU weiterschaltet. Wie ist die Taktung an PORTB,1 (Pin 8 des 16F54) angeschlossen?

Gruß
witkatz

- - - Aktualisiert - - -

Dein Thread ist als ERLEDIGT markiert, ich vermute, dass es unabsichtlich passiert ist. Wenn das Problem aber wirklich erledigt ist, dann kannst du ja mal schreiben, was die Ursache war.

witkatz
18.11.2014, 10:48
Damit wir uns nicht falsch verstehen, ich selber habe nicht die Zeit und Muße, dein Code zu testen. Ich kann dir nur mit ein paar vielleicht nützlichen Tipps helfen, dein Code selbst ans laufen zu bringen. Die Kommentare im Quelltext sollen dir selbst helfen dein eigenes Code zu verstehen und Fehlersuche zu erleichtern.

Die beiden Eingänge hängen an einem Pullup 10K und werden von mir zurzeit mit einer Drahtbrücke auf Masse geschaltet.
OK, damit kannst du in jedem Step die Weiterschaltbedingungen manuell vorgeben und überlegen, warum es nicht weiterschaltet. So als Tipp, ich fange neue Projekte meistens mit kleinen Testroutinen z.B. 1Hz Blinken auf allen Ausgängen oder Zuweisung der Eingänge auf Ausgänge. So teste ich, ob die MCU anläuft, die Konfiguration, die Ein- und Ausgänge iO sind.

die Ausgänge hängen direkt an 4 LEDs.
(An Vorwiderstände gedacht?) Das ist ok zum Testen, damit hast du eine Debug-Ausgabe, in welchem Schritt deine MCU vermutlich gerade loopt oder zuletzt war. Jetzt kannst du selbst überlegen, warum die Schrittkette bei Signalwechsel an RB1 nicht weitergeht. Noch anschaulicher ist der Debug-Modus, in dem man alle Zustände der MCU Zeile für Zeile beobachten kann. Ich weiß nicht, ob mit dem PIC16F54 das In-Circuit-Debugging möglich ist. Ich kann dir dafür die Simulation in MPLAB nochmal ans Herz legen.

- - - Aktualisiert - - -
@ Destroyer667: Warum hast du deinen letzter Beitrag, aus dem ich zitiert habe ersatzlos gelöscht? Vielleicht hätte noch jemand anders deinen kommentierten Code anschauen und dir Tipps dazu geben können?

Destroyer667
19.11.2014, 15:30
Habe das Problem gefunden^^
war meine eigene Blödheit der Code läuft hatte nur immer dieselbe TestVersion auf den PIC gespielt und da ging noch nichts ;)
habe jetzt aber ein anderes Problem oder eher an anliegen....
Ich möchte gerne die Ausgänge anders belegen
undzwar möchtie ich gerne PORTB,4 - PORTB,7 als Augänge nutzen
verstehe nur nicht wie ich die I/Os konfiguriere
habe im Internet bis jetzt auch noch nichts verlümpftiges dazu gefunden

danke für die hilfe im Voraus

witkatz
25.11.2014, 18:28
...verstehe nur nicht wie ich die I/Os konfiguriere...
Du konfigurierst in deinem Programm die I/Os dieses Mikrocontrollers (PIC16F54) mit dem TRIS-Befehl. Der Befehl ist in dem Datenblatt des Mikrocontrollers (http://ww1.microchip.com/downloads/en/DeviceDoc/41213D.pdf) genau beschrieben.