Hallo allerseits, ich bin ein neuer Mitglied des Forums und bräuchte eure Hilfe. ich bin ein Neuling in Sache µController Programmierung und versuche gerade ein Programm zu schreiben, in dem ein Ein- und Ausgang eines PIC16f676 angesteurt werden. Ich benütze die MPLAB, den Hi-Tech Compiler und den MPLABSIM, um das Programm zum Laufen zu bringen. Die Übrseztung klappt ich kann aber den Zustand der Ein- und Ausgänge nicht beeinflüssen. Dies sehe daran, wenn ich den File Registers aufmache. mein Code lautet: ------------------------------------------------------------------------ -- #include <hitech.h> #include <htc.h> int i ; void main(void) { // Initialisierungen PORTA = 0; // PortA intialisieren PORTC = 0; // PortB intialisieren ANSEL = 0; // Umschaltung auf D I/O WPUA = 1; // Weak pull up PortA als Eingänge initialisieren CM0 = 1; // Comperatoreingang + (RA0) CM1 = 1; // Comparatoreingang - (RA1) CM2 = 1; // Comparatoraudgang, Comparatorpins = 111 -> Umschaltung auf D I/O */ (RA2) TRISA5 = 1; // PortAbit.0 als Eingang initialisieren TRISC0 = 0; // PortAbit.0 als Ausgang initialisieren RA0 = 1; // PortAbit.0 auf 1 setzen // Hauptschleife while(1) { if (!RA0) { while( i<100 ) // es wird bis 100 incrementirt { i++; // i Wert der Variablen wird um 1 erhöht } RC0 = 0; // nach Ablauf des Zählens wird der Ausgangsbit.0 vom PortA auf Lowpegel setzen i = 0; } else RC0 = 1; // Ausgangsbit.0 vom PortA auf Highpegel setzen } } ------------------------------------------------------------------------ - ich danke euch für eure Hilfe im Voraus und werde meinen Beitrag leisten, mein Wissen weiter zu geben.
> TRISA5 = 1; // PortAbit.0 als Eingang initialisieren
Wenn du RA0 möchtest ist die 5 da wohl falsch.
Wa'el Shamshoum wrote: > TRISA5 = 1; // PortAbit.0 als Eingang initialisieren > TRISC0 = 0; // PortAbit.0 als Ausgang initialisieren > RA0 = 1; // PortAbit.0 auf 1 setzen RA0 ist aber ein Eingang (per Default) > RC0 = 0; // nach Ablauf des Zählens wird der Ausgangsbit.0 vom PortA > auf Lowpegel setzen hier wird aber RC0 auf 0 gesetzt > else RC0 = 1; // Ausgangsbit.0 vom PortA auf Highpegel setzen und hier auf 1, aber es immer noch PortC > ich danke euch für eure Hilfe im Voraus und werde meinen Beitrag > leisten, mein Wissen weiter zu geben. Danke
>RA0 ist aber ein Eingang (per Default)
Und der Komparatoreingang. Er sollte
die vielen falschen Kommentare mal anpassen.
Sonst weiss man ja nicht mehr was verwendet
werden sollte oder nicht. Stimmt der Kommentar
oder der Code davor?
ich danke euch allen für die Antworten, ja, es gibt einiges zu ändern.....
Hallo alle zusammen, ich habe den Programmcode verbessert und möchte damit eine Diode über einen Taster ein- und ausschalten.Zum Emmulieren benutze ich den ICE 2000. Die Diode soll bei Loslaseen des Tasters leuchten, also bei neg. Flanke. So habe ich versucht eine neg. Flanke zu nachprogrammieren. Dies funktioniert nur im Animation-Modus. Sobald ich aber auf Run umschalte, leuchtet die Diode für ca. 1..2s und schaltet sich wieder aus, wenn die Schleife für das Einaschlaten durchlaufen wurde. Der Programmcode lautet: #include <hitech.h> #include <htc.h> #define Taster_1 RA5 // Taster ist der symbolische Name des Pin RA5-PORTA, Taster offen -> RA5 = 1 #define LED RC0 // LED ist der symbolische Name des Pin RC0-PORTC, LED = 1 -> LED leuchtet bit Merker1; bit Merker2; bit Merker3; int i; void main(void) { // Initialisierungen PORTA = 0b00000000; // PortA intialisieren PORTC = 0b00000000; // PortC intialisieren ANSEL = 0; // Pins auf Digital I/O umschalten CMCON = 0b00000111; // Pins Comperator-Modus auf Digital I/O umschalten INTCON = 0b00000000; WPUA = 0b00000000; TRISA5 = 1; // PortAbit5 als Eingang initialisieren TRISC0 = 0; // PortCbit0 als Ausgang initialisieren Merker1 = 0; // Abfrage der Pegelvergangenheit des Tasters zum Einschalten der Diode Merker2 = 0; // Abfrage des jetzigen Pegelzustands der Diode ( Merker2 = 0 -> Diode ist ausgeschaltet ) Merker3 = 0; // Abfrage der Pegelvergangenheit des Tasters zum Ausschaltenschalten der Diode i = 0; //Zählervariable // Hauptschleife while(1) { while((!Taster_1 || Merker1) && !Merker2) { while (i<10000) { i++; } if(Taster_1) { Merker1 = 1; } if(Taster_1 && Merker1) { LED = 1; Merker1 = 0; Merker2 = 1; i=0; } while (i<10000) { i++; } i=0; } /* while((!Taster_1 || Merker3) && Merker2) { while (i<10000) { i++; } if(Taster_1) { Merker3=1 ; } if (Taster_1 && Merker3) { LED = 0; Merker2 = 0; Merker3 = 0; i=0; } while (i<10000) { i++; } i=0; }*/ } } Nachdem ich die Schleife für das Ausschalten auskommentiert habe, stellte ich fest, dass die Diode sich trotzdem ausschaltet. Vieleicht kann jemand mir weiterhelfen. Ich danke euch im Voraus.....
Wa'el Shamshoum wrote:
1 | > while (i<10000) |
Kannst Du mal begründen, wie Du gerade diesen Wert 10000 berechnet hast? Pi*Daumen Programmierung sollte man sich garnicht erst angewöhen, das ist evil. Dein Programm scheint rudimentär irgendwie Entprellen zu sollen mit CPU-Zeitvernichtungsschleifen. Leider gibt es aber schon einwandfrei funktionierende, kurze und universelle Entprellroutinen, da hat man wenig Lust, sich immer wieder noch durch solche Anfängerschritte durchzuwuseln. Ich würde Dir daher raten, machs gleich richtig. Einem Baby soll man ja auch nicht erst ne Babysprache beibringen, sondern gleich richtig zu sprechen, sonst muß es doppelt lernen. Peter
Herr Dannegger, Danke für deine äußerst NETTE Antwort scheinbar bist du von Geburt auf der Super makellloser Programmierer, was ich absolut bezweifle, also es wäre angebrachter, wenn du sachlich bleibst und nicht philosophierst. Dies beantwortet aber nicht meine Frage. Das heißt abgesehen davon ob ich den Taster, aus deiner Sicht, richt entprelle oder nicht. Ich hoffe, dass die Sachlichkeit und andere Tugend in deinen Lexika noch vorhanden sind.....
Wa'el Shamshoum wrote: > Herr Dannegger, > Danke für deine äußerst NETTE Antwort scheinbar bist du von Geburt auf > der Super makellloser Programmierer, was ich absolut bezweifle, also es > wäre angebrachter, wenn du sachlich bleibst und nicht philosophierst. Ich nehme mir eben die Freiheit auch mal zu philosophieren auf die tausendste ähnlich gelagerte Frage. Solche Posts sieht man hier ja alle Tage. Ich vermute, Du hast keinen Ablaufplan gemacht, sondern einfach so angefangen das Programm runterzuschreiben (es sieht jedenfalls ganz danach aus). Versuch mal die Forenformatierung zu verwenden, damit man die Einrückungen sieht (oder als Anhang posten). Versuch mal nicht so phantasielose Veriablen (Merker 1..1000) zu verwenden, sondern der Bedeutung entsprechend. Versuch mal die Zeilen zu kommentieren, was sie machen (ist auch für Dich besser, um Deinen Code selber zu verstehen). > Dies beantwortet aber nicht meine Frage. Du beantwortest ja auch nicht meine Frage, wie Du die 10000 berechnet hast. Ne allgemeine Bemerkung: Hast Du den Watchdog ausgeschaltet? Der könnte Dir die LED wieder ausschalten. Peter
Hallo Peter, dank für deinen Rat, ich werde die übrigen Zeilen weiterkommenteiren und es lag tatsächlich an dem Watchdog. Die 10000 sind willkürlich gewählt worden, um den Taster zu entprellen. Ich werde aber später den Timer benützen und eine Entprellung von ca. 20ms erreichen ( Erfahrungswert anderer Programmierer). Gruß Wa'el
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.