Hallo, ich brauche mal wieder eure Hilfe ^^ Ich habe ein Thermometer gebaut mit einer Ausgabe an fünf 7-Segment-Anzeigen. Die Hardware habe ich getestet und sie funktioniert einwandfrei. Allerdings kann mein PIC16F887 die analogen Eingänge, die ich an PORTA angeschlossen und programmiert habe nicht lesen bzw. verarbeiten. Da muss irgendwas in der Konfiguration fehlgeschlagen sein. Ich habe die Spannungen mit einem Oszilloskop nachgemessen und kann sicherstellen, dass +5V an den Pins von PORTA anliegen. Ich habe das Datenblatt und andere Internetseiten durchgelesen aber nichts der vorgeschlagenen Lösungen klappt. Anbei mein C-Programm, dass ich mit MPLAB und dem Compiler CC5X geschrieben habe. PORTE = 3 LEDs PORTD = 7-Segment-Anzeigen ansteuern PORTC = Zeichen der 7-Segment-Anzeige Bei der switch-case Abfrage erhalte ich den default-Befehl. Vielen Dank schonmal für eure Hilfe.
OK, PortA ist auf Analog geschaltet. Wenn du mit "a = PORTA" diesen einliest, dann steht in "a" 0x00 drinnen. -->> Datenblatt,, PortA: <...Pins configured as analog inputs will read ‘0’....> Oder was erwartest du??
Chris B. schrieb: > OK, PortA ist auf Analog geschaltet. > Wenn du mit "a = PORTA" diesen einliest, dann steht in "a" 0x00 drinnen. > -->> Datenblatt,, PortA: > <...Pins configured as analog inputs will read ‘0’....> > Oder was erwartest du?? Oh mein Fehler, ich habe vergessen zu erwähnen, dass ich am PORTA vier Schalter eingebaut habe. Und mit dem switch-case-Befehl würde ich dann gerne verschiedene Programme aufrufen. An den Pins von PortA messe ich auch ca 5V Spannung. Der PIC reagiert darauf aber nicht.
Ich habe jetzt auch einmal den "a = PORTA"-Befehl komplett weggelassen und einmal direkt "switch(PORTA)" ausprobiert. Beidemale bleibt das Resultat gleich - nämlich dass der PIC den default-Zweig ausführt.
Dann solltest du aber PORTA - oder zumindest die Pins mit den angeschlossenen Schaltern - auf DIGITAL und nicht auf ANALOG stellen. Denn wie schon oben zitiert, werden bei einem "Port read" die als ANALOG definierten Eingänge als "0" gelesen - egal welche Spannung da anliegt. Ein "switch(PORTA)" liest auch nur den Port ein, also ändert das nichts!
Ich habe jetzt die Ansel-Anweisung gelöscht, leider ohne Erfolg. Ich verstehe das nicht, ich messe direkt mit 1:10-Tastkopf an den Pins des PORTA und erhalte überall 5V, wo ein High-Pegel anliegt, dennoch reagiert der PIC nicht wie gewollt :( Ich habe den neuen C-code angehängt.
Und wiederum KEIN Wunder ;-) In ANSEL steht nach einem Reset 0xFF drinnen. Um den Port auf DIGITAL zu schalten musst du in ANSEL 0x00 schreiben! Datenblatt lesen - Kapitel 3 !! Ausserdem dürfte "PORTA = a" etwas verdreht sein...
Chris B. schrieb: > Und wiederum KEIN Wunder ;-) > In ANSEL steht nach einem Reset 0xFF drinnen. > Um den Port auf DIGITAL zu schalten musst du in ANSEL 0x00 schreiben! > Datenblatt lesen - Kapitel 3 !! > > Ausserdem dürfte "PORTA = a" etwas verdreht sein... Danke erstmal für deine Mühe ;D Also ich habe jetzt in Ansel 0x00 geschrieben und den PORTA=a Befehl rausgelöscht. Das Datenblatt habe ich durchgelesen Nachwievor liest der PIC leider nicht die Eingänge ein. Das Datenblatt habe ich mehrmals durchgelesen, aber laut dem Satz dachte ich man kann die Eingänge auch analog nutzen: "The user should ensure the bits in the TRISA register are maintained set when ->using them as analog inputs<- ." Ich hoffe ich habe deine Ratschläge jetzt nicht missverstanden. Ich habe das Gefühl ich steh teilweise auf dem Schlauch. Falls doch wäre es nett, wenn du direkt im C-Code die falschen Befehle/Direktiven korrigierst :D PS: Die ANSELH und TRISB Befehle spielen erstmal noch keine Rolle. Aber später soll PORTB auch als Eingang dienen. Darum schreib ich sie schonmal hin um dann in Zukunft nicht das gleiche Problem nochmal zu haben^^
Die Initialisierung ist korrekt. Aber: du hast 4 Schalter an deinem PortA hängen. Was ist mit den restlichen 4 Pins? Sind die auf GND, auf +5V oder hängen die in der Luft. Also: PortA einlesen, die Bits an den die 4 Schalter hängen Maskieren (UND-Verknüpfen). Denn wenn auch nur einer der nicht benutzten Pin eine "1" liefert, werden deine "case"-Bedingungen (0...7) nie erfüllt.
Chris B. schrieb: > Die Initialisierung ist korrekt. > > Aber: du hast 4 Schalter an deinem PortA hängen. Was ist mit den > restlichen 4 Pins? Sind die auf GND, auf +5V oder hängen die in der > Luft. > > Also: PortA einlesen, die Bits an den die 4 Schalter hängen Maskieren > (UND-Verknüpfen). Denn wenn auch nur einer der nicht benutzten Pin eine > "1" liefert, werden deine "case"-Bedingungen (0...7) nie erfüllt. An RA6/RA7 ist mein Quartz und an RA4 ein Pull-Up. Ich nehme Ra0 - Ra3 her. Aber trotz maskieren und löschen der vier höherwertigen Bits erhalte ich wieder den "default"-Befehl. Es ist wie verhext ;(
Dir ist aber schon klar das deine 4 Tasten an RA0..RA3 die Werte 0..15 erzeugen können?
.....a = PORTA & 0x0F;..... Und welchen Zustand hat RA3?? Ist der "0"?? Denn nur dann trifft case 0: ... case 7: zu!
Chris B. schrieb: > .....a = PORTA & 0x0F;..... > Und welchen Zustand hat RA3?? > Ist der "0"?? Denn nur dann trifft case 0: ... case 7: zu! Ja, der ist 0V. Ich werd Wohl oder Übel noch einige Pull-Ups einlöten müssen auch wenn dadurch meine Platine verunstaltet wird -.-. Nachdem ich die Pins mit ANSEL=0x00 auf digital geschalten habe, führt das Störsignal beim Messen trotz 1:10-Tastkopf nun zu einem Umschalten. Darum wollte ich auch ursprünglich analoge Eingänge weil da der Spannungsbereich, in dem der PIC noch ein Hgh-Signal erkennt, größer ist soweit ich weiß. Nächstes Mal muss ich das Datenblatt vorher genau durchlesen, aber darauf wäre ich im Traum nicht gekommen, dass manche PORTs einfach nicht als analoge Eingänge nutzbar sind. Hoffentlich klappt es dann besser.
>Nächstes Mal muss ich das Datenblatt vorher genau durchlesen, aber >darauf wäre ich im Traum nicht gekommen, dass manche PORTs einfach nicht >als analoge Eingänge nutzbar sind. Die sind als Analoge Eingänge nutzbar. Dazu musst den den internen ADC aber konfigurieren und regelmäßig samplen lassen. Die Sache ist die: Wenn du Taster an Ports anschließt, dann sind das digitale Signale. Ergo brauchst du die Eingänge im digitalen Modus. Und gib uns mal einen Schaltplan. Wenn die Schalter den Pegel nicht halten können, läuft was schief. Und zwar nicht im PIC.
Ich kann euch leider bloß eine Schaltskizze in JPG.-Format geben. Ich habe sie zwar mit Eagle entworfen aber auf diesem PC habe ich Eagle leider nicht. Da ich etliche Bauteile aus der "Restekiste genommen habe, waren sie nicht in der Bibliothek und ich habe danach noch diese Sachen aufzeichnen müssen^^
S1 ist wahrscheinlich gemeint. Andere Frage: Warum nimmst Du ein 8051 als Bauteil (und hast den Namen geändert) und keinen aus der Microchip-Bibliothek?
Ich nehme an die 4 Schalter sollen wohl die "SWS004" sein - die hängen ja an V+, und wenn da ein Schalter OFFEN ist, hängt der entsprechende Pin in der Luft - genau das soll er aber nicht ;-)
Da die Schalter VCC schalten sind Pull-Down die bessere Wahl. Bei Pull-Up liegt am Port immer eine "1" an. Wenn schon Pull-Up dann müssen die Schalter GND schalten.
Sebastian H. schrieb: > S1 ist wahrscheinlich gemeint. > > Andere Frage: Warum nimmst Du ein 8051 als Bauteil (und hast den Namen > geändert) und keinen aus der Microchip-Bibliothek? Den Plan habe ich vor paar Monaten, als ich noch nicht wusste, dass man die Bauteilbibiliothek erweitern kann, mal skizzenhaft entworfen und jetzt wieder Zeit gefunden weiterzuarbeiten. Die Pull-Downs und das Konfigurieren von PORTA als digitaler Input waren letztendlich die Lösung. Danke für eure Hilfe :D
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.