Guten Abend allerseits Ich habe einen AT89C55WD. ich habe ein kleines Assemblerprogramm draufgeflasht, das im Grunde nichts anderes macht als die Bitfolge 00000001b an Port 0 auszugeben, die Bitfolge dann mit RR schiebt und wieder an P0 ausgibt. Dazwischen habe ich eine Warteschleife (mit DJNZ). Die soll genau eine Sekunde warten. Das tut sie auch ungefähr. Doch das Programm läuft nicht richtg. Die Hex-Anzeigen, die ich an P0 angeschlossen habe, zeigen abwechslungsweise 55 und AA. Das kann nicht stimmen oder? Ein Schrittmotor, der über einen ULN 2803 A angeschlossen wird, dreht sich nicht. Was läuft da verkehrt? Wie muss ich die Pins beschalten? Braucht es etwa eine spezielle Resetschaltung? Oder kanns am Quarz liegen (9.6 MHz) ? Allgemein braucht der MC lange, bis er mal "aufgestartet" ist. Wenn ich Spannung anlege, zieht die Schaltung ca. 11 mA, aber passieren tut nicht viel. Meine Frage: kann dieser Programmfehler an einem ungeeigneten assembler liegen? an falscher beschaltung der pins? an fehlenden initialisierungen im programm? wer kann mir weiterhelfen? vielen dank schon im voraus!!! grüsse tobias
Hallo Tobias, nen kleiner Schaltplan incl. Sourcecode wäre sehr hilfreich !!! Wie sieht denn deine RESET Beschaltung aus ? EA=1 ? usw, usw .... Gruß Joe
hallo joe, schaltplan habe ich leider grad nicht zur hand. der source sieht allerdings so aus: ************************** MOV A,b'00000001 MOV R1,00FF MOV R2,00FF start: MOV P0,A DJNZ R1,start DJNZ R2,start MOV R1,00FF MOV R2,00FF LJMP start ******************************** als assembler verwende ich den 8051-assembler A51, der auf der Atmel-seite zum downloaden angeboten wird. hoffe du kannst mir weiterhelfen, grüsse
also das hier etwas mir rr an der Ausgabe geändert wird kann ich nicht erkennen. P0 benötigt externe Pullups (hoffe die haste dran). Der Assembler hat ja ne eigenartige Syntax, naja man kann sich daran gewöhnen. Joe
uhps, ja stimmt. rr hatte ich vergessen. sieht dann so aus: ************************** MOV A,b'00000001 MOV R1,00FF MOV R2,00FF start: MOV P0,A DJNZ R1,start DJNZ R2,start MOV R1,00FF MOV R2,00FF RR A LJMP start ******************************** also, ich muss extern pullups anschliessen? an jeden einzelnen portpin? okee, dann liegt da der fehler... wenn da keine pullups dran sind, kann dann der oben beschriebene fehler auftreten? und: der assembler, das ist doch richtig wenn ich einen 8051 assembler einsetze oder? wenn der chip 89C55 heisst? danke jedenfalls für den tipp mit den pullups. probier ich morgen aus. werd mich dann wieder melden ;) grüsse & schönen abend
ja, die Pullups sind ein muss, der Assembler sieht ok aus, kenne diesen aber nicht. Der Fehler wäre durch fehlende Pullups erklärbar. Üblicherweise beginnt ein Assembler Programm mit einer org Anweisung. Beispiel: org 0000H Diese Anweisung gibt an das dass Programm nach dem RESET an Speicherstelle 0000H beginnt. Naja, probier es mal und frag wieder. Joe
Wird mit MOV P0,A nicht Port0 in den Akku geladen...also im Prinzip ein Input? Ist schon 10 Jahre her dass ich mit 80551 zu tun hatte.
Du lädst immer nur den Inhalt direkter Adressen in die Register. mov a, 1 lädt A also mit dem Inhalt von R1 von Bank 0. Um Werte zu laden ist die Syntax folgende: mov a, #1 mov r1, #0FFh mov r2, #0FFh usw. Peter
guten abend miteinander, danke für eure hilfe. ich habs an einem anderen port versucht dort gehts :) port 0 kann man (mit pullups versehen) als eingang nutzen. vielen dank auch!!! noch eine andere frage: kann man die ersten vier pins des port 1 (z.b.) als ausgang, und die nächsten vier pins als eingangn nutzen? darf man das?
Hallo Tobias, es gibt beim 8051 keine unterscheidung zwischen Ein/Ausgang, alle I/O's beim 8051 sind quasi bidirectional. Die Antwort lautet ja. Joe
ach so. das freut mich :) vielen dank für die auskunft. ich will meinen microcontroller nämlich noch mit dem DS1245 Ram ausrüsten. das hat 17 (komische zahl) adressleitungen und 8 datenleitungen. d.h., ich muss einen port noch "so halb" anbrauchen", um das ram anzusteuern. noch eine weitere frage, nach deren antwort ich schon lange suche: wenn ich später den mc noch mit einer dallas DS12887 RTC ausrüsten will, wie steuer ich das ding an? die adress-/datenleitungen sind dort zusammengefasst. weiss jemand dazu auch noch wies geht?? entschuldigt meine blöden fragen (also ja, blöde fragen gibts ja keine,, nur blöde antworten ;) aber euch müssen meine fragen warscheinlich blöd erscheinen, wenn ihr mit derart blutigen anfängern wie mir zu tun habt... ;) grüsse & schönen abend!
Hallo Tobias, aller Anfang ist schwer, bei deinem Vorhaben hast du aus meiner Sicht auch den falschen Baustein gewählt. Der AT89C55 stellt an P0 einen AD Wandler zur Verfügung. Der DS1245 wird wie ein klassisches RAM angeschlossen. Hier würde sich ebenso eine typische 8x51 Busarchitektur anbieten. Ich würde dir daher empfehlen mit einem AT89S8252 zu verwenden, es sei denn der ADC soll auch noch eine spezielle Aufgabe erfüllen. Du beraubst dich der Möglichkeit movx Befehle für dein RAM zu verwenden. Du kannst auch bei deiner Wahl bleiben, musst dann aber in kauf nehmen das dass einen bischen mehr Programmieraufwand wird. Joe
hier ist die Beschreibung für die RTC, würde in das BUS Konzept passen. Es wird im Prinzip ähnlich wie das RAM gehandhabt nur das sich Adressen/Daten den BUS teilen. Ein Beispielcode findest du mit Freund Google. Joe
@joe: im datenblatt hab ich zwar nichts von einem ad wandler gelesen, aber vorerst hab ich dafür sowiso keine verwendung. ich möchte nur ein bisschen rumexperimentieren, drum hab ich auf meinem bastelprint alle komponenten angeschlossen, die mich interessieren. dazu gehört eben auch ds12887. damit kann man vielleicht was tolles anstellen.... ich will den baustein sowiso nicht als ram verwenden, sondern mich interessiert nur die uhr. für was sind denn deine movx befehle genau gut? entschuldige die blöde frage... aber ich kenn den befehlssatz halt noch nicht so gut. ich habe ja schliesslich erst vor ein paar tagen angefangen, mich mit assembler zu beschäftigen... also im datenblatt des at89c55 steht was über den anschluss von externem ram. ich kann ich jetzt mein ds12887 anschliessen oder nicht? irgendwie muss es ja möglich sein, im prinzip sind die anschlüsse des ram ja nur ein-/ausgänge, auf die man daten legen kann und die man dann abfragen kann. oder?
oh, sorry hast recht. Naja ist noch zu früh ;-) ds1245 ist aber nen NV-RAM ;-) movx Befehle sind u.a. transferbefehle für die Verwendung von ext. RAM. Diese steuern automatisch die RD/WR signale für dich, macht die ganze Sache recht einfach. http://www.8052.com/links.phtml hier findest du die 8051 bible, les dich ein und dann frage noch mal. Joe
das ganze in deutsch, vielleicht ist dir das lieber. http://www.batronix.com/elektronik/know-how/mikrocontroller-technik.shtml Joe
hallo joe, danke für den link zur 8051 bible. was meinst du damit: >>DS1245 ist aber ein NV-RAM? grüsse tobias
na ja, ich dachte du möchtest nen ds1245 verwenden. ... ich will meinen microcontroller nämlich noch mit dem DS1245 Ram ausrüsten... das ist ein NV RAM, will meinen nicht flüchtiger Speicher, das Ding hat ne integrierte Backup Batterie und behält die Daten auch nach abschalten der Versorgungsspannung. Wie siehts aus, hast du dich eingelesen ? kommste klar ? Joe
hallo joe, ja du hast richtig gelesen, den ds 1245 würd ich gern verwenden. das ist nämlich das einzige ram, das ich auf lager hab :) warum sollte ich kein nv ram verwenden? ich kann ja die daten, die ich nicht mehr benötige, überschreiben. und: zu der 8051 bible: ja, hab mich einlesen können :) klar komme ich auch einigermassen. nur die interrupts hab ich noch net verstanden, aber wird schon. gruss
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.