hi bin uli und neu wenig ahnung. baue ein discolicht.(lite06.asm). prog. so allein vor mich hin.(nur assembler mit 8515/stk200) probiere nach try and error bis es geht. aber ob es "optimal" oder "effizient" ist? will meinen programmierstil verbessern. meckert mal rum. gruß uli
sieht doch sehr ordentlich aus - wenn du das alles so selbst gemacht hast als Anfänger: Hut ab. Ob es so funktioniert, habe ich mir im einzelnen natürlich nicht angesehen. Schlecht ist die ISR beat. Vom Interruptvektor rufst du die mit "call" auf, beendest die dort mit ret, der folgende Befehl in der Sprungtabelle ist ein reti, insofern funktioniert das erstmal. Ist trotzdem nicht korrekt, kommt ein weiterer Vektor hinzu, ist es vorbei. Also die ISR mit rjmp anspringen, das reti kommt direkt ans Ende der ISR. Schneller ist es damit auch. Weiterer Fehler: da du in der ISR flags veränderst (inc...), musst du das sreg sichern und vor Verlassen wieder herstellen, da sich sonst im Hauptprogramm undefinierbare Zustände ergeben. Als letztes noch die vielen .equ/ldi für die LEDs. Geht so, besser wäre es meiner Meinung nach, die als Konstanten im Flash abzulen und per lpm zu laden. Ermöglicht die Programmierung der Ausgaberoutine in einer Schleife. Reine Geschmackssache: die einzelnen inits würde ich nicht als einzelne UPs aufrufen, lohnt sich für 2 oder 3zeiler nicht. Ist zwar ein zusätzliches Strukturelement, aber na ja. Evtl. ein call init, wo dann alle Initialisierungen stehen, um das Hauptprogramm klein zu halten. Ich lasse eigentlich immer alle Initialisierungen ohne calls am Anfang des Hauptprogramms. reset: ;alle Initialisierungen main:
ja,danke,crazy horse,muß deine hinweise erstmal "verdauen". nein,buz11,kein fake.2000 mit stk200 begonnen.buch:volpe:avr... und sys doku atmel.nochn buch: link:assembler vom flohmarkt,das wars. anfänger,weil ich es noch schwer finde,fremde (unkommentierte) programme zu verstehen um daraus zu lernen.bin e-techniker,d.h. die "theorie der bits" war bekannt.logik ist eben universell. benutze für das stk200 baujahr 1999 "wavrasm" "avr studio" "isp" in uralt-versionen unter win98. (jaja,ist alt,aber läuft). welche aktuelle software ist noch für meine uralt konfiguration kompatibel ? studio 4 nicht wohl nicht (kein stk200 support?). studio 3.5 ? was soll ich runterladen ? verstehe die atmel page nicht. sind die 3 progs jetzt integriert? oder bleib ich besser bei dem was ich hab? bisdenn
danke für kritik.verbesserungen: "Schlecht ist die ISR beat. Vom Interruptvektor rufst du die mit "call" auf, beendest die dort mit ret, der folgende Befehl in der Sprungtabelle ist ein reti, insofern funktioniert das erstmal. Ist trotzdem nicht korrekt, kommt ein weiterer Vektor hinzu, ist es vorbei. Also die ISR mit rjmp anspringen, das reti kommt direkt ans Ende der ISR. Schneller ist es damit auch." reaktion:int vektor aufruf mit rjmp (nicht rcall):warn denk/tippfehler. die ganze int-logik ist ja abgeschrieben...sorry. hätte evtl üblen folgefehler produziert (multiple ints). "Weiterer Fehler: da du in der ISR flags veränderst (inc...), musst du das sreg sichern und vor Verlassen wieder herstellen, da sich sonst im Hauptprogramm undefinierbare Zustände ergeben." reaktion:push/pop logik in ISR beat.ist das so ok? "Als letztes noch die vielen .equ/ldi für die LEDs. Geht so, besser wäre es meiner Meinung nach, die als Konstanten im Flash abzulen und per lpm zu laden. Ermöglicht die Programmierung der Ausgaberoutine in einer Schleife." reaktion:mach ich vielleicht später.spart das (mit lpm) gegenüber den .equ´s speicherplatz? die bytes müssen doch eh in den programmspeicher. anders gefragt:frisst ein .equ ebenso ein byte wie ein .db ? denn damit werden doch die bytes standardmäßig im programmspeicher abgelegt ? vorteil:die variante mit .equ´s spart die logik mit dem z-pointer+counter beim auslesen mit lpm.außerdem kein "wahlfreier zugriff über namen". das .equ is nur ne merkhilfe für die bitgruppen (led-datas). bei einem display mit 512 leds brauchte ich mal nen zeichengenerator. da hab ich den z-pointer und lpm benutzt. "Reine Geschmackssache: die einzelnen inits würde ich nicht als einzelne UPs aufrufen, lohnt sich für 2 oder 3zeiler nicht. Ist zwar ein zusätzliches Strukturelement, aber na ja. Evtl. ein call init, wo dann alle Initialisierungen stehen, um das Hauptprogramm klein zu halten. Ich lasse eigentlich immer alle Initialisierungen ohne calls am Anfang des Hauptprogramms. reset: ;alle Initialisierungen main:" reaktion:in der entwicklungsphase ist es praktisch die reihenfolge der inits zu ändern. z.b. timer1: counter_run,local_int_on,global_int_on oder: local_int_on,counter_run,global_int_on? (hoffe du verstehst...) gibts eine "normreihenfolge" oder ists egal oder jeder wie er will ? was ist "optimal"? oder reichts wenns geht? wie machen das die profis? nochwas:danke für jeden hinweis.auch wenns so scheint als ob ichs besser wüßte,nehme ich doch jeden hinweis zur späteren benutzung auf. also weitermeckern. letzter Punkt:folgende sequenz (siehe attachment lite06.asm in "loop:") or keymain,uni01 ;testline_1a:ok! no store out porta,keymain ;testline_1b:ok! no store ; or uni01,keymain ;testline_2a:error:store ; out porta,uni01 ;testline_2b:error:store hier kommt es zu dem im attachment beschriebenen "speicherfehler". vielleicht den or-befehl falsch benutzt ? irgend eine idee ? nicht zu lang grübeln - deine zeit ist knapp. das wars erstmal - dank und gruß uli p.s.:lite6.asm nochmals im anhang
ISR ist immer noch nicht i.O. beat: nop in uni02,sreg push uni02 inc uni01 pop uni02 out sreg,uni02 reti du überschreibst uni02 und sicherst damit das sreg sowohl in uni02 als auch auf dem stack, dafür geht uni02 verloren. Das ist natürlich Quark. Entweder du nimmst generell ein reserviertes Register, um sreg zu sichern, das geht auch mit einem Register für alle ISR, solange du keine geschachtelten Ints benutzt, oder du sicherst auf dem stack. .def sreg_bak R2 beat: in sreg_bak, sreg inc uni01 out sreg,sreg_bak reti oder beat: push uni02 in uni02,sreg inc uni01 out sreg,uni02 pop uni02 reti Reihenfolge der Initialisierungen: ziemlich egal, ich nehme eigentlich immer zuerst den SP, dann die Ports, dann den Rest der on-Chip-Peripherie.
hi! ja so? hoffentlich jetzt richtig. siehe "beat:" im anhang (lite07.asm): fazit?:alle register,besonders das sreg, die in der isr verändert werden, zu beginn der isr auf stapel (oder in andere register) retten und am ende der isr wiederherstellen. das zuletzt auf dem stapel gesicherte reg zuerst wieder herstellen. "spiegelbildliche reihenfolge einhalten". nach ende der isr muss der zustand aller register wie vor der isr wiederhergestellt werden,als wär sie garnicht "dazwischengekommen". kann wohl schlimme folgen haben,wenn man das unterläßt,denn man weis ja nie,wann genau der int kommt und welche regs jetzt "zufällig" betroffen sind. inits zusammengefasst. danke gruß uli
Du solltest Deine Programme mal kommentieren. Zumindest über jede Funktion eine Kurzbeschreibung. Kommentare der Art: com keyfbck ;invert data bringen rein garnichts. Das Invertieren sieht man doch schon am COM-Befehl. Ich sehe da jedenfalls nicht durch. Insbesondere in der "key_ scan" sehe ich weder Entprellung noch Flankenerkennung, dafür scheint aber noch ne Menge unnützer Hardware (Decoder-IC, NE555) verbraten worden zu sein. Hier mal ein Beispiel für eine Matrixtastatur: http://www.specs.de/users/danni/appl/soft/keyscan/index.htm Ich ziehe auch immer Trennlinien, wenn eine neue Funktion beginnt. Z.B. so könnte eine gute Funktionsbeschreibung aussehen: ;-------------------------------------------------------------------- ; ;function: read and debounce 8 keys from Port C ;input: nothing ;output: key_press: key code, if key change from 1->0 ;used: key_temp, key_debounce ;stack: 2 (2 bytes pushed) ;cycle: 18..37 (min-max) ; key_scan: ... hier folgt der Code ... ret ;-------------------------------------------------------------------- Peter
hallo peter,habe woanders in diesem forum schon gelesen, das du großen wert auf korrekte entprellung legst. mit prellen hab ich (noch?) keine probleme,wenn ich einen taster drücke,geht die lampe an,bei lösen aus. ich setze ja kein flipflop,die lampe "hängt" einfach am taster und "schluckt" ein evtl. prellen. is en prototyp,wollte erweiterungen offenlassen,deshalb die hardwareredundanz.wollte ports erweitern für taster und leds. nahm 74373 latch für out und 74245 für in. decoder 74154 (1-16) selektiert 8xin , 8xout. werds so nicht wieder machen,aber:hab noch viel altes ttl-zeug, das sollte weg.allein die 8 74373 fressen zusammen 160mA... vielleicht pio8255 oder gibt es einen anderern "portexpander" mit mehr ports? wichtig! nur dil-versionen.hasse smd. kommentare:hast recht,habe kommentare bisher als merkhilfe für mich benutzt und weniger an andere gedacht,die es verstehen sollen.genau mein problem beim verständis von fremdprogs! will mich bessern ! die funktionsbeschreibung ist gut,werd ich übernehmen. dank + gruß
und noch mal zur ISR: "nach ende der isr muss der zustand aller register wie vor der isr wiederhergestellt werden,als wär sie garnicht "dazwischengekommen". kann wohl schlimme folgen haben,wenn man das unterläßt,denn man weis ja nie,wann genau der int kommt und welche regs jetzt "zufällig" betroffen sind." genau das ist der Sinn der Sache, ausgenommen natürlich die Ergebnisse der ISR, die müssen natürlich schon irgendwo abgelegt werden, kann eine Portänderung, ein einzelnes Bit, ein Softwarezähler oder irgendwas anderes sein. Alles, was im anderen Programmteilen verwendet wird und nur temporär in der ISR genutzt wird, muss gesichert werden. ISR funktioniert jetz, trotzdem unnötige Sachen drin: beat: nop ;unnötig push uni00 ;sichert uni00 in uni00,sreg ;sichert sreg push uni00 ;unnötig inc uni01 pop uni00 ;unnötig out sreg,uni00 pop uni00 reti
sorry crazy horse,das reg uni00 benutze ich dauernd woanders im prog,deshalb musses doch nach isr genau wie vorher sein. sehe uni00 wie ein temporäres zwischen-merk-register. in manchen listings heißt es "temp" oder "scratch". in der isr nehm ichs nur als hilfe,um das sreg auf stack zu pushen bzw poppen (oder popen?)"popeln?". deshalb muss ichs vorher (auf stapel) sichern. vielleicht denk ich zu kompliziert oder zu einfach,bin eh schon etwas wirr.alles auf den stapel,das spart register,oder? denn "push sreg" oder "pop sreq" geht nicht,glaube weils ein i/o und kein normales reg wie r00-r31 ist. oder gibts nen spezialbefehl zum push/pop des sreg? nop=unnötig=ok.bei neuen up´s fange ich immer so an: label: nop ret zwischen nop und ret kann ich dann "gut" einfügen,eine schrulle. gute kritik,besser wie bücher,weiter so!
so schwer ist das doch gar nicht... Das sreg kann man nicht direkt auf dem stack sichern, deswegen benutzt man dafür ein Register. Um aber den Inhalt dieses Registers nicht zu zerstören, wird dieses auf dem stack gesichert und ist danach frei für anderweitige Verwendung, in diesem Fall, um das sreg zu sichern. push uni00 ;sichert uni00 auf dem stack in uni00,sreg ;sichert sreg nach uni00 inc uni01 out sreg,uni00 ;restauriert sreg von uni00 pop uni00 ;restauriert uni00 vom stack reti ;alles ist, wie es war, bis auf uni01
Wächst und gedeiht... Neuerungen:-Tasterabfrage über overflow int von Timer0. -2 parallele (konkurrierende?) ints. -Sicherung der Arbeitsregister (uni00) und des -Statusregisters in den isr´s. Fragen an Experten: Muss beim 8515 der WDT nochmals disabled werden? Ist m.E. schon default aus.Brauche also nichts tun? Brauche den WDT nicht. ----------------------------------------------------------------- Wenn Timer Register bei laufendem Timer1 (TCNT1x) und aktiviertem lokalen (TCCRB) und globalem (sei) verändert werden müssen (variable Zeitbasis/Compare Wert), meinte jemand in diesem Forum,daß vor dieser Aktion der globale int aus und danach derselbige wieder eingeschaltet werden müsse.Ist das wahr? Was ist mit den lokalen ints ? Habe die regs manipuliert ohne Nebenwirkungen. So etwa meinte der Kollege: test: disable global int disable local int write ocr1ah write ocr1al enable local int enable global int ----------------------------------------------------------- Kann man auf z.B. Portc (Latch oder Pin) schreiben (out), obwohl der Port als "in" und "hochohmig/tristate" konf. ist ? Bei mir gehts,wie sollten sonst Daten zu den Leds kommen ? (siehe Listing).Etwas seltsam. Für mich irgendwie praktisch,sonst müßte ich den Portc dauernd umschalten,beim Daten Schreiben oder Lesen. Im UP "io_write:" werden Portc Daten geschrieben. Portc ist als "in" konfiguriert.Ein Widerspruch ? Oder mein Fehler? Wichtig:Es funktioniert ! So lassen ? ------------------------------------------------------------ Kurze verbale Erklärung,wie man Taster entprellt. Methoden? Ist es so (mit int T0) bei mir OK? Prinzip:Die Taster werden alle 16ms "blitzartig" abgefragt. Deswegen sind Preller "zu langsam" und werden nicht erfaßt. Nach weiteren 16ms ist der Preller dann vorbei. Könnte auch auf 63ms gehen (prescale /1024). Ist das noch besser als 16ms? Oder besser schneller? Grundregel?:Je langsamer,desto prellsicherer? Oder alles Unsinn? Gruß Uli
Hall bukongahelas Wie hat den das Studio 3.5 stk 200 unterstützt ?. Das proggen wurde zwar in der Studioleiste aufgerufen war aber ein einzelnes Programm. Wenn man soweit ist wie Du, bracht man doch kein Stk200. Den µC kannst Du doch in deiner Applikation proggen. Entweder mit extra Stecker oder mit direkten Testclip auf dem µC. Und wenn die Projekte anspruchsvoller (Dimmer, Motorbrücke u.s.w.) werden, sollte man auch an den PC oder Laptop denken der direkt bei der Centronicsprogrammierung mit der Applikation elektrisch verbunden ist.
Richtig,Frankl,prog den 8515 natürlich in meiner Schaltung mit SPI. Habe nur uralten Softwarestand von WAVRASM,AVRSTUDIO und ISP. Stürzt unter WIN98 manchmal ab. Will wissen,welche Software zum STK200 (eigentlich zu dem mitgelieferten DONGLE) passend ist und neuesten, ZU MEINEM DONGLE VOM STK200 passenden Softwarestand von der ATMEL Seite runterladen. Nehme ich also Studio 3.5 oder 4.0 ? Genau da blick ich nicht durch,und bisher habe ich trotz mehrfacher Fragen auch in diesem Forum immer noch keine genaue Antwort erhalten. Will eben VOR der Installation genaue Infos über geeigneten Softwarestand und den exakten Ort des Downloads haben. Welche Files sind von wo zu laden und wie zu installieren ? Gruß Uli
Schau doch mal hier findest Du für Dein Dongle die passende Sofware. http://www.mikrocontroller.net/tutorial/ Wenn man auf 4.08 (www.Atmel.com) umsteigen will lohn es sich nur, wenn man neue µC der Mega Serie benutzen will. 4.08 ist doch ganz schön Recourcen fressend. Ich habe mir den aus der Applikation AVR910 (serieller) gebaut, der wird von 4.08 unterstützt. Die Software Version 3.1 für Ihn habe ich hier im Forum geladen und dann mit meinem alten Stk200 Dongle geproggt.
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.