-         

Ergebnis 1 bis 4 von 4

Thema: Schaltung fehlerhaft

  1. #1

    Schaltung fehlerhaft

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    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ß

  3. #3
    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:

    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!!

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.11.2007
    Alter
    33
    Beiträge
    140
    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ß

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •