Forum: Mikrocontroller und Digitale Elektronik Probleme hex-File zu erstellen von PIC16F1527(1827)


von Michael (Gast)


Lesenswert?

Hallo zusammen! Ich habe bisher immer mit PIC16F877 oder ähnlichen 
gearbeitet und nie Probleme gehabt. Jetzt wollte ich mal paar PWM'S mehr 
nutzen und wollte daher auf einen PIC16F1527 umsteigen. Leider komme ich 
nicht mal dahin, das HEX-File zu erstellen, da die MPASMWIN.exe wohl 
leider den Controller nicht kennt, obwohl im MPLAB derjenige in der 
Liste der möglichen auszuwählen geht. Ich hab dann mal eine 
ASM-Template-Datei von Microchip genommen mit dem Gedanken, das Gerüst 
müsste ja gehen, weil fehlerfrei. Leider gibt es da wieder nur den 1827 
als TEMPLATE, dann eben den genommen und siehe da, geht auch nicht.
Kann mir jemand bitte einen Tip geben, hier muss doch etwas im Grundsatz 
falsch sein oder fehlen?

Hier meine Software:
MPASM v4.02
MPLAB IDE v8.70
Win 7

Benutztes Template:
16F1827TEMP.ASM
Includedatei:
P16F1827.INC

Err-Datei:
Error[132]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 37 : Unknown 
processor (16F1827)
Message[301] D:\ERZEUGUNG HEX\WISORE_V2.00\P16F1827.INC 33 : MESSAGE: 
(Processor-header file mismatch.  Verify selected processor.)
Error[131]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 51 : 
Processor type is undefined
Error[131]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 52 : 
Processor type is undefined
Error[131]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 80 : 
Processor type is undefined
Error[126]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 87 : Argument 
out of range (0004 not between 0000 and 0000)
Warning[207] D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 88 : Found 
label after column 1. (GOTO)
Error[122]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 88 : Illegal 
opcode (START)
Warning[207] D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 107 : Found 
label after column 1. (RETFIE)
Warning[207] D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 119 : Found 
label after column 1. (GOTO)
Error[108]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 119 : Illegal 
character ($)
Error[131]   D:\ERZEUGUNG HEX\WISORE_V2.00\16F1827TEMP.ASM 122 : 
Processor type is undefined

von Stefan F. (Gast)


Lesenswert?

Du hast 16F1827 eingestellt, aber einen 16F1527 verwendet. Ist das so 
richtig?

von Michael (Gast)


Lesenswert?

Nein, anders. Ich habe physisch einen 1527. Include-Datei gibt es, habe 
mein eigenes ASM-File anfänglich erstellt und kam zu keinem fehlerfreien 
hex-File.

Dann laß ich, dass es für alle PICs ein von Microchip vorgefertigtes 
ASM-File gibt. Also das suchen, nehmen und schauen, ob das geht und was 
ich anders machen muss in meinem eigenen. Mist, include gibt es, aber 
das TEMPLATE.ASM für 1527 gibt es nicht. Also, denke ich, nimm einen 
ähnlichen zum Test -> 1827, da gibt es sowohl TEMPLATE als auch 
include-File, also das getestet. Geht auch kein hex-File zu erstellen, 
die gleichen Fehler wie 1527. Folglich muss mir irgendein Softwarestand 
fehlen.

von John (Gast)


Lesenswert?

Michael schrieb:
> MPASM v4.02

So weit ich weiß unterstützt diese Version noch keine PIC16F mit 
4-stelligen Nummern (PIC16Fxxxx).

Wenn du MPLAB X nicht verwenden möchtest, könntest du es mal die letzte 
Version von MAPLB 8 versuchen (116 MB):
http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_92.zip

von Michael (Gast)


Lesenswert?

Also jetzt bin ich einen Schritt weiter, daher erstmal vielen Dank für 
eure Hilfe!
Jetzt geht schon mal ein hex-File raus obwohl noch mit Fehlern, die aber 
sicher im Code-Detail zu beheben sind. Ich kann nicht versprechen, mich 
hier nie wieder zu zeigen, aber ich versuch's. ;-)

Was mich noch wundert, dass auch jetzt noch kein Template-File für den 
1527 in der Liste steckt, include-File sehr wohl .... was sie sich dabei 
wohl gedenkt haben ...

Gruß Micha

von Jochen-paul S. (picfan)


Lesenswert?

Hallo,
möglicherweise weisst du nicht, dass vor ein paar Jahren eine neuere 
Entwicklungsumgebung herausgegeben wurde, nämlich mplabx.
Die letzte Version(v5.30)ist zwar enorm gross, dafür aber kann man alles 
von PIC und AVR programmieren was man will.
Gruss picfan

von Auweia (Gast)


Lesenswert?

> zwar enorm gross

Fuer einen 16F1527 wuerde es schon reichen die richtigen Header
zu benutzen. Und nicht die von einem der nur so aehnlich klingt.

Ist doch eigentlich logisch. Selbst eine intelligente Amoebe
wuerde das hinkriegen.

von michael (Gast)


Lesenswert?

Hallo an alle! Ich habe das grundsätzliche hinbekommen mit der richtigen 
MPLAB-Version.
(Zu Dir "AUWEIA":
Deine süffisante Kritik passt nicht ganz, denn ich habe ja zu diesem 
Zeitpunkt nur das HEX-File erstellt, und da ging es nur um den Ersatztyp 
1827. Aber egal, inhaltsreiche Antworten gibts ja hier auch.)

Jetzt hab ich ein reines Programmier- oder Einstellungsproblem, 
folgendes:

Ich möchte beispielsweise von PortB, der momentan so aussieht: 11100011
einfach das Pin 3 auch einschalten. Das geht auch mit BSF PORTB,3. 
Jedoch gehen dabei alle anderen, also der gesamt PortB gleich mit aus. 
Den Effekt kenne ich nicht. Was ist hier anders als bei früheren PIC's?

Ich dachte erst, dass der PIC-Simulator das falsch macht, aber in echt 
siehts genau so aus.
Irgendwie lässt sich kein Pin ein- oder ausschalten, ohne alle anderen 
Pins des betreffenden Ports auszuschalten.

Danke falls mir einer helfen kann! Micha

von Michael (Gast)


Lesenswert?

Nach weiteren nervigen Tests und Recherchen habe ich erkannt, dass es 
wohl das read modify write problem sein müsste, was dafür verantwortlich 
ist. mit anderen worten, früher (16F877 ...) war alles besser, denn da 
ging das problemlos mit dem Setzen einzelner Port-Pins sowie auch mit 
dem Lesen der Port-Pins bzw. des gesamten Ports. Hier bei dem 16F1527 
kann ich noch nicht mal den Port lesen, wenn er als Ausgang fungiert. 
Ich bewege LATB oder PORTB ins W und nichts kommt rein ins W, daran wird 
das liegen, wenn ich ein Pin einschalte, aber alle anderen dabei 
ausgehen, weil er den Port zwar ausliest, es aber eigentlich gar nicht 
tut und somit alle anderen außer dem gesetzten als AUS sieht. Gibt es da 
einen Haken, den ich noch nicht erkannt habe?

von Klaus (Gast)


Lesenswert?

Michael schrieb:
> Ich bewege LATB oder PORTB ins W und nichts kommt rein ins W,

Was bedeutet "nichts"? Ich dachte immer ein Bit ist entweder 0 oder 1, 
"nichts" kommt da nicht vor.

MfG Klaus

von Jochen-paul S. (picfan)


Lesenswert?

Michael schrieb:

> mit anderen worten, früher (16F877 ...) war alles besser, denn da
> ging das problemlos mit dem Setzen einzelner Port-Pins sowie auch mit
> dem Lesen der Port-Pins bzw. des gesamten Ports.

Hallo,
probier doch mal: "BSF LATB,3".
Im Gegensatz zum alten 877 besitzen die neueren Pic16 vor den Ports ein 
Latch.

Gruss J.P.

von neuer PIC Freund (Gast)


Lesenswert?

Bei dem wenigem Code bleibt es bei einer Raterunde.

ANSELB gelöscht?

Und nach lesen des Dabla weißt du, r-m-w geht nur auf LATB ordentlich. 
Lass die Versuche mit PORTB gleich sein.

Programmierst du eigentlich mit einem Pickit oder exotisch?

von Jochen-paul S. (picfan)


Lesenswert?

Nachtrag:
eventuell auch: "CLRF ANSELB"

von Michael (Gast)


Lesenswert?

Hallo!
Es funktioniert nur so (hier schalte ich der Riehe nach alle Pins von 
PortB ein):

  CLRF  SHADOWPORTB
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVLW  D'1'
  IORWF  SHADOWPORTB,F
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVLW  D'2'
  IORWF  SHADOWPORTB,F
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVLW  D'4'
  IORWF  SHADOWPORTB,F
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVLW  D'8'
  IORWF  SHADOWPORTB,F
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVLW  D'16'
  IORWF  SHADOWPORTB,F
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVLW  D'32'
  IORWF  SHADOWPORTB,F
  MOVFW  SHADOWPORTB
  MOVWF  LATB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE
  MOVFW  SHADOWPORTB
  CALL  WARTE
  CALL  WARTE
  CALL  WARTE

Ohne dieses "Schattenregister" geht es einfach nicht, da geht immer der 
zu setzende Eingang an aber die anderen alle aus am selben Port.
ANSELB war 0, ich habe auch nur das LATB versucht zu setzen, und den 
PORT zu lesen vorher statt des Schattenregisters, alles hat nichts 
gebracht. Da frag ich mich, was dieser Schwachsinn soll, wenn er solche 
Probleme macht??

von Michael (Gast)


Lesenswert?

Gleich ein neues Problem mit dem 1527, gleich vorher, es ist ein 
PIC16F1527 und nicht LF.
Über 3,5V bleibt er einfach stehen und lässt sich auch nicht 
programmieren, obwohl er lt. Datenblatt bis 5,5V verträgt und auch mit 
5V laufen müsste. Gitb es da etwa eine 
Konfigurationspflicht/möglichkeit, dass er mit 5V laufen soll??

von Michael (Gast)


Lesenswert?

Ach so, ich programmier das Ding mit PICKit3

von John (Gast)


Lesenswert?

neuer PIC Freund schrieb im Beitrag #6170559:
> Bei dem wenigem Code bleibt es bei einer Raterunde.

Zeig doch mal den kompletten Code, inklusive der Initialisierung.
Und ein Bild vom Aufbau wäre auch nicht schlecht.

Sonst können wir, wie neuer PIC Freund schon geschrieben hat, nur raten.

Gruß
John

von Teo D. (teoderix)


Lesenswert?

Michael schrieb:
> Gleich ein neues Problem mit dem 1527, gleich vorher, es ist ein
> PIC16F1527 und nicht LF.
> Über 3,5V bleibt er einfach stehen und lässt sich auch nicht
> programmieren, obwohl er lt. Datenblatt bis 5,5V verträgt und auch mit
> 5V laufen müsste. Gitb es da etwa eine
> Konfigurationspflicht/möglichkeit, dass er mit 5V laufen soll??

Der Core arbeitet nur bis 3,3V, um in (und die IOs) mit 5V zu betreiben, 
ist ein interner LDO verbaut und muß dann auch benutzt werden (inkl. 
externen Lwo-ESR 100nF)!

von John (Gast)


Lesenswert?

Michael schrieb:
> ich habe auch nur das LATB versucht zu setzen

Machen wir mal weiter in dieser fröhlichen Raterunde:

Die Port-Regiser und die Latch-Register befinden sich in 
unterschiedlichen Speicherbänken.
Um auf die Latch-Register zuzugreifen muss vorher die entsprechende 
Speicherbank gewählt werden.

So werden die Pins von Port B der Reihe nach eingeschaltet:
1
    BANKSEL LATB        ;Bank 2 wählen
2
    BSF     LATB, 0
3
    CALL    WARTE
4
    BSF     LATB, 1
5
    CALL    WARTE
6
    BSF     LATB, 2
7
    CALL    WARTE
8
    BSF     LATB, 3
9
    CALL    WARTE
10
    BSF     LATB, 4
11
    CALL    WARTE
12
    BSF     LATB, 5
13
    CALL    WARTE

Gruß
John

von neuer PIC Freund (Gast)


Lesenswert?

> Ich dachte erst, dass der PIC-Simulator das falsch macht, aber in echt siehts 
genau so aus.

Das ist doch ein gutes Zeichen.

> Es funktioniert nur so

Und so
1
#include <stdint.h>
2
3
#include <xc.h>
4
5
void main(void) {
6
7
    ANSELB = 0;
8
    TRISB = 0;
9
    WPUB = 0;
10
    
11
    while (true)
12
    {
13
        uint_fast8_t i = 1;
14
        LATB = 0;
15
        while (i)
16
        {
17
            LATB |= i;
18
            _delay(5);
19
            
20
            i = (i << 1) & 0xFF;
21
        }
22
    }
23
    
24
    return;
25
}

Der compiler macht sogar das mit dem BANKSEL immer richtig. Die 
Befürchtung das selbiges auf 0 steht, habe ich auch.

Wenn du ein Pickit benutzt, warum dann nicht einfach mal Break und die 
Pins im IO-View toggeln?

Ratebeitrag:

CALL WARTE hat Seiteneffekte.

von picfan (Gast)


Lesenswert?

Genau so wie John es schreibt, selbstvertändlich sind PORTB und LATB 
nicht nicht in derselben Bank. Wenn man mit Assembler arbeitet, sollte 
das eigentlich klar sein.
Auch der 877 hatte verschiedene Banken für die SFR's.

von Michael (Gast)


Lesenswert?

Hallo an alle!
Danke für den Tipp mit den Banken hinsichtlich der LATB-Register, die ja 
in Bank 2 sind (DAS HÄTTE MIR NICHT PASSIEREN DÜRFEN), ich schäme mich, 
bin überlastet. :-) Das Problem sei geklärt. Weiteres (zum VCAP 
3,3/5V-Problem) evtl. später .... Nochmal vielen Dank!

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

So liebe Leute, ich bins mal wieder - leider :(
Gecheckt ist jetzt die 3,3V-Problematik, sie gabs gar nicht, PIC blieb 
stehen wegen Programmfehler - und der hält mich jetzt schon tagelang 
auf:

Vielleicht weiß da einer einen Rat. Es geht um I2C, so wie es bisher mit 
einem PIC16F877 und einem EEPROM immer funzte, hie rsoll aber ein 
PIC16F1527 als Master mit einem 877 als Slave reden. Leider geht noc 
nicht mal ein kleinster Anfang. Frage dazu:

Warum wird das SSP1IF-Flag nicht gesetzt (Deswegen bleibt er bei dieser 
Abfrage hängen). Ich habe alles mögliche probiert und gelesen, weiß nu 
echt nicht mehr weiter. Mann was für ein Drama mit diesen englishcen 
Beschreibungen. :)

Hier bleibt er hängen:
WAITMSSP        ; Warte bis SSPIF gesetzt ist
  BANKSEL  BANK2
  BSF  LATB,2
  BANKSEL  BANK0

  BANKSEL  BANK0
  BTFSS  PIR1,SSP1IF
  GOTO  $-1
  BCF  PIR1,SSP1IF
  RETURN

Code hängt mit an, paar LED-(Port)-Befehle zum erkennen, dass überhaupt 
was läuft, PWM's hier Nebensache, die gehen immerhin. :)

Danke für Eure Hilfe, wenn möglich!!

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.