Hallo,
mache grade eine schaltung mit pic16f887
doch ich kann nicht die pull up widerstände einschalten!
also schalte die an aber habe nicht 5V liegen an dem PIN
kann mir jemand weiter helfen
wei0 echt nicht weiter
Also im Datenblatt steht:
The weak pull-up is automatically turned off when the port
pin is configured as an output.
Die PullUp können also nur aktiviert werden wenn die/der PortB-Pin(s=
als Eingang konfiguriert ist.
Also mit
banksel TRISB
movlw 0x0F
movwf TRISB
banksel OPTION_REG
bcf OPTION_REG,7
banksel PORTB ;zurüch zu bank 0
müsste doch das Umschalten auf die pullUps an den Inputs funktionieren.
mfG Ottmar
Also zur funktion nochmal:
es soll eine tastaturabfrage
Tastatur ist mit hilfe litzen an
RBa0- RBA2 und an
RB0-RB3, wo auch pull ab ist
angeschlossen.
ausgabe soll über eine led anzeige gehen
Die ist an PortD angeschlossen.
Das ist meine erste projekt und habe wirklich keine ahnung und bin am
durchdrehen!
bitte wirklich um hilfe!
An port B ist mein 5V vorhanden!
Nimm für den Quelltext bitte einen Dienst ala pastebin, Bilder sind für
sowas nicht gut geeignet, denn hier kann man nicht schön scrollen
geschweige denn etwas zitieren bzw. markieren.
Bei Zeile 7 kann etwas nicht stimmen, du lädst 0xFF rein willst aber nur
4 Pins als Eingang setzen (laut Kommentar), du setzt hier aber alle Pins
als Eingang, wobei diese sowieso schon als Eingang gesetzt sind (war
zumindestens beim 16F84 so). Das gleiche machst du später noch einmal.
Also es sieht zu Anfang schon etwas wirr aus...
Zuerst gehst du zur bank 1 und machst alle PORTD als Ausgang. Dann gehst
du zu Bank0 und setzt die Ausgänge auf 0. Dann gehst du wieder zu Bank 1
und machst alle PORTB auf Eingang, wechselst wieder zu bank0 und danach
gleich wieder zurück auf bank1, überschreibst das vorher gesetzte TRISB
register. Dann "wechselst" du zu Bank1, wo du aber schon bist. Schaltest
die Pullups ein, wechselst zu Bank0, gleich danach zu Bank3, Bank1,
Bank0, Bank1 (hier schreibst du 0xFF ins W-Register aber machst danach
nichts mit), Bank3...
Wieso nicht so:
1
Banksel TRISB // Bank1
2
movlw 0xFF
3
movwf TRISA // Ich denke so sollte das sein,
4
wobei dann dein Kommentar nicht stimmt
5
movlw 0x0F
6
movwf TRISB
7
clrf TRISD
8
bcf OPTION_REG, 7
9
clrf IOCB
10
11
Banksel ANSEL // Bank3
12
clrf ANSEL
13
clrf ANSELH
14
15
Banksel PORTB
16
clrf PORTA // Bringt bei Eingängen nicht viel
17
clrf PORTB
18
clrf PORTD
Später kannst du das ganze "banksel PORTB" und "banksel PORTD" auch
weglassen, weil das alles in der gleichen Bank ist...
Also im moment funktioniert alle spalten doch
-wenn ich egal welche zahl in der selben zeile drücke leuchten immer die
gleichen leds!
Hier:
zeichen 1 oder 2 oder 3 drücke
leuchten PortD 0 1 4 5
wenn ich 4 oder 5 oder 6 drücke
leuchten PORTD 1 2 4 5
wenn ich 7 oder 8 oder 9 drücke
leuchten an PORTD 0 3 4 5
wenn ich * oder 0 oder # drücke
leuchten 0 1 5
- und die binär anzeige von led stimmen auch nicht!
Toll! Wir als ladys bekommen immer solche dumme aufgaben rrrrrrrr
bitte hilft uns :(
Aaallso..
1. Ist der Code wieder als Bild(er). Es gibt hier doch die ASM oder
CODE-Formatierung.
2. PortA ist so wie es da steht als Output und nicht Input, wie in den
Kommentaren steht. Ist aber auch egal, da du es eh nicht benutzt.
3. Machst du immernoch viel unnützes Bankgewechsel.
4. In den Kommentaren steht, dass wenn keine Taste gedrückt wurde, Taste
= 0 sein soll. Was soll denn in Taste sein, wenn die 0 gedrückt wurde?
Ich hätte eher gesagt, wenn 0 dann 0, 1 dann 1, ... 9 dann 9, * dann 10,
# dann 11, keine Taste dann 255 bzw. 0xFF. So kann man dann auch gleich
einfach mit einem btfss/btfsc das Bit 2^4 auswerten. Wenn es gesetzt
ist, wurde keine Taste gedrückt.
5. Ganz oben weist du Spalte 1 0x20 zu. Weiter unten steht dann "bsf
PORTB, Spalte1". Wie soll das gehen? Nach dem Komma kann nur eine Zahl
von 0 bis 7 stehen, 0x20 ist aber 32.
Zeig mal den Schaltplan, wenn vorhanden. Wenn es keinen gibt, dann kann
man sich das ja auch aussuchen.
Ich hätte das so gemacht:
- TrisB ist 0011 1000:
PORTB.0-2 ist Ausgang, das sind die 3 Zeilen. PORTB3-5 ist Eingang, wo
die Spalten via DropDown-Widerstände angeschlossen sind.
- PORTB auf 0:
So sind erstmal alle Zeilen auf Low.
- Sprungmarke für die Schleife
- 0xFF ins W-Register
Das ist der Standardwert, sprich keine Taste wurde gedrückt. Hiernach
werden jetzt die Tasten geprüft und wenn eine gedrückt wurde, wird der
Wert geändert.
- Die 3 Zeilen nacheinander durchgehen:
1
start
2
movlw 0xFF
3
4
bsf PORTB.0 // 1. Zeile auf High
5
btfsc PORTB.3 // Ist die Spalte 1 auf High, wurde die 1 gedrückt.
6
movlw 0x01 // Dann 1 ins W-Register schreiben
7
btfsc PORTB.4 // Wenn nicht, dann nächste Spalte prüfen.
8
movlw 0x02
9
btfsc PORTB.5
10
movlw 0x03
11
bcf PORTB.0 // 1. Zeile auf Low
12
13
bsf PORTB.1 // Das gleiche mit Spalte 2 und 3
14
...
15
...
16
bcf PORTB.2
17
18
movwf PORTD // Hier wird das W-Register zu PortD geschrieben
19
// Wenn keine Taste gedrückt wurde, steht da noch
20
// 0xFF drin. Wenn ja, steht dieser Wert drin.
21
22
goto start
So wird auf PORTD solange die gedrückte Zahl binär angezeigt, wie sie
gedrückt wird.
Funktioniert nicht! ganz viele fehlern!
achja zu
2. PortA ist so wie es da steht als Output und nicht Input, wie in den
Kommentaren steht. Ist aber auch egal, da du es eh nicht benutzt.
im datenblatt steht drin wenn es als input benutzt werden soll dann 0
und als output dann 1. deswegen habe ich alles auf 0!
Schaltplan habe ich nicht!
Kannst du mit auch Initialisierung auch schreiben!
:(
bitte um verständnis :)
Christina März schrieb:> im datenblatt steht drin wenn es als input benutzt werden soll dann 0> und als output dann 1. deswegen habe ich alles auf 0!
LOL, Datenblatt von einem anderem Hersteller gelesen ?
Christina März schrieb:> im datenblatt steht drin wenn es als input benutzt werden soll dann 0> und als output dann 1. deswegen habe ich alles auf 0!
Nö:
http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
z.B. Seite 39, ganz unten.
Christina März schrieb:> Funktioniert nicht! ganz viele fehlern!
Ohne Schaltplan hab ich auch kp ob das überhaupt die richtigen Pins
waren. Aber da du den ja nicht raus rückst, kann ich nur raten bzw dir
einen Anstoß geben. Du hast aber die Schaltung schon aufgebaut, sonst
würdest du ja nicht sagen können, welche LED leuchtet und welche nicht.
Dann kannst du das ja kurz aufm Blatt malen und einscannen oder
Fotografieren oder mit Paint malen etc.
Abgesehen davon ist "Funktioniert nicht" eine Aussage zum
philosophieren.
Christina März schrieb:> Kannst du mit auch Initialisierung auch schreiben!> :(
Das Forum hier ist zum Helfen da und nicht um von anderen das komplette
Programm zu schreiben. Abgesehen davon hab ich das Programm schon zu 80%
geschrieben. Die fehlenden 20% sind ein Bereich markieren, 2 mal zu
kopieren und da dann jeweils 4 Zahlen zu ändern. Ich hab sogar schon
hingeschrieben, was kopiert werden soll/muss. Welche 4 Zahlen geändert
werden müssen, sollte man schon erkennen. Wenn nicht, wird es sowieso ab
dem Punkt scheitern, wenn du es jemanden erklären sollst oder Änderungen
machen musst.