-
moin
Wer den PIC 16F88 mit IO-Pins an PortA und RB6+RB7 sollte in der Assembler-Initialisierung in die Bank 1 folgenden Code schreiben:
movlw B'00000000'
movwf ANSEL
Und nicht etwa was auf der Sprut-Homepage steht:
MOVLW 0x06
MOVWF ADCON1
(hat mich lange aufgehalten ;-))
mfg orph
-
Hallo orph!
Vielen Dank! Vielleich sollten wir noch ein Thema "Sprut Fallen" eröffnen ? :)
MfG
-
Ein weiterer Fall von einer Falle oder einfach nur ](*,)
Beim PIC 16F877A (PIC 16F87X) PORTE mit seinen 3 Pins die Richtung auf Ausgänge umschalten (sind nach Reset Eingänge):
Code:
movlw 11111000b ; 0=Ausgang / 1=Eingang
movwf TRISE
Diese zwei Befehle kosteten mich 3 Tage Suche, warum eine an PortD angeschlossene 7-Segment-Anzeige mal leuchtet und mal nicht.
Wenn man dann irgendwann im Datenbuch nachschaut, was denn eigentlich die Bits 7...3 im TRISE machen, ..... auweia, durch TRISE, 4 = 1 ist PORTD im PSP-Mode, .... :-k
Die Richtung also nur durch AND auf 0 setzen und die restlichen Bits schön in Ruhe lassen:
Code:
movlw 11111000b ; 0=Ausgang / 1=Eingang
andwf TRISE ; AND !!!
-
Hallo!
Ich weiss nicht ob es eine Falle ist, aber seit ein paar Monaten ist mir nicht gelungen weder Haupt- noch Time1 Oszillator mit Uhrenquartz 32768 Hz zum oszillieren zu bringen und musste ein externen Oszillator mit zwei CMOS Inverter anwenden. Sogar eine Suche im Microchip Forum hat nichts gebracht. Ist es in realer Hardware (nicht im Simulator) wirklich unmöglich ?
MfG
-
Hallo!
Beim PIC18F252 habe ich zwei mir bisher enbekannte Fallen entdeckt.
Ich wollte zwei Taster, die auf Portpins paralell zum Display angeschlossen sind einlesen und auswerten. Dafür muss man die zwei Pins vom I/O Port vom Ausgang auf Eingang durch TRIS Register umschalten. Das habe ich mehrmals ohne Probleme gemacht. Diesmal wollte ich es aber eleganter machen: nur die zwei Pins ohne die andere zu beanflüssen mit OR setzen, Taster auswerten und wieder mit AND löschen. Leider funktioniert es nicht. Ich vermute, das TRIS Register nur beschreibbar und nicht ablesbar ist, da nach dem Einschreiben des Registers mit richtigem Wert funktioniert's. Im Datenblatt habe ich darüber nichts gefunden.
Sofort nach dem Umschalten dieser zwei Pins, konnte ich leider die Taster nicht einlesen, und erst nach Vezögerung von mindestens 3xNOP (3x0,1 us) habe ich es geschafft. Wahrscheinlich im Simulator hätte es keine Probleme gegeben, da dort keine Streukapazitäten die 0,3 us zum Entladen brauchen gibt. Ich bleibe aber trotzdem bei der realer Hardware! :)
MfG
-
Hallo PICture,
es könnte sein, daß Du auf einen Pipeline-Effekt gestoßen bist, der in einigen Fällen auftritt, wenn z.B. der erste Befehl noch nicht abgearbeitet ist, der nächste dieses 'unfertig' beschriebene Register ausliest. Dann kommt ein falsches Ergebnis bei raus. Da muß dann 1 NOP zwischen.
Kannst Du mal die genaue Reihenfolge der Befehle mit dem TRIS-Register posten ?
-
Hallo kalledom!
Ich habe es jetzt so:
Code:
@RAM movlw 0x9E <- hier wird auf RC2 und RC3 als Eingänge umgeschaltet
movwf TRISC
goto $+2 <- hier wird 3xNOP abgewartet (3x0.1µs bei 40MHz PLL/4)
movf PORTC,0
andlw 0x0C
btfss _Z
goto @Out <- hier wird zurück RC2 und RC3 auf Ausgänge umgeschaltet falls die beiden Taster H sind
movlw 0x92 <- hier wird auf Ausgänge zurückgeschaltet falls die beiden Taster L sind und weiter gelaufen
movwf TRISC
movff DTmp6,STmp6 ; aktives Display sichern
movlw 2 ; Display2
movwf DTmp6 ; aktivieren
lfsr FSR2,0x060
call @2nd
call @Line
call @4th
call @Line
movff STmp6,DTmp6 ; aktives Display wiederherstellen
@Out movlw 0x92 <- bei diesem Wert arbeitet Display mit RC 2 und RC3 als Ausgänge
movwf TRISC
return
und es funktioniert.
Vorher habe ich so erfolglos versucht:
Code:
@RAM movf TRISC,0
iorlw 0x0C <- hier wird auf RC2 und RC3 als Eingänge umgeschaltet
movwf TRISC
movf PORTC,0
andlw 0x0C
btfss _Z
goto @Out <- hier wird zurück RC2 und RC3 auf Ausgänge umgeschaltet falls die beiden Taster H sind
call @Out <- hier wird auf Ausgänge zurückgeschaltet falls die beiden Taster L sind und weiter gelaufen
movff DTmp6,STmp6 ; aktives Display sichern
movlw 2 ; Display2
movwf DTmp6 ; aktivieren
lfsr FSR2,0x060
call @2nd
call @Line
call @4th
call @Line
movff STmp6,DTmp6 ; aktives Display wiederherstellen
@Out movf TRISC,0
andlw 0xF3
movwf TRISC
return
Dort, wo jetzt goto $+2 (quasi 3xNOP) ist, habe ich vorher bis zu 10xNOP
probiert und hat´s nicht funktioniert. Für mich geht eindeutich die Änderung des TRIS Registers mit OR und AND nicht.
Vielleicht fällt Dir was ein ?. Ich habe damit kein Problem mehr.
Schöne Grüsse ! :)
-
Das könnte des Rätsels Lösung sein:
Code:
movf TRISC,0
iorlw 0x0C
movwf TRISC ; Hier ist der Befehl zum Umschalten ...
movf PORTC,0 ; ... der aber hier noch nicht fertig ausgeführt ist !
andlw 0x0C
btfss _Z
goto @Out ; Hier springst Du zur Routine ...
call @Out ; ... und hier ruft Du sie als Unterprogramm auf ?
; ... Was steht am Ende der Routine: return ?
movwf TRISC ; So sollte es funktionieren: Befehl zum Umschalten
nop ; Hier kann die Richtung umgeschaltet werden
movf PORTC,0 ; Hier ist die Richtung umgeschaltet
3 mal oder 8 mal oder wieviel mal auch immer ein NOP reinzusetzen, kann es ja nicht sein. Es handelt sich um einen µC, der absolut logisch arbeitet und niemals Alzheimer bekommt :-)
PS: Beim 16F87x z.B. sind die TRIS-Register in Bank 1. Da können die beiden Befehle für TRIS und PORT nicht direkt hintereinander stehen, dazwischen muß erst auf die Bank umgeschaltet werden. Bis dahin ist die Richtung umgeschaltet.
-
Hallo kalledom!
Der PIC18F252 arbeitet aber mit 10 MHz (40 MHz PLL Oszillator) mit realer Hardware und die 3xNOP (0,3 us) braucht (wahrscheinlich) die Hardware, und nicht der uC selbst. :)
Bei den PIC18FXXX gibt es keine Bankumschaltung.
Es gibt in meinem Program kein Fehler, ich wollte nur auf Probleme, die bei realer Hardware aufereten könnten, aufmerksam machen und zeigen, dass ein fehlerfreies Program (im Simulator) fast immer an die reale Hardware angepasst werden muss.
Deswegen meine Empfehlung:
Beim Schreiben eines Programms für reale Hardware nie ein Symulator benutzen !
MfG
-
Hi user
Ich hab ein Problem mit einem PIC 12F629. Ich habe ein Programm für einen anderen PIC geschrieben(16F690). Dieses wollte ich jetzt in den 12F übertagen, weils nur um das Schalten von zwei Ausgängen in einem Abstand von 2 Sekunden geht. Als Start für dieses Schalten dient ein Eingangspegel an einem anderen Pin.
Das Problem: er erkennt das Startsignal nicht, und arbeitet das Programm also auch nicht ab. Kann sowas an der Konfiguration liegen? Beim 16F läuft das Programm nämlich problemlos.
Hat einer ne Idee?