PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schaltung fehlerhaft



Atmelbeginne
04.09.2008, 07:15
Guten Morgen zusammen

Mein Programm soll wiefolgt funktionieren:

Wenn an RA0 ein Low anliegt soll am Pin RA2 ein Heig ausgegeben werden. Damit wird eine LED angesteuert. Es passiert weiter nix.
Sollte beim einschalten des PIC´s an Pin RA0 ein High anliegen soll der Ausgang RA1 ein High bekommen und damit eine LED einschalten. Die Abfrage ob hier ein High anliegt erfolgt nur beim einschalten des PIC´s.
Nur bei einem High an RA0 wird aus dem EEprom ein Wert aus 0x0h eingelesen, der an den Pinnen RB0-RB7 ausgegeben wird. Diese Pinne werden mit der paralleln Schnittstelle am PC verbunden. Eine Software am PC liesst alle 10ms den Port aus. Der Wert wird angezeigt. .....Soweit die Idee.

Nachdem mein Programm im Simulator einwandfrei funkltioniert hat, sollte damit ein PIC16F628A zum leben erweckt werden. Dafür habe ich ihn folgendermaßen beschaltet:

Alle Pins (ausser Vdd und VSS) mit einem Pull-Down Widerstand gegen Masse. VDD an stabilisierte 5V. Vss an Masse. An den Pinnen RB0-RB7 kommt ein Steckverbinder der direkt mit der Parallelschnittstelle verbunden ist. An Pin RA0 wird mit einem DIP Schalter zwischen High und low geschaltet. RA1 und RA2 werden mit einem 150 Ohm Widerstand und einer LED 0,20 mA bestückt. An RA6 & RA7 kommt ein 4MHz Quarz mit 2 Keramikkondensatoren 33p gegen Masse zum Einsatz. Es bleiben lediglich die Pinne RA3, RA4, und RA5 unbenutzt. Sie liegen aber trotzdem über den Pull-Down gegen Masse.

Soweit die Schaltung. Wenn ich nun Spannung anlege verhält sich der PIC wie gewünscht. RA0 = Low --> Es leuchtet die LED an PIN RA1.

Spannung ab --> RA0 per DIP Schalter auf High --> Spannung an --> Es leuchtet die LED an PIN RA1

Frage 1: Da eine Änderung zu erkennen ist kann ich doch davon ausgehen das der PIC grundsätzlich erstmal taktet??

Weiter erwarte ich an den Pinnen RB0-RB7 ein mir noch unbekanntes Signal welches über das Arbeitsregister aus der EEPROM-Adresse 0x0 gelesen wurde. Wenn ich die Augänge unbeschaltet lasse, kann ich mit einem V-Meter an einzelnen Pins eine Spannung von 5V messen sodass ich davon ausgehen kann das ein Bitwort an den Pinnen anliegt. Wenn ich aber das Parallel-Port Kabel aufstecke kann ich nur noch 1,4V messen. Das scheint der Parallelen Schnittstelle nicht als High zu reichen. Daher liesst die Software am PC immer eine 0 am Port aus.

Frage 2: Muss ich an den Ausgangsports noch eine Transitorstufe hängen um den Pegel auf > 4,2V zu heben??

Ich hoffe ich habe mich verständlich ausgedrückt.

Vielen Dnak im voraus

Enrock
08.09.2008, 05:32
Guten Morgen,

Poste doch mal deinen Code und die Schaltung als Bild, wenn das möglich ist. So machst du uns das Leben einfacher.

Gruß

Atmelbeginne
12.09.2008, 08:15
Guten morgen

So, nachdem ich mich nun sehr intensiv aber erfolglos mit der Fehlersuche beschäftigt habe, hoffe ich dass ihr mir helfen könnt.

Hier erstmal der Code:



; PIC auswaehlen
list p=16f628a

; Include Datei fuer den PIC
#include <p16f628a.inc>

; Config Word / Code protection off / Low voltage programming off
; Brown out off / Power up off / Watchdoc off / Oscilator XT / Pin RA5 digital
__CONFIG B'11111110000001' ;3F09h

;------------------------------------------------------------------------------

Init

; Comperatorausgaenge als I/O nutzen
BANKSEL CMCON ; In Bank wechseln
MOVLW B'00000111' ; Wert 0x7h nach Register W
MOVWF CMCON ; Register W nach CMCON

; Pins am PortA definieren (1=Eingang 0=Ausgang)
BANKSEL TRISA ; In Bank wechseln
MOVLW B'00100011' ; Wert 0x23h nach Register W
MOVWF TRISA ; Register W nach TRISA

; Level an Pins PortA definieren
BANKSEL PORTA ; In Bank wechseln
MOVLW B'00000000' ; Wert 0x0h nach Register W
MOVWF PORTA ; Register W nach PortA
MOVLW B'01010101'
MOVWF 0x21

;------------------------------------------------------------------------------

S1

; Pruefen ob DIP1 eingeschaltet
BANKSEL PORTA ; In Bank wechseln
BTFSS PORTA, 0 ; High Level an RA0 ?
GOTO UP1 ; Sprung nach UP1
CALL UP2 ; Sprung nach UP2


; Aufruf Unterprogramm Vergleich
CALL Comp

; Schleife durchlaufen solange DIP1 = high
GOTO S1 ; Schleife

;------------------------------------------------------------------------------

UP1
; Anzeigen Status LED an Pin RA2
BCF PORTA, 2 ; Status LED aus
GOTO S1

UP2 ; Loeschen Status LED an Pin RA2
BSF PORTA, 2 ; Status LED ein

RETURN


;------------------------------------------------------------------------------

Comp
; Vergleich der Port-Level mit Register Hardwareadresse HwAdr (0x21)
BANKSEL PORTB ; In Bank 0 wechseln
MOVFW PORTB ; Wert aus PortB in Register W
MOVWF 0x22 ; Register W nach 0x22
MOVFW 0x21 ; Register 0x22 einlesen
SUBWF 0x22, 0 ; Register vergleichen durch Subtraktion
BTFSC STATUS, 2 ; Pruefen ob Zero Flag gesetzt
BSF PORTA, 4 ; Out schalten
BTFSS Status, 2 ; Pruefen ob Zero-Flag gesetzt
BCF PORTA, 4 ; Out ausschalten
RETURN ; Ruecksprung

;------------------------------------------------------------------------------

; Ende
END





Ich habe mit den Kommentaren nicht gegeizt, da ich noch in der Anfängerphase bin und ich damit besser zurecht komme.

Zum Verständnis hier nochmal die Erklärung was der Code können soll:

Wenn PortA RA0 = low dann mache garnix

Wenn PortA RA0 = high dann schalte Ausgang PortA RA2 auf high
Dadurch wird eine LED eingeschaltet. Der Status der LED wird so lange erhalten wie PortA RA0 = high

Dann wird ein Wert in das Register 0x21h geschrieben. In diesem Beispiel der Wert 0x55h. Solange PortA RA0 auf high soll ein Vergleich zwischen den Pegel an PortB und dem Register 0x21h stattfinden. Dafür wird der Wert durch Subtraktion verglichen. Wenn der Wert gleich ist wird das Zero-Flag gesetzt. Dieses frage ich ab. Wenn high, dann schalte PortA RA4 auf high. Wenn Zero-Flag nicht gesetzt dann PortA RA4 = low.


Im Simulator funktioniert das ganze offensichtlich fehlerfrei.

jedoch in der Schaltung bekomme ich den PortA RA4 nicht auf high.

Jedoch macht mich etwas stutzig. Im Pic Simulator kann ich im Register PORTB keine Änderung feststellen. In der OPtion Controller View kann ich am PortB klicken wie ich will. Das Register zeigt keine Änderung. Bei PortA stellt sich das Register wie erwartet. Ist hier ein PIC Controller User der weiß was ich meine ??

Für jede Hilfe bin ich dankbar!!

Enrock
12.09.2008, 16:56
Servus,

ich habe jetzt nur mal schnell deinen Code überflogen.... Bin noch auf der Arbeit.
Kann erstmal keinen Fehler erkennen.
Was ich ändern würde:

movfw durch movf Register,w
STATUS,2 druch STATUS,Z

ersetzen.

Ich nehme mal an, dass die LED's auf der einen Seite auf Masse liegen. Ist die Schaltung selber gebaut. Hast mal geschaut, ob du mit einem Draht mal 5 V auf die LED brückst um zu testen ob diese funktioniert oder mal mit einem Multimeter oder gar mit einem Oszi die Pegel am Port A überprüft.
Setz einfach mal den Port mit der LED auf 1 um zu sehen, dass die LED brennt. bsf PORTA,2

Gruß