Anfänger erbittet Hilfe bei einem ersten Programm
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  Anfänger erbittet Hilfe bei einem ersten Programm « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Anfänger erbittet Hilfe bei einem ersten Programm  (Gelesen 3735 mal)
 
chrisabi
Newbie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« am: Mai 28, 2011, 16:22:33 »

Hallo an alle Profis,

für meine Modelleisenbahn versuche ich über eine PICF629 2 Karuselles zu steuern. Die Schaltung dazu ist absolut einfach. Die Spannungsversorgung wir über eine Z-Dioden stabilisierte Einweggelichrichtung erzeugt. Als Eingang und damit als Starttaster wird GP3 verwendet. Die Ausgänge sind über Transistorstufen an die Aktoren geschaltet. Im Versuchsaufbau übernehmen LED die Motoren- und Hupenfunktion.

Im angehangenen Listing ist die Funktion einigermaßen beschrieben, die Lichtsteuerungen sind noch nicht enthalten, die Ausgänge also noch nicht benutzt.

Nach dem Schreiben des Programmteils teste ich das ganze mit dem Simulator im MPLAB. Dort funktioniert das Programm auch so wie ich es mir vorgestellt habe.

Über ein Experimentierboard der Firma Vellman brennte ich mit der zugehörigen PIC-Brennersoftware dan PIC. Zu meiner großen Enttäuschung funktioniert das Programm leider nicht. Seltsamerweise wird der Ausgang GP2 angestuert und das wars dann. Zu Versuchszwecken kommentierte ich schon die Abfrage für den Starttaster aus und veränderte natürlich auch die Marke entsprechend.

Ich vermutete, dass ich als Anfänger mit meinen Experimenten den PIC zerschossen habe (durch dummerweises überschreiben des OSCALL), was sich aber nicht bestätigte, denn nach dem Brennen eines Lernbeispiels von der Seite sprut.de (und wiederherstellen des OSCALL) läuft dort das Beispiel.

Also liegt der Fehler in meinem Progrämmchen.  Es gelingt mir leider nicht irgendeinen Ansatz noch zu finden, wo der FEhler zu finden ist und bitte deshalb um Unterstützung und Hinweise.

Ich bin mir bewusst, dass es wesentlich elegantere Lösungen für die Realsierung der Aufgabe gibt.

In der Hoffnung auf Hilfe

mit freundlichem Gruß

chrisabi

Code:
;***********************************************************
;Programm zur Steuerung der Karusells mit PIC 12F629
;
;Prozessor-Takt 4 MHz intern
;
;Nach Betätigen der Starttaste als Schalter GP3 beginnt das Programm.
;Das Beleuchtungsprogramm läuft unabhängig/parallel zum Karusellprogramm.
;Folgender Ablauf ist vorgesehen:
;Vor jedem Karusellstart Hupe für 2 sec ein
;K1 für 15 sec ein
;5 sec Pause, dann K2 für 15 sec ein
;10 sec Pause, dann K2 für 15 sec ein
;10 sec nach K2 ein - K1 für 15 sec ein
;nach Ablauf K1 - 5 sec Pause
;K1 für 15 sec ein
;10 sec später K2 für 15 sec ein.
;nach Ablauf K2 Programm von vorn.
;*************************************************************
;*  Pinbelegung
;* ----------------------------------
;* GP: 0 > Ausgang Karusell 1
;* 1 > Ausgang Karusell 2
;* 2 > Ausgang Starthupe für beide Karusells
;* 3 < Eingang Start
;* 4 > Ausgang Licht Karusell 1
;* 5 > Ausgang Licht Karusell 2
;*************************************************************
;*  Vereinbarungen
;* ----------------------------------
list p=12f629 ;Controllertyp
#include <P12f629.INC> ;Standardheaderfile für 12F629
__CONFIG _CP_OFF &  _BODEN_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT
;
;*************************************************************
;*  Variablendefinition
;* -----------------------------------
#define K1 GPIO,0
#define K2 GPIO,1
#define H GPIO,2
#define Start GPIO,3
#define L1 GPIO,4   ;noch nicht benutzt
#define L2 GPIO,5   ;noch nicht benutzt
loops Equ     0x20      ;Zähler für Warteschleife 
loops1  Equ     0x21      ;Zähler für Warteschleife 
loops2  Equ     0x22      ;Zähler für Warteschleife 

;*************************************************************
org 0x00
goto prog

;*************************************************************
;*  Initialisierung
;* ----------------------------------
init bcf STATUS, RP0 ;Auswahl Bank 0
clrf GPIO ;alle E/A aus
movlw 0x07 ;Vorbereitung für Komperator aus
movwf CMCON ;Komperator aus, Freigabe GP4+5
bsf STATUS, RP0 ;Umschalten auf Bank 1
movlw B'00001000' ;GP3=Eingang GP0,1,2,4,5 Ausgang
movwf TRISIO ;nach Register schieben
bcf STATUS, RP0 ;Rückschalten auf Bank 0
bsf STATUS, RP0 ;Umschalten auf Bank 1
call 0x3FF ;Lade 3FF für Taktgeneratorkalibrierung
movwf OSCCAL ;4 MHz Kalibrierung
bcf STATUS, RP0 ;Rückschalten auf Bank 0
return ;Rückkehr nach call

;*************************************************************
;*  Hauptprogramm
;* ----------------------------------
prog call init ;Aufruf Initialisierung

M1 btfss Start ;Abfrage Eingang, wenn 1 überspringe nächsten Befehl
goto M1 ;warte bis Starttaster gedrückt
;----------------------------------------------------------------------
bsf H ;Hupe ein
movlw D'8' ;Lade Zeit für 2 sec.
movwf loops
call wait
bcf H ;Hupe aus
movlw D'4' ;1 sec Pause
movwf loops
call wait
bsf K1 ;Karusell 1 ein
movlw D'60' ;Lade Zeit für 15 sec
movwf loops
call wait
bcf K1 ;Karusell 1 aus
;-------------------------------------------------------------------
movlw D'20' ;5 sec Pause
movwf loops
call wait
;-------------------------------------------------------------------
bsf H ;Hupe ein
movlw D'8' ;Lade Zeit für 2 sec.
movwf loops
call wait
bcf H ;Hupe aus
movlw D'4' ;1 sec Pause
movwf loops
call wait
bsf K2 ;Karusell 2 ein
movlw D'60' ;Lade Zeit für 15 sec
movwf loops
call wait
bcf K2 ;Karusell 2 aus
;--------------------------------------------------------------------
movlw D'40' ;10 sec Pause
movwf loops
call wait
;--------------------------------------------------------------------
bsf H ;Hupe ein
movlw D'8' ;Lade Zeit für 2 sec.
movwf loops
call wait
bcf H ;Hupe aus
movlw D'4' ;1 sec Pause
movwf loops
call wait
bsf K2 ;Karusell 2 ein
movlw D'40' ;Lade Zeit für 10 sec
movwf loops
call wait
bsf H ;Hupe ein
movlw D'8' ;Lade Zeit für 2 sec.
movwf loops
call wait
bcf H ;Hupe aus
movlw D'4' ;1 sec Pause
movwf loops
call wait
bsf K1 ;Karusell 1 ein, 2 läuft noch
movlw D'20' ;5 sec Restlaufzeit für Karusell 2
movwf loops
call wait
bcf K2 ;Karusell 2 aus; Karusell 1 noch 10 sec weiter
movlw D'40' ;10 sec Restlaufzeit für Karusell 1
movwf loops
call wait
bcf K1 ;Karusell 1 aus
;--------------------------------------------------------------------
movlw D'20' ;5 sec Pause
movwf loops
call wait
;--------------------------------------------------------------------
bsf H ;Hupe ein
movlw D'8' ;Lade Zeit für 2 sec.
movwf loops
call wait
bcf H ;Hupe aus
movlw D'4' ;1 sec Pause
movwf loops
call wait
bsf K1 ;Karusell 1 ein
movlw D'20' ;Lade Zeit für 5 sec
movwf loops
call wait
bsf H ;Hupe ein
movlw D'8' ;Lade Zeit für 2 sec.
movwf loops
call wait
bcf H ;Hupe aus
movlw D'4' ;1 sec Pause
movwf loops
call wait
bsf K2 ;Karusell 2 ein, 1 läuft noch
movlw D'40' ;10 sec Restlaufzeit für Karusell 2
movwf loops
call wait
bcf K1 ;Karusell 1 aus; Karusell 2 noch 5 sec weiter
movlw D'20' ;5 sec Restlaufzeit für Karusell 2
movwf loops
call wait
bcf K2 ;Karusell 2 aus
;--------------------------------------------------------------------
movlw D'20' ;5 sec Pause
movwf loops
call wait
goto M1 ;Sprung an Anfang
;--------------------------------------------------------------------


;*************************************************************
;*  Unterprogramme
;* ----------------------------------
;
; Warteschleife 250ms*Wert aus loops
wait    movlw   D'250' ;1. Zähler auf 250
        movwf   loops1 
wai     movlw   D'250'  ;2. Zähler auf 250
        movwf   loops2 ;loops1 wird 250 mal durchlaufen => 250*250*4µs => 250ms
wai2    nop ;loops2 wird 250 mal durchlaufen je 4 Befehle = 4µs => 1ms
        decfsz  loops2, F ;2. Zähler minus 1, schon 0?
        goto    wai2    ;nein, noch nicht
        decfsz  loops1, F   ;1. Zähler minus 1, schon 0?
        goto    wai      ;nein, noch nicht
        decfsz loops, F ;3. Zähler minus 1, schon 0?
goto wait ;nein noch nicht
retlw 0 ;Rückkehr zum Hauptprogramm

end
Gespeichert
Lux
Jr. Member
**
Offline Offline

Beiträge: 87



Profil anzeigen WWW
« Antworten #1 am: Mai 28, 2011, 18:57:54 »

Hi mir fällt auf den ersten Blick auf, dass folgendes fehlt:

Code:
clrf ANSEL ;Digital I/O

Und ich kann mir nicht vorstellen, dass dies Sinn macht:

Code:
call 0x3FF ;Lade 3FF für Taktgeneratorkalibrierung
movwf OSCCAL ;4 MHz Kalibrierung

Lies dich mal hier rein.

Viele Grüße
Nico  Smiley
« Letzte Änderung: Mai 28, 2011, 19:05:20 von Lux » Gespeichert

www.PIC-Projekte.de Projekt Vorstellungen | PIC-µC-Forum
chrisabi
Newbie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #2 am: Mai 28, 2011, 21:05:15 »

Hallo Nico,

90% meiner Weisheiten haben ich von Sprut und den dortigen Erklärungen gelernt. Der von mir benutzte Aufruf stammt von http://www.sprut.de/electronic/pic/programm/sequenc/sequenc.htm.

Meiner Meinung nach braucht der 12F629 den clrf ANSEL nicht.

Das unter obigem link liegende Programm läuft auf meinem PIC. Mein Programm jedoch nicht.

Besteht die Möglichkeit, das die config-Befehle mit Einstellungen im Brenner disharmonisieren?

Viele Grüße chrisabi
Gespeichert
Lux
Jr. Member
**
Offline Offline

Beiträge: 87



Profil anzeigen WWW
« Antworten #3 am: Mai 28, 2011, 21:29:59 »

Okay schaut gut aus. Aber wenn du den PIC gelöscht hast, ist da nichts zum abholen!

Wie kommst du darauf, dass der PIC12F629 das ANSEL Register nicht braucht?
Zitat
ANSEL POR: -000 1111
Somit sind alle Eingänge analog.

Edit: Ich sehe gerade du verwendet GP3 als Eingang, dann ist es tatsächlich egal.

Zitat
Besteht die Möglichkeit, das die config-Befehle mit Einstellungen im Brenner disharmonisieren?
Ist eigentlich nicht möglich, wenn das Config Word im Code steht ist es gesetzt.
« Letzte Änderung: Mai 28, 2011, 21:39:07 von Lux » Gespeichert

www.PIC-Projekte.de Projekt Vorstellungen | PIC-µC-Forum
Stephan
Jr. Member
**
Offline Offline

Beiträge: 88


Profil anzeigen
« Antworten #4 am: Mai 29, 2011, 22:29:16 »

Der 12F629 hat kein ANSEL-Register, weil er keinen ADC hat.

Code:
     bank1             ; Macro für Bank 1 aufrufen
     call    0x3FF     ; hole OSCCAL-Wert
     movwf   OSCCAL    ; 4-MHz-Kalibrierung
ist die übliche Methode, um im 12F629 bzw. 12F675 den Oszillator zu stellen.
Gespeichert
chrisabi
Newbie
*
Offline Offline

Beiträge: 3


Profil anzeigen
« Antworten #5 am: Mai 30, 2011, 16:11:49 »

Hallo Stephan,

ich glaube mit der Befehlsfolge bei der Initialisierung das genau so gemacht zu haben.
Code:
 
        bsf STATUS, RP0 ;Umschalten auf Bank 1
call 0x3FF ;Lade 3FF für Taktgeneratorkalibrierung
movwf OSCCAL ;4 MHz Kalibrierung
bcf STATUS, RP0 ;Rückschalten auf Bank 0

Für mich ist es absolut unklar, warum das Beispielprogramm der Sprut-Seite, welches über Timer0 Interrupt gesteuert ist, auf dem PIC läuft und mein Spielzeugprogramm nicht.
Ich muss also irgendeinen Fehler beim Brennen machen oder aber der PIC ist durch mein ursprüngliches Überschreiben der OSCALL hinüber.

Vielleicht hat noch jemand einen Hinweis.

Vielen Dank

Christian.
« Letzte Änderung: Mai 30, 2011, 16:14:56 von chrisabi » Gespeichert
Lux
Jr. Member
**
Offline Offline

Beiträge: 87



Profil anzeigen WWW
« Antworten #6 am: Mai 30, 2011, 20:00:53 »

Der 12F629 hat kein ANSEL-Register, weil er keinen ADC hat.

Das ist Unfug. Der PIC12F629 hat einen ADC. Siehe Datenblatt und/oder Reichelt Einkaufsliste.

Gruß
Gespeichert

www.PIC-Projekte.de Projekt Vorstellungen | PIC-µC-Forum
Stephan
Jr. Member
**
Offline Offline

Beiträge: 88


Profil anzeigen
« Antworten #7 am: Mai 31, 2011, 07:40:00 »

> Das ist Unfug. Der PIC12F629 hat einen ADC. Siehe Datenblatt und/oder Reichelt Einkaufsliste.

Datenblatt Page 1: Sowohl im Text als auch in der Tabelle unten steht, dass nur der 12F675 einen A/D-Wandler hat.

Datenblatt Page 8: beim Register ANSEL ist eine hochgestellte (2) in Klammern. Unten steht "PIC12675 only".

Datenblatt Page 41: "PIC12F675 only"

Bei Reichelt steht zwar der ADC, das ist aber falsch. Es zählt das Datenblatt.
Gespeichert
Lux
Jr. Member
**
Offline Offline

Beiträge: 87



Profil anzeigen WWW
« Antworten #8 am: Mai 31, 2011, 09:14:18 »

Guten Morgen,
tatsächlich, dann entschuldige ich mich für meine falsche Information  Unentschlossen
Hilft leider alles nicht beim Problem...

sonnige Grüße
Nico
Gespeichert

www.PIC-Projekte.de Projekt Vorstellungen | PIC-µC-Forum
Holgi
Jr. Member
**
Offline Offline

Beiträge: 53


Profil anzeigen WWW
« Antworten #9 am: Mai 31, 2011, 18:21:20 »

Wenn GPIO2 angeht kommt er ja bis scheinbar bis bsf H
Kommentiere doch mal die Waitschleife aus bis auf den retlw, so dass er dort gar nix zu tun hat, dann müsster er ja durch dein Programm "durchrasen".
Dann die einzelnen Schleifen in wait wieder freigeben

Oder alternativ mal den ersten call wait auskommentieren ob er dann H wieder ausmacht.
Einfach mal rantasten.

Holger
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.073 Sekunden mit 18 Zugriffen.
 
Top! Top!