Forum: Mikrocontroller und Digitale Elektronik Pic16f874-20l Porta Programmierung


von Dominik N. (dominiknunn)


Lesenswert?

Hallo,
Ich habe mich in diesem Forum angemeldet, da ich nicht mehr weiter
komme...
Habe bisher immer den Pic16F84A programmiert,da mir aber bei meinem
derzeitigen Projekt die Ports nicht reichen habe ich mir einen 16F874
besorgt.
Nun habe ich folgendes Problem: Der 16F874 hat einen doppel belegten
PORTA - analog/digital Eingänge und ich kann zwar den PortB als Eingang
programmieren(das habe ich bereits getestet) PORTA allerdings nicht.
Ich befürchte ich habe ein Fehler beim programmieren, genauer gesagt
beim umschalten der analogen Eingänge auf digitale Eingänge hier mal
mein "Test" Quell Code ganz simpel:


LIST p=16f874

#include <P16f874.INC>

__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC

org 0x00


BSF 03H,5
MOVLW b'0000000'
MOVWF 86h
BCF 03H,5


BSF      03h,5
BSF      ADCON1, PCFG3
BSF      ADCON1, PCFG2
BSF      ADCON1, PCFG1
BSF      ADCON1, PCFG0
BCF      03h,5

main

 MOVLW 01h
 MOVWF 06h


 BTFSS PORTA,0
 Goto main

 MOVLW 00h
 MOVWF 06h

 End

Die LED am Ausgang leuchtet und wie gesagt wenn ich den Port B als
Eingang programmiere kein Problem aber der PortA....

   würde mich sehr über eine Antwort freuen

                                        gruß Dominik

von Champagner (Gast)


Lesenswert?

Mache es doch genau so wie Beispiel 4-1 im Datenblatt auf Seite 41:

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'.

von Uwe Nagel (Gast)


Lesenswert?

Genau, das ADCON1-Register ist hier der Unterschied zu den Prozessoren
ohne AD-Converter. Leider ist die default Einstellung so, dass man
Programme nicht direkt übernehmen kann.

von Dominik N. (dominiknunn)


Lesenswert?

Dann würde der Quelltext so aussehen:



LIST p=16f874

#include <P16f874.INC>

__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC


org 0x00

ZAEHL1  equ 0ch
ZAEHL2  equ 0dh



  BSF 03H,5
  MOVLW b'0000000'
  MOVWF 86h
  BCF 03H,5

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


main

  BTFSS PORTA,0
  Goto main

  MOVLW b'0010001'
  MOVWF 06h
  call motor1


pause

loop1  decfsz ZAEHL1,1
    goto loop1
    decfsz ZAEHL2,1
    goto loop1
    return


motor1
  call pause
  call pause
  call pause
  movlw b'0000001'
  movwf 06h
  call pause
  call pause
  call pause
  movlw b'0010001'
  movwf 06h
  decfsz ZAEHL1,1
  goto motor1
  return




end

habs gerade getestet it does not work :-|

von Dominik N. (dominiknunn)


Lesenswert?

sorry sind noch ein paar Zeilen vom Zeiten testen dazwischen
gerutscht...

von Uwe Nagel (Gast)


Lesenswert?

Deine Variable liegen bei 0x0c und 0x0d, da sind aber noch SFR's. Der
RAM fängt erst bei 0x20 an.
Ausserdem must du das STATUS,RP0 Bit auch wieder löschen, sonst greift
du nicht auf den Port sondern auf TRISA zu.

von Dominik N. (dominiknunn)


Lesenswert?

Sorry aber mit dem Ram steh ich grad voll auf´m Schlauch.
Das mit dem schließen ist klar aber mit dem Ram?
Kannst vielleicht mal ein beispiel posten?
thx gruß Domi

von Beeblebrox (Gast)


Lesenswert?

Das mit dem Ram soll heißen: Der 16f84 hat seinen Ram-Bereich (also die
frei benutzbaren Register) an anderer Stelle als der 16f874. Wenn Du
also die Variable Zaehl1 auf 0ch legst und Zaehl2 auf 0dh, dann liegen
die vielleicht beim 16f84 im Ram-Bereich, aber beim 16f874 im
Special-function-register Bereich. Leg einfach Zaehl1 auf 020h und
Zaehl2 auf 021h. Wo die Rambereiche sind steht irgendwo in den ersten
20 Seiten im Datenblatt.

von Tobias (Gast)


Lesenswert?

Ja genau,

ZAEHL1  equ 0ch
ZAEHL2  equ 0dh

geht nicht, da das Register 0ch mit PIR1 und das Register 0dh mit PIR2
(siehe Datenblatt) belegt ist. Erst ab Register 20h darfst du eigene
Variablen definieren. D. h.

ZAEHL1  equ 20h
ZAEHL2  equ 21h

wäre die bessere Lösung. Probiers einfach aus! IM Datenblatt auf Seite
17 ist übrigens eine schöne Tabelle, die das verdeutlicht. Ab Register
20h fangen die "General Purpose Register" an, die du selbst belegen
darfst.

von Tobias (Gast)


Lesenswert?

> geht nicht, da das Register 0ch mit PIR1 und das Register
> 0dh mit PIR2 (siehe Datenblatt) belegt ist.

Sofern du in Bank 0 bist.

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.