Hallo orph!
Vielen Dank! Vielleich sollten wir noch ein Thema "Sprut Fallen" eröffnen ?
MfG
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):
Diese zwei Befehle kosteten mich 3 Tage Suche, warum eine an PortD angeschlossene 7-Segment-Anzeige mal leuchtet und mal nicht.Code:movlw 11111000b ; 0=Ausgang / 1=Eingang movwf TRISE
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, ....
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 !!!
MfG Karl-Heinz
HobbyElektronik hier klicken ....
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 ?
MfG Karl-Heinz
HobbyElektronik hier klicken ....
Hallo kalledom!
Ich habe es jetzt so:
und es funktioniert.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
Vorher habe ich so erfolglos versucht:
Dort, wo jetzt goto $+2 (quasi 3xNOP) ist, habe ich vorher bis zu 10xNOPCode:@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
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: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 bekommtCode: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
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.
MfG Karl-Heinz
HobbyElektronik hier klicken ....
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?
Lesezeichen