hi leute wie kann ich machen das bei meinem prog der timer abgefragt wird? ADDWF TMR0,W ; +1 ergibt 0x00 in w, wenn TMR0=0xFF BTFSS STATUS,Z ; Sprung, wenn Z-Flag gesetzt GOTO TIMER GOTO NOCHMAL also das hab ich bisher geschrieben aber der springt immer auf timer und nie auf nochmal kann ich auch anders dem sagen das er immer wenn programm zuende ist das er wieder bei nochmal startet bzw dort hinspringt? danke im vorraus mfg damian
also wenns falsch ist dann sagt es bitte den mir wurde gesagt ich soll das schreiben und ich habs reingeschrieben weil ich nich weiss wie ichs machen soll bitte helft und lacht nicht mir wurde unter roboternetz das so gesagt mit dem add.. usw
"mir wurde gesagt ich soll das schreiben" Ich halte es fast für unmöglich, daß man so Programmieren lernen kann. Wenn Du nicht weißt, warum Du was machst, dann laß es lieber. Ich rate Dir, erstmal gründlich in der Befehlsbeschreibung nachzulesen, und dann die einzelenen Befehle im Simulator auszuprobieren. Der PIC ist allerdings sehr kryptisch und nicht gerade gut für den Einsteiger geeignet. Viele Dinge haben keine entsprechenden Befehle und man muß sie "von hinten durch die Brust ins Auge" machen. Daher brauchts wirklich ne Weile, andere PIC-Programme zu verstehen, man muß manchmal mächtig um die Ecke denken. Und bei PIC-Fragen immer zu allererst den genauen Typ angeben, da es softwaretechnisch erhebliche Unterschiede gibt. Mit dem Codeschnipsel oben kann jedenfalls keiner was anfangen. Z.B. wohin gehen denn die GOTOs und was steht zu Anfang in W ? Peter
list p=16F84A ; list directive to define processor #include <p16F84A.inc> ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC ;***** VARIABLE DEFINITIONS ***** w_temp Equ 0x0C ; variable used for context saving status_temp Equ 0x0D ; variable used for context saving w_copy Equ 0x20 ; Backup für Akkuregister s_copy Equ 0x21 ; Backup für Statusregister T0SC Equ OPTION_REG ORG 0x000 ; processor reset vector goto main ; go to beginning of program ; Interrupt routine falls diese mal benötigt wird ORG 0x004 ; interrupt vector location movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents retfie ; return from interrupt main ;PortA wird hier initialisiert BCF STATUS, RP0 ; RP0=0 CLRF PORTA ; Initialisierung von PortA ; durch löschen des Data latches BSF STATUS, RP0 ; Markiere Bank 1 MOVLW 0x0F ; nutzen für den DatenVerzeichniss MOVWF TRISA&0x7f ; SET RA<3:0> als Input ; SET RA4 als Output ; PortB wird hier initialisiert BCF STATUS, RP0 ; RP0=0 CLRF PORTB ; Initialisierung von PortA ; durch löschen des Data latches BSF STATUS, RP0 ; Markiere Bank 1 MOVLW 0xCF ; nutzen für den DatenVerzeichniss MOVWF TRISB&0x7f ; SET RA<3:0> als Input ; SET RB<5:4> als Output ; SET RB<7:6> als Output movwf w_copy ; w retten swapf STATUS, w ; STATUS retten movwf s_copy ; NOCHMAL BCF STATUS, RP0 ; auf Bank 0 wechseln MOVLW 0x7D ; 0x83 = 131 ; 0x7D = 125 MOVWF TMR0 ; 131 oder 125 müsste hier drin stehen MOVLW 1 TIMER BSF STATUS, RP0 ; auf Bank 1 wechseln ;BCF OPTION_REG&0x7f, T0SE ; bin mir nich sicher ob ichs brauche beim Vorteiler ;Flanke BSF OPTION_REG&0x7f, T0SE ; hier wird für RA4 die Low Flanke gewählt MOVF T0SE, F ; hier wird es unter der Speicherzelle gesichert ;movf TMR0, F ; das ist das Timer-Register ;Vorverteiler Aktivieren BCF OPTION_REG&0x7f, PSA ; hier mit wird der Vorverteiler auf 0 gesetzt und aktiviert BCF OPTION_REG&0x7f, PS2 ; damit man den vorverteiler auf 16/1 einstellt BSF OPTION_REG&0x7f, PS1 ; hier wird PS1 auf 1 gesetzt BSF OPTION_REG&0x7f, PS0 ; hier wird PS0 auf 1 gesetzt ;Timer ;BSF OPTION_REG&0x7f, T0CS ; T0SC wird auf 1 gesetzt damit der Vorverteiler mit benutzt werden kann BCF OPTION_REG&0x7f, T0CS ; hier wird in der Speicherzelle T0SC die 0 gesetzt MOVF T0CS, F ; nun wird es unter der Speicherzelle gesichert NOP NOP ADDWF TMR0,W ; +1 ergibt 0x00 in w, wenn TMR0=0xFF BTFSS STATUS,Z ; Sprung, wenn Z-Flag gesetzt GOTO TIMER GOTO NOCHMAL END also das ist mein code der soll halt beim überlauf immer bei 125 anfangen damit ich die 2ms schaffe die ich benötige mfg d.stolarek
und da ich schon sehr versucht habe und das nie funktioniert hat habe ich in roboternetz nachgefragt und da sagte mir einer das es diese möglichkeit gibt zum abfragen die ich dann testen wollte aber dies ging bei mir auch nich und deswegen frage ich hier mal ob hier einer mehr sagen kann dazu danke schon im vorraus
Also... räusper 1. Sourcecode dieser länge bitte immer in den Anhang! 2. Die Sprungziele sind wohl nicht ganz korrekt deklariert, fehlt da nicht überall ein ":"?
Sers, also ich kenn mich zwar mit PIC nich aus, aber ich denke die : solten schon sein. Wenn man sonst ein ; vergißt hat man ja massig Sprungziele. Das ist bestimmt nich im Sinne des Erfinders. list p=16F84A Das sind bestimmt schon zwei. Sollte das nich so sein? .list p=16F84A
also der simulator macht keine probs und in sprut steht das nich mit dem ; und ich hab bei anderen progs von ihm nur list gelesen und der simulator sagt da ist dann ein fehler wenn ich vor list ein . mache
es geht bei mir alles nur die abfrage nicht also wenn mir einer sagen wie ich das richtig machen kann den ich bin ratlos
Was der Befehl: ADDWF TMR0,W macht, weißt Du ? Dann sollte eigentlich klar sein, daß der Kommentar: ; +1 ergibt 0x00 in w, wenn TMR0=0xFF nur dann stimmt, wenn man vorher W = 1 gesetzt hätte. Ich kenne jetzt den 16F84A nicht, aber alle MCs, die ich einsetze (8051, AVR, ARM) haben immer ein Timer-Overflow-Bit. Und dann ist es besser das Overflow-Bit zu testen, denn leicht kann es passieren, daß ein Interrupt dazwischen haut und man dadurch den Zustand TMR0=0xFF verpaßt. In Deiner Schleife wird auch ständig der Vorteiler rückgesetzt, kann es sein, daß dadurch der Timer nie weiterzählt ? Bitte bitte schau doch mal ins Datenblatt, was Du da verzapft hast !!! Der Simulator zeigt Dir doch TMR0, W, STATUS an oder nicht ? Peter
klar nur der eine meinte das geht so und ich weiss was addwf bedeutet das ist zum addieren und ich hab halt auch bemerkt das bei status nie 0 ist nur beim programm start und das mit w auf 1 setzten ich weiss aber das wird kurz bevor das bei addwf ankommt verändert und ausserdem habe ich w oben da wo nochmal ist geändert auf 1
und der timer zählt weiter nur halt langsamer da er die zeit von 2ms überbrücken muss da ist ein 16 vorteiler drin und der zählt rauf DAS WAS NICH GEHT IST DIE SCHLEIFE REST FUNKTIONIERT TADELLOS
Ob W irgendwo hochdroben mal gesetzt wurde, ist egal. Wichtig ist nur der Wert direkt vor dem ADDWF. Simulier doch einfach. Wird TMR0 überhaupt mal FF ? Und was steht dann in W drin ? Was wird damit bezweckt, den Vorteiler ständig rückzusetzen ? Peter
ja tmr0 wird irgendwann 0xff und in w steht dann ein zu hoher wert 146 das weiss ich schon aber wie mach ich das richtig das der wirklich dann wieder bei 125 anfängt?
"und in w steht dann ein zu hoher wert 146" Und warum kannst Du das nicht 1000 Postings früher sagen, sondern immer nur "DAS WAS NICH GEHT IST DIE SCHLEIFE" ? Fehler muß man suchen, die kommen nicht von selber angelaufen. Mit den falschen Werten kann der Code ja nicht richtig arbeiten. Du must Dir zuerst einen Programmablaufplan machen, was wann wie gesetzt und getestet werden soll. Erst danach kann man sich hinsetzen und den Plan in Code umsetzen. Nur so wird ein Schuh draus. Insbesondere um Schleifen richtig zu erkennen ist ein PAP unerläßlich. Ich würde auch erstmal den ganzen Vorteilerschrunz aus der Schleife hauen. Sowas hat dort nichts zu suchen, das macht man nur einmal am Programmstart. Peter
@OldBug, @Sebastian Zur Info: Sprungziele (Label) benötigen kein ":", sie müssen nur in Spalte 1 beginnen. Befehle (Mnemonics) in Spalte 2 oder später. Operanten müssen von Befehlen mit mind. 1 Leerzeichen getrennt sein. (Jedenfalls bei MPASM) Andreas
@Peter Dannegger also wusste nich das die werte für dich jetzt so wichtig sind und pap hab ich gemacht gehabt und ich brauche diese schleife mit der abfrage um immer beim timer wert 125 zu starten den wenn er es einmal macht den überlauf mein ich dann startet er bei dem wert 0 und nicht 125 also hilft mir das was du sagst nicht weiter den der wert ändert sich nur in w beim addwf und das von 1 auf einen jetzt sogar höheren wert 212 @all also wenn einer ahnung hat von assembler und ahnung wie eine schleife aussehen muss die abfragt ob 0xff beim timer0 sind dann bitte helfen ich bin so ziemlich ratlos ich wäre für jede hilfe dankbar
Wie gesagt, ohne sich damit zu beschäftigen, lernst Du es nie. Was ist denn daran so schlimm, die Befehle im Simulator auszuprobieren ? Es ist völlig normal, daß Register im Programmverlauf benutzt und verändert werden. Wenn man also einen bestimmten Wert im Register benötigt, lädt man ihn eben hinein. Aber nicht irgendwo anders, sondern genau an der Stelle, wo er benötigt wird. So, hier jetzt alles vorgekaut: Lade 125: MOVLW 125 MOVWF TMR0 Warte auf FF: WAIT_FF MOVLW 1 ADDWF TMR0,W BTFSS STATUS,Z GOTO WAIT_FF Peter
genau sowas hab ich doch auch gemacht und noch dazu darauf geachtet das es mit dem vorteiler geht das blöde daran ist nur das der trotzdem den wert jedesmal in w ändert bei addwf der sprang immer sofort auf einen anderen wert
kleine Randbemerkung : So, wie du hier schreibst.....ohne Punkt und Komma.....wirst du wohl auch deinen Code schreiben ??!! Vielleicht überprüfst du alles nochmal dahingehend......
also mein code läuft wie ich glaub ich zum hundersten mal sage hab alles mit simulator überprüft
Hallo, hab das hier grad nur zufällig gefunden und vieleicht brauchst du ja auch keine Hilfe mehr, aber ich sag trotzdem, was mir aufgefallen. Versuch doch mal das: anstelle btfss btfsc. Bei dir springt er nämlich immer auf TIMER, weil btfss sagt, er soll den nächsten Befehl überspringen, wenn das Bit gesetzt ist. Das Zero wird aber nur gesetzt, wenn die Addition eine Null ergibt. Jetzt müsste er dann auf NOCHMAL springen, weil der Befehl jetzt lautet, er soll den nächsten Befehl überspringen, wenn das Bit NICHT gesetzt ist, was ja den Großteil der Addition so ist. Probier´s einfach mal. Viel Erfolg! Gruß Jen PS: Kannst ja dann hier noch posten, ob´s richtig war!!
danke für die antwort hab das auchprobiert aber jetzt springt der immer auf nochmal und nie mehr auf den timer mit btfsc kommt der nie auf 255 also nie zum überlauf aber danke trotzdem hab schon gedacht das keiner mir hier mehr helfen will liebe grüße damian stolarek
Hallo, ich hab auch grad meine Probleme mit Assembler und darum helf ich gern ;) Vielleicht solltest du dann vor dem add-Befehl eine Abfrage machen, ob TMR0 0xFF ist und ihn dann zu der jeweiligen Marke schicken oder zum add-Befehl. Was anderes würd mir nicht mehr einfallen. Gruß Jen
Hi, du bist echt lieb, danke das du mir hilfst und mir mit rat und tat zur seite stehst. danke vielmals!!! und eine abfrage vor dem zumachen, naja da ist ja das problem, wenn ich wüsste wie die richtig gingen, würde ich nich hier reinposten. den die abfragen bekomm ich nicht hin. danke trotzdem. gruß damian stolarek
Hallo, mir ist grad aufgefallen, dass ich so was ähnliches in meinem jetztigen Programm habe rotwerd . Ist scheinbar schon zu groß, dass ich noch alles 100%ig überblicke. Also, noch ein Versuch: Als erstes: Schmeiß den add-Befehl raus. Und dann versuchst du´s hiermit: movfw TMR0 ; Inhalt des Registers in Akku ; kopieren sublw 0xFF ; von 0xFF wird der Wert im Akku ; abgezogen btfss STATUS,Z ; überprüfe das Zero-Flag, wenn ; gesetzt, überspringe nächsten ; Befehl goto TIMER goto NOCHMAL Gruß Jen
"aber danke trotzdem hab schon gedacht das keiner mir hier mehr helfen will" Stimmt doch garnicht. Aber Du liest ja die Antworten nicht !!! Also nochmal, bei Dir fehlt das "MOVLW 1" ! Ohne das addierst Du TMR0 zu einem rein zufälligen Wert der von irgendwann noch in W steht: WAIT_FF MOVLW 1 ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ADDWF TMR0,W BTFSS STATUS,Z GOTO WAIT_FF Peter
ok, ich schreib das woanders rein. bei mir habs ich gleich am anfang reingeschrieben, nachdem ich den timer auf 125 gesetzt hab. nun setze ichs vor den addwf befehl. gruß damian
hi Peter Dannegger das geht trotzdem nicht danke trotzdem für deine hilfe bin für alles dankbar gruß damian
hi jen, hab das nun auch ausprobiert, das geht auch nicht. aber der einfall war nich schlecht. gruß damian
Muss man vielleicht das Zählregister erst in ein Rechenregister kopieren? Kann die Recheneinheit ADDWF TMR0,W? Oder würde ADDWF,REGISTER,W; REGISTER->TMR0 Erfolg versprechen? Bloß geraten-basiert jetzt nicht auf Ahnung mit PIC Controllern.
Hallo, das ist schade...und ganz schön kniffelig. Ich seh gerade, dass du einige viele ´;´ gesetzt hast. Kann es sein, dass du aus Versehen einen Befehl auskommentiert hast? Am besten noch mal drüber schaun. Gruß Jen
hi ihr lieben @jen, habs überprüft und es sind keine wichtigen dinge, die ich brauche, auskommentiert. @chrissy, das habe ich als aller erstes versucht, ich habs in das register kopiert gehabt und es lief nicht, der sprang wie bisher immer falsch. Danke trotzdem für eure hilfe. ihr seid so lieb zu mir :). danke dafür und für die antworten die noch kommen. komisch das man bei einem praktikum solche kniffligen aufgaben bekommt. naja mit eurer hilfe werde ich es schon schaffe. ich freu mich schon auf weiter antworten liebe grüße damian
Hey, was bedeutet eigentlich das &0x7f bei dem Vorteiler hinter dem OPTION_REG? Gruß Jen
hi jen, da ich den pic 16f84a benutze, musste ich dies hinzufügen, damit er nur 8bit macht. der hat beim timer dann sofort probleme gemacht ohne dieses &0x7f. der simulator spuckte dann sofort fehler aus. der sagte dann immer das der bereich zu groß ist. gruß damian
Hey, da du Praktikum machst (Lehre, Schule oder FH, nur aus Neugier, mach nämlich auch grad Praxissemester;P), hast du da nicht einen Betreuer oder jemanden, der das bei euch lehrt? Druck den Code doch einfach mal aus und zeig im das. Eigentlich sind Betreuer doch dafür da, oder? Grüßchen
Hi Jen, das blöde ist ja das ich hier keinen richtigen betreuer habe. ich soll alle aufgaben machen die ich bekomme und die leute sagten ich soll mich in alles selber einarbeiten. die hier haben ziemlich alle streß und da will ich nich auch noch stören. aber ich wills auch "alleine" hinbekommen, mit eurer hilfe. es sieht einfach besser aus. gruß damian
Hallo Damian, zunächst mal, ich bin auf dem 8051 zu Hause, den PIC programmiere ich erst seit wenigen Wochen, und das auch nur sehr sporadisch. Wenn ich mir hier aber die Antworten im Forum durchlese, dann frage ich mich, ob es hier keine PIC-Freaks gibt?!? Für die sollte Dein Problem wirklich ein Klaks sein. So, nun meine Anmerkungen zu Deinem Programm: 1) TMR0 steht in Bank 0! Du hast aber vorher auf Bank eins umgeschaltet, aber nicht wieder zurück! 2) Was macht MOVF T0CS, F ; nun wird es unter der Speicherzelle gesichert ? T0CS ist ein Bit, mit dem MOVF Befehl werden aber ganze Bytes bewegt. Ich könnte mir auch nicht vorstellen, was er an dieser Stelle soll. Also versuch es einfach mal ohne diesen Befehl! 3) OPTION_REG steht wieder in Bank 1. (Aber hier hast Du ja vorher auf Bank 1 gewechselt) 4) Ich würde wirklich das Timer Overflow-Flag abfragen, wie es hier schon vorgeschlagen wurde: (P.S.: INTCON steht auch in Bank0) BCF STATUS, RP0 ; auf Bank 0 wechseln BTFSS INTCON,TMR0IF GOTO TIMER GOTO NOCHMAL 5) Es reicht, wenn Du den Timer einmal am Anfang des Programms initialisierst (die ganzen Zugriffe auf OPTION_REG). Das mußt Du nicht bei jedem Schleifendurchlauf wiederholen. 6) Für Deine Zukunft als Programmierer: Du solltest versuchen, Dich mehr in den µC reinzuversetzen und nachzuvollziehen, was er bei den einzelnen Befehlen macht, statt munter drauf los diverse Ideen bunt zu mischen und nach dem Try and error Prinzip Deine Programme zu entwickeln. Wie oben schon geschrieben, ich bin auch recht neu auf dem PIC. Von daher kann ich Dir nicht versprechen, daß das Programm mit den oben erwähnten Änderungen läuft. Es könnte zum Beispiel noch sein, das man das Overflowflag noch aktivieren muß. Lies mal dazu im Datenblatt das Kapitel über den Timer. Viel Erfolg, Markus_8051
hi markus, ich werde alles ausprobieren. es wird nur etwas dauern, denn ich muss oft andere dinge machen die für die firma wichtiger sind. gruß damian
Hey, bei www.sprut.de gibt es eine sehr gute Übersicht über die Assembler-Befehle. So kannst du dein Programm noch mal durchgehen und schaun, ob es das macht, was es machen soll. MfG Jen
hi jen, nach dem, was bei sprut steht, müsste es eigentlich laufen. aber ich mache das noch, was markus schrieb. naja ich versuche es. also, danke nochmals und ich halte euch auf dem laufenden. liebe grüße an alle damian
hi leute, hier der neuste stand. es geht immernoch nicht was ich ein bisschen schade finde da ihr euch mühe gegeben habt mir zu helfen. also für weitere möglichkeiten bin ich bereit. ich hab mir die befehle durchgelesen und alles was ihr geschrieben habt sollte funktionieren, was es leider nich tut. hab in die bank0 zurück gewechselt brachte nichts, die subtraktion brachte auch nichts und nur eine sache ging an der überprüfung. das was ging der hat angefangen 4mal richtig gearbeitet und als der eine wert niedriger war, sprang er wieder zum falschen. also ist da noch was falsch. bitte helft mir. euer D.Stolarek
Hi Ihr lieben, ich habe die abfrage hinbekommen mit der Version von Jen. Danke nun habe ich eine andere Frage. Wie kann ich an einem Pin ohne Interrupt einen Flankenwechsel abfragen? Muss nämlich nachschaun, wenn da Signale sind, ob da ein Bit 2ms braucht bis zum Nächsten wechsel oder 1ms oder 0,5ms. Wäre euch TOTAL dankbar. Gruß Damian
Hallo Damian, also beim 8051 gibt es da die Möglichkeit, einen Pin als Gate für einen der Timer zu benutzen. So kann man mit dem Timer exakt die Pulsbreite eines ankommenden Signals messen. So etwas muß beim PIC sicher auch gehen. Gruß, Markus_8051
Hi Markus_8051, ja so einen Pin gibts bei mir auch, aber wie nutze ich den das, das der bei mir von 1nem byte die bits überprüft und da die zeit misst? Gruß D.Stolarek
Hallo Damian, BITTE BEACHTE AUCH MEIN POSTING IM PIC-FORUM VOM 04.11.2004 http://www.fernando-heitor.de/picforum/viewtopic.php?p=3155#3155 GRUSS INGO
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.