Hallo Experten,
ich habe wieder mal ein PIC-Problem: eine Schaltung mit einem 16F877.
Der soll die analogen Daten von 0 - 5V an PORTA,0 auslesen und auf einer zweistelligen 7-Segment-Anzeige rausgeben.
Die Anzeige passt schon, wenn ich aber den AD-Wandler dazu baue, leuchtet, blinkt plötzlich nur die eine, an PORTC auf.
Habe schon das gesamte Programm für die Anzeige rausgeschmissen, es gibt im Programm keinen PORTC mehr. Dennoch blinkt recht schnell die Anzeige an PORTC.
Hab schon bei Sprut gesucht, das Buch von Günter Schmitt und auch Google und Wikipedia durch. Nichts hilft. Hab keine Idee, wieso der auf PORTC zugreift, obwohl PORTC nirgends im Programm steht.
Bin kurz vorm Haare ausreißen. Hat irgendwer eine Idee?
Wäre toll! Danke! jo-enn
hallo.
Hab keine Idee,
wieso der auf PORTC zugreift, obwohl PORTC nirgends im
Programm steht.
Bin kurz vorm Haare ausreißen. Hat irgendwer eine Idee?
port C und der ADC haben eigentlich nichts miteinander zu tun.
ohne den code zu sehen, wird’s schwierig, mehr dazu zu sagen.
gruß
michael
Hi Michael,
erst mal Danke für Deine Antwort!
Ich versuche mal, ein Stück vom Quelltext hier reinzuschreiben:
movlw b'10100000' ;Timerinterrupt (10100000)
movwf INTCON ;aktivieren
movlw b'10000100' ;Vorteiler 32
movwf OPTION\_REG ;
bcf STATUS,RP0 ;Register Bank 0
movlw .96 ;Teiler setzen
movwf TMR0 ;
bcf STATUS,C ;Carryflag rücksetzen
;16F877: alle ADC-Eingänge auf digital I/O umschalten
BSF STATUS, RP0 ;auf Bank 1 umschalten
BCF STATUS, RP0 ;auf Bank 0 zurückschalten
movlw b'00000000' ;
movwf TRISC ;
movwf TRISD ;
;---------------------------------------------------------------------
bsf STATUS,RP0
clrf TRISC
clrf TRISD
movlw b'00000000'
movwf ADCON1
bsf TRISA,0
bcf STATUS,RP0
movlw b'10011000'
movwf ADCON0
clrf PORTC
clrf PORTD
BSF STATUS, RP0 ; Select Bank1
CLRF ADCON1 ; Configure A/D inputs
BSF PIE1, ADIE ; Enable A/D interrupts
BCF STATUS, RP0 ; Select Bank0
MOVLW 0xC1 ; RC Clock, A/D is on, Channel 0 is selected
MOVWF ADCON0 ;
BCF PIR1, ADIF ; Clear A/D interrupt flag bit
BSF INTCON, PEIE ; Enable peripheral interrupts
BSF INTCON, GIE ; Enable all interrupts
;---------------------------------------------------------------------
BSF STATUS,RP0 ; Bank1
BCF ADCON1, 7 ; ADFM=0
BCF STATUS,RP0 ; Bank0
;---------------------------------------------------------------------
Main
;Eingangsspannung wandeln
BSF ADCON0, 2 ; ADC starten
loop
BTFSC ADCON0, 2 ; ist der ADC fertig?
GOTO loop ; nein, weiter warten
; Wert nach ausw schreiben
movfw ADRESH ; obere 8 Bit auslesen
movwf ausw ; obere 8-Bit nach ausw, das ist die ;Übergabe ins Hauptprogramm
; Warten, damit der ADC sich erholen kann
clrf wait
warten
DECFSZ wait, f
goto warten
btfsc ausw,0 ;den brauche ich fürs Hauptprogramm
call L0 ;ist 'ne Verzweigung
;später kommen dann noch mehrere dazu
goto Main
Ich danke Dir erstmal für Deine Mühe!
cu, jo-enn
MOD(TOO) pre-Tag eingefügt
Hallo jo-enn,
ich hätte Erfahrungen mit dem 16F690 anzubieten; dafür müsste ich aber mal Dein GANZES Programm sehen, auch die __CONFIG-Voreinstellungen! keine Bange, ich stehle Dir nichts!
PS.: Hast Du schon mal den PIC ausgewechselt?
Grüße von Ph33
Hallo Ph33,
Danke erst mal für Dein Angebot!
ich hätte Erfahrungen mit dem 16F690 anzubieten; dafür müsste
ich aber mal Dein GANZES Programm sehen, auch die
__CONFIG-Voreinstellungen! keine Bange, ich stehle Dir nichts!
Glaub ich Dir, Du weißt ja auch nicht, wofür das Ganze sein soll =8o)
PS.: Hast Du schon mal den PIC ausgewechselt?
Schon mit 5 Sück probiert. Die liegen bei mir (siehe meine Vika) einfach so rum.
Habs eben an Deine direkte Adresse geschickt. Sieht schon etwas besser aus, nur die Zeilenumbrüche liegen etwas daneben.
Bis dann - jo-enn
Hallo jo-enn,
ich schau es mir an, dauert aber etwas.
Grüße von Ph33
Danke erst mal!
Eigentlich drängelts etwas. Also nicht bei mir, aber mein Kunde steht schon auf der Matte =8o(
Wenn Du mir helfen kannst, gibts auch ein kleines Taschengeld!
Also bis später, jo-enn
Hallo jo-enn,
ich würde das Programm gern mal assemblieren, dazu muss ich es aber erstmal editieren, da ich sonst lauter Warnungen bekomme wegen Code in Spalte 1. Außerdem habe ich mir das Datasheet geholt und muss es ein wenig studieren. Schade, dass Du nicht den 16F690 verwendest, der könnte das doch auch, oder? Welches feature vom 877 verwendest Du, das der 690 nicht hat?
Grüße von Ph77
Hi Ph33,
ich würde das Programm gern mal assemblieren, dazu muss ich es
aber erstmal editieren, da ich sonst lauter Warnungen bekomme
wegen Code in Spalte 1. Außerdem habe ich mir das Datasheet
geholt und muss es ein wenig studieren.
Kann ich verstehen.
Aber den Quelltext hat ja Peter(TOO) schon ordentlich aufgebaut.
Schade, dass Du nich :den 16F690 verwendest, der könnte das doch :auch, oder?
Das weiß ich im Moment nicht, habe aber alles schon fertig, die Platine (war auch nicht billig) und alle Bauteile drauf. Nur der PIC steckt in einer Fassung. Und das ist auch gut so.
Da ich aber schon seit Jahren mit dem 877 arbeite und noch nie Probleme hatte, habe ich mir den jetzt in etwas größeren Mengen zugelegt. Bin ja seit Oktober 2010 mein eigener Chef.
Welches feature vom 877 verwendest Du, das der 690 nicht hat?
Müsste ich mich schlau machen, aber ich denke, die sollten verdammt ähnlich sein.
Ich bleibe dran.
Melde mich dann noch mal.
cu, jo-enn
Hallo jo-enn,
Hi Ph33,
ich würde das Programm gern mal assemblieren, dazu muss ich es
aber erstmal editieren, da ich sonst lauter Warnungen bekomme
wegen Code in Spalte 1. Außerdem habe ich mir das Datasheet
geholt und muss es ein wenig studieren.Kann ich verstehen.
Aber den Quelltext hat ja Peter(TOO) schon ordentlich
aufgebaut.Schade, dass Du nich :den 16F690 verwendest, der könnte das doch :auch, oder?
Das weiß ich im Moment nicht, habe aber alles schon fertig,
die Platine (war auch nicht billig) und alle Bauteile drauf.
Nur der PIC steckt in einer Fassung. Und das ist auch gut so.
Da ich aber schon seit Jahren mit dem 877 arbeite und noch nie
Probleme hatte, habe ich mir den jetzt in etwas größeren
Mengen zugelegt. Bin ja seit Oktober 2010 mein eigener Chef.Welches feature vom 877 verwendest Du, das der 690 nicht hat?
Müsste ich mich schlau machen, aber ich denke, die sollten
verdammt ähnlich sein.
Nee, sind sie nicht. Der 877 hat mehr Pins und mehr Ports als der 690.
Andere Eigenschaften habe ich noch nicht genau geprüft.
Für die Darstellung von Dezimalzahlen hat doch Sprut ein wunderbares Beispielprogramm gemacht, wo die einzelnen Dezimalstellen im Zeit-Multiplex angesteuert werden. Deine UPs L0, L1 … verstehe ich nicht. Wenn die UPs mit return verlassen werden, ist immer PORTC mit B’11111111’ besetzt, und während des UPs werden nacheinander verschiedene Segmente angesteuert. Leuchten die denn überhaupt noch, wenn das im Befehlstakt wechselt? Ferner vermisse ich im Programm die Wandlung der Binärzahl aus dem A/D-Converter in eine zweistellige Dezimalzahl. Hast Du den Code noch nicht? Außerdem verstehe ich die Programm-Struktur nicht. In der ISR wird die Art des Interrupts nicht abgefragt. Vielleicht habe ich noch nicht alles verstanden.
Wenn Peter(TOO) das Programm kennt, wäre es doch vielleicht effektiver, wenn er was zu dem Fehler sagt.
Ich bleibe dran.
Melde mich dann noch mal.
cu, jo-enn
Grüße von Ph33