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
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'.
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.
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 :-|
sorry sind noch ein paar Zeilen vom Zeiten testen dazwischen gerutscht...
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.
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
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.