Forum: Mikrocontroller und Digitale Elektronik meinungen zu ass.prog.


von bukongahelas (Gast)


Angehängte Dateien:

Lesenswert?

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

von buz11 (Gast)


Lesenswert?

Ist das ein Fake ?

Sieht zu professionell aus ( Kommentare ) .

von crazy horse (Gast)


Lesenswert?

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:

von bukongahelas (Gast)


Lesenswert?

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

von bukongahelas (Gast)


Angehängte Dateien:

Lesenswert?

verbesserte version

von bukongahelas (Gast)


Angehängte Dateien:

Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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.

von bukongahelas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von bukongahelas (Gast)


Lesenswert?

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ß

von crazy horse (Gast)


Lesenswert?

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

von bukongahelas (Gast)


Lesenswert?

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!

von crazy horse (Gast)


Lesenswert?

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

von bukongahelas (Gast)


Lesenswert?

genau,das isses !
eine art doppelter salto rückwärts...

von bukongahelas (Gast)


Angehängte Dateien:

Lesenswert?

verbesserte version:
up´s beat und beat_time sind noch in entwicklung

von bukongahelas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Frankl (Gast)


Lesenswert?

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.

von bukongahelas (Gast)


Lesenswert?

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

von Frankl (Gast)


Lesenswert?

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.

von bukongahelas (Gast)


Lesenswert?

aha,langsam dämmerts...
danke
Uli

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
Noch kein Account? Hier anmelden.