Hallo. Ich sitze hier und versuche krampfhaft nem PIC16f877A leben einzuhauchen. Leider ist jeder meiner Lösungsansätze zum scheitern verurteilt und ich bald fertig mit den Nerven... Ich benutze MPLAB und den Compiler CC5X. Das ganze soll über ICSP mit dem Brenner 5 von Sprut gebrannt werden. Der Pic macht aber irgendwie gar nichts. Das Programm besteht nur aus ner Portansteuerung, die impulsweise angeschaltet wird. Ich kann aber an den Ausgängen nichts messen - auch wenn die Ausgänge dauerhaft angeschaltet werden. Das ganze habe ich schon mit so ziemlich allen ausgängen ausprobiert. Weiß jetzt nicht ob's an der Programmierung oder an der ICSP-Übertragung liegt. Hier mein UP zur Portansteuerung: void LED0() { // UP LED0 PORTD=0b.0000.1000; // RD3 high TRISD=0b.0000.0000; } Kann mir jemand helfen?? viele Grüße, Martin
Anmerkung: TRISD ist eigentlich auch high. Hab nur zwischendurch was ausprobiert - deshalb ist er hier auf low...
> TRISD ist eigentlich auch high.
Na, wenn du PORTD als Ausgang konfigurieren willst, damm muss in TRISD
'0' stehen. ('0' = Ausgang, '1' = Eingang). Vielleicht solltest du mal
etwas mehr Code posten und evtl. deinen Hardwareaufbau beschreiben.
Ich würde erst die Richtung bestimmen und dann die Werte ausgeben: void LED0() { // UP LED0 TRISD=0b.0000.0000; // all outputs PORTD=0b.1111.1111; // all high } franz
> Ich würde erst die Richtung bestimmen und dann die Werte ausgeben:
ist an sich egal, ich würde es allerdings eher so machen:
:
TRISD=0b.0000.0000; // all outputs
:
:
void LED0() { // UP LED0
PORTD=0b.1111.1111; // all high
}
Hier mal der gesamte Code: #pragma config=0b.00.0000.0000.0100 // ============================================= // ---- UNTERPROGRAMME ------------------------- // ============================================= void LEDOff() { // alle LEDS aus PORTD=0b.0000.0000; TRISD=0b.0011.1111; } void LED0() { // UP LED0 PORTD=0b.0011.1111; // RD3 high TRISD=0b.0000.0000; } void warten(unsigned long z){ // Unterprogramm warten // mit Parameterübergabe long i; // 16 Bit Indexvariable for(i=0; i<z; i++) nop(); // Warteschleife } void langewarten() { warten(65000); warten(65000); warten(65000); } void ganzlangewarten(){ langewarten(); langewarten(); langewarten(); langewarten(); langewarten(); langewarten(); langewarten(); } // ============================================= // ---- HAUPTPROGRAMM -------------------------- // ============================================= void main() { while(1){ LED0(); // Aufruf des Unterprogramms LED0 langewarten(); LEDOff(); langewarten(); LED0(); langewarten(); LEDOff(); langewarten(); }// end while } // end main Entschuldigt bitte meine unprofessionellen Warteschleifen - hab nur versucht das Programm so einfach wie möglich zu halten... Ich vermute, es könnte eventuell daran liegen, dass die Ports nicht als digitale deklariert sind. Beim 16F684 ging das mit ansel... - Kann mir jemand sagen wie das beim 16F877 gemacht wird? was die Hardware angeht: Der Pic bekommt drei digitale Eingangssignale (von ner SPS) an RD0, RD1 und RD2. RD3, RD4 und RD5 sind digitalte Ausgänge und gehen Ebenfalls auf die SPS. Das ganze läuft über Optokoppler und ist mit Pull-Down's festgelegt. Des weiteren soll ein LCD-Display angesteuert werden (RA, RB und RE). Das mit dem Display ist erstmal sekundär - will lediglich erstmal die Optokoppler beschalten... danke schon mal!!!!!!!!!!!!
Martin hahn wrote: > was die Hardware angeht: > Der Pic bekommt drei digitale Eingangssignale (von ner SPS) an RD0, RD1 > und RD2. > RD3, RD4 und RD5 sind digitalte Ausgänge und gehen Ebenfalls auf die > SPS. Und was soll dann das Hin- und Hergeschalte der Portrichtung? TRISD sollte nur einmal (beim Initialisieren/Programmstart) gesetzt werden: TRISD=0b.0000.0111 ; RD0..RD2=Eingang, RD3..RD7=Ausgang Wie sind den deine LED ngeschlossen (HI oder LOW-Aktiv???)
Setz mal dein Configuration Word richtig. Oder wolltest du LP Oscillator und Watchdog aktiv ?
die LED's sind High-Aktiv. Die Portrichtungen sollen eigentlich nicht umgeschaltet werden. Die sind nur alle angeschaltet, damit ich die Ports durchmessen kann. Aber leider hab ich an den Ausgängen gar kein Signal...
Hallo Holger. Wie muss ich das Configuration Word deiner Meinung nach setzen? Wo bekomme ich heraus wie welche Funktionen mit eingebunden werden?? viele Grüße, Martin
Hi
>>Wie muss ich das Configuration Word deiner Meinung nach setzen?
Das hängt von deiner Hardware ab. Um dir da helfen zu können, müssten
wir die Hardware näher kennen. Aber schalte mal den Watchdog aus.. und
setz die Quarzeinstellung auf HS.
mfg Schoasch
>Wo bekomme ich heraus wie welche Funktionen mit eingebunden werden?? Datenblatt zum PIC im Kapitel: "SPECIAL FEATURES OF THE CPU" Ziemlich weit hinten. Welche Einstellungen du brauchst weisst im Moment nur DU. Ich denke auch das du HS oder XT als Oscillator nehmen musst. Watchdog abschalten.
moin! das configuration word sieht bei mir jetz folgendermaßen aus: #pragma config=0b.00.0000.0000.1011 kann mir jemand sagen wie ich die ports als digitale deklarieren kann??
hab den Oszillator doch noch mal umgestellt... #pragma config=0b.00.0000.0000.1001 also jetzt auf xt geht aber trotzdem nix.
>kann mir jemand sagen wie ich die ports als digitale deklarieren kann??
PORTD ist immer digital. Für PORTA und PORTE geht das so:
ADCON1=0x06; //Alle Analogeingänge auf digital
Vieleicht hast du ja ein Problem mit dem Parallel Slave Port Modus
auf PORTD. Schau dir mal an was in TRISE (ja , TRISE !) steht.
Martin Hahn wrote: > kann mir jemand sagen wie ich die ports als digitale deklarieren kann?? Nicht jemand, sondern das PIC Datenblatt und/oder Compilerhandbuch! Ich glaube, du solltest mehr darin lesen. In der Regel wird man als faul angesehen, wenn man fragen stellt, deren Antwort eigentlich im Datenblatt oder in Handbüchern zu finden ist. Silltest du Verständnisschwierigkeiten mit dortigen Formulierungen haben, kannst Du natürlich um Hilfe bitten. Evtl. helfen dir Internetseiten weiter, auf denen PIC Beispielprogramme in 'C' zu finden sind, wie z.B. www.michrochipc.com (->verwendet aber nicht CC5X sondern HI-TECH compiler, glaube ich).
hallo. ja, das datenblatt hab ich auch schon durchgesucht - allerdings habe ich etwas schwierigkeiten das ganze in c umzusetzen. Compilerhandbuch habe ich nicht - werde ich aber anschaffen. Danke für die Info. @holger: Ist es schlimm wenn man die sache mit dem PSP-Mode außen vor lässt? Was das TRISE register angeht ist doch normalerweise alles LOW - oder nicht? weiß auch um ehrlich zu sein nicht richtig wie ich das umsetzen soll. hab hier das datenblatt vor mir liegen. könnte ich das vielleicht so zurücksetzen? TRISE=0b.0000.0000; danke für eure hilfe!
>Was das TRISE register angeht ist doch normalerweise alles LOW - oder >nicht? Nicht alles, aber die wichtigen Bits. Auch Datenblätter können manchmal lügen. >könnte ich das vielleicht so zurücksetzen? >TRISE=0b.0000.0000; Ja (,obwohl ich diese komische binärschreibweise nicht kenne). Ich denke aber da stimmt was mit dem Oscillator nicht. Der schwingt einfach nicht. Schaltung falsch oder Config Word nicht richtig gebrannt. Vieleicht übernimmt Spruts Brenner das Config Word nicht aus der HEX-Datei und du musst es dort richtig einstellen, aber keine Ahnung ich hab sein Proggi noch nie benutzt. Oder du musst das Config Word in MPlab auch nochmal richtig einstellen. Ich meine damit hatte ich früher mal Ärger (bis ich Mplab völlig gelöscht habe :) Zu Schaltung oder Oscillatorwert lässt du uns ja auch völlig im dunkeln.
Hi Setzt mal im Programm von Sprut die ganzen Fuses so wie du sie haben willst und nimm nicht die aus deinem Hex-File. dazu musst du nur das Häcken bei" Use config-Word from Hex-file" oder wie das schnel heisst, abhacken. mfg SChoasch
hallo. erstmal vielen dank für eure hilfe! @holger: sorry. also was schaltung und oszillator angeht - folgendes: habe ein externen 4MHz Oszillator an OSC1 und OSC2 bzw. über zwei 22pF kondensatoren an masse (also wie es im datenblatt und bei sprut steht) hab das ganze auch eben nochmal mit dem Oszi kontrolliert - habe ne saubere 4MHz sinusschwingung. @schoasch & holger: habe mal mein configuration word komplett aus dem programm entfernt und die ganzen einstellungen was oszillator, watchdog und power-up-timer angeht über die brennereinstellung vorgenommen - geht auch net. das ganze auch mit verschiedenen oszillatoreinstellungen (mit hs, xp). hab mir auch mal eine hex-file aus nem basic-programm für den 16f877 geben lassen und gebrannt - ging auch net (also für die gleichen funktionen - ausgänge auf high schalten..) weiß nicht mehr weiter.
Der Reset ist überhaupt nicht beschaltet. der hängt nur an der icsp-schnittstelle. gruß, martin
Und wie ist der Pegel am Resetpin ? Ich glaub da fehlt ein Pullup !
uuuuups! klar. setz mich gleich mal dran... vielen dank erstmal!!!
Hallo. So. Hab das jetzt zum laufen bekommen. Es lag wie holger bereits vermutet hat am Reset-Pin (MCLR). Der MCLR hing war nur an der ICSP angeschlossen und hing somit in der luft. Hab nen 20k pull-up drangelötet - und schon läuft die kiste. ich danke euch vielmals für eure hilfe (vor allem holger!) - hätte das sonst warscheinlich nicht oder erst viel später hinbekommen. Danke! viele grüße, martin
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.