Forum: Mikrocontroller und Digitale Elektronik mega8 - fragen bei assembler


von Tim (Gast)


Lesenswert?

hallo leute...kleines prob bei einem anfänger :)
also ich habe meinen atmega8 folgende belegung spendiert:
LDI temp, 0x00
OUT DDRB, temp      ;Eingänge
LDI temp, 0xFF
OUT DDRC, temp      ;Ausgänge
LDI temp, 0x00
OUT DDRD, temp      ;Eingänge
da ich die pullups nicht benutzen will sollte das alles gewesen sein
richtig?? die frage bei port c: das ist nur ein 7 Bit Port..wird der
trotzdem so als wären es acht initialsiert?? der pin 6 soll als
normaler ausgang aktiviert werden, nicht als reset..richtig so?? oder
fehlt da noch was?? was fehlt für den externen takt noch??
zum anderen noch die frage:
wie startet man nen timer und vorallem wie stoppt man ihn und resetet
ihn wieder??
danke für jede hilfe :)
gruss Tim

von Fritz Ganter (Gast)


Lesenswert?

Den Timer startet und stoppt man in dem man den Prescaler setzt,
einstellen kann man ihn mit den Registern die im Datenblatt angegeben
sind.

von Jörg Wunsch (Gast)


Lesenswert?

Uh, oh, bist Du Dir wirklich sicher, daß Du Deinen Chip nie wieder via
ISP programmieren willst?  Nur dann solltest Du die RSTDSBL-Fuse
setzen, um ihn als Ausgang zu verwenden.  Solange sie gelöscht ist,
kannst Du in die Steuerregister für Port C, Bit 6 programmieren, was
Du willst.

Ansonsten klar, Du mußt den Port natürlich im Ganzen ansprechen, Bit 7
ist offiziell reserviert, d. h. es wird als 0 gelesen und sollte als 0
geschrieben werden.  Vermutlich wird es aber einfach nur ignoriert,
wenn Du was anderes reinschreibst.  Alternativ könnte es auch sein,
daß die CPU sich das merkt, was Du geschrieben hast und Du es wieder
auslesen kannst, es eben nur auf keinen Ausgang führt.

von Tim (Gast)


Lesenswert?

also zum pin6 an portc: ich brauche halt noch einen weiteren ausgang.
ich plane in der schaltung via isp neue updates einspielen zu können.
die frage ist ob man das irgendwie bewerkstelligen kann...
vielleicht könnte mir jemand mal die drei zeilen posten damit ich mir
den chip nicht versaue :/
sonst würde ich alternativ an portd pin0 diesen ausgang
initialisieren..dazu müsste ich aber das gesammte layout ändern was
ziemlich arbeit wäre da der chip im mlf gehäuse ist und die platine smd
bestückt ist.
standartmässig sind die pullups also aus ja?? wie sieht das für
internen/externen takt aus..hat da jemand mal nen beispielquellcode
oder kann mir sagen wie das gemacht wird???
die geschichte mit dem timer hat sich erledigt
danke

von Stefan Kleinwort (Gast)


Lesenswert?

Also entweder PortC.6 ist I/O-Pin, dann gibt es keine ISP-Möglichkeit.
Oder PortC.6 ist /Reset, dann geht ISP, aber eben kein I/O.

Lösung kann sein: Bootloader verwenden, z.B. über RS232, beim ersten
Initialisieren Bootloader flashen und Fuse brennen. Unangenehm wenn
irgendwas schiefgegangen ist.

Für die neuen mega48/88/168 ist der /Reset gleichzeitig der Debug-Pin.
Ist für mich ein Grund mehr, diesen Pin nicht als I/O zu verwenden.

Stefan

von Tim (Gast)


Lesenswert?

gliech noch ne frage..der isp brauch ja auch die miso mosi und sck
ports..die brauch ich aber auch als eingänge..gibts da keine probs??

von Tim (Gast)


Lesenswert?

:/ ich steig da ehrlich nicht mehr durch..
bitte kann mal wer posten wie ich das jetzt richtig initialisiere wenn
ich später mit nem isp neue updates einspielen will (also bitte mal den
assembler code..das is als neuling etwas unverständlich)
PB, Bit0 bis Bit4 eingänge ohne pullup, Bit5 brauch ich nicht,
    Bit6 und Bit7 als externen osc
PC, Bit0 bis Bit5 ausgänge, bit6 der reset
PD, Bit0 ausgang, Bit1 bis Bit7 eingänge ohne pullup
danke für die mühen

von Fritz Ganter (Gast)


Lesenswert?

HAllo Tim!

Es ist total egal wie du die Eingänge programmierst. Wenn der
Controller programmiert wird, wird er als erstes sowieso resettet, und
da werden die Ports alle auf Eingang geschaltet. Was dir höchstens
passieren kann ist, dass deine Schaltung nicht richtig arbeitet,
solange du das Programmierkabel angesteckt hast.
Also nach dem programmieren ev. das Kabel abstecken und gut ist.

von Klaus (Gast)


Lesenswert?

RTFM..

Oder: Lies das Datenblatt, versuche das hier im Forum befindliche
Tutorial zu verstehen, begnüge dich vorerst damit, eine LED zu schalten
und dann blinken zu lassen, gehe einen Schritt nach dem anderen. Und
route deine Platine erst, wenn du begriffen hast, was der Chip kann.
Tip am Rande: Lies nicht nur die Überschriften, hier geht es nicht um
Werbebotschaften sondern um Fakten, die verstanden werden sollten.

Klaus

von Tim (Gast)


Lesenswert?

spassvogel..sorry..aber solche kommentare sind fehl am platz..und das
ist nicht böse gemeint.
das tutorial ist schön und gut..ich habe es durchgearbeitet und
simuliert und es gebrannt...funktioniert auch alles..man versteht was
dort gemacht wird. aber vielleicht erinnerst du dich an deine
anfangszeiten...dann versucht man natürlich immer ein bisschen
mehr..das klappte auch soweit, die ersten programme laufen auf meinem
board das ich mir geätzt hab. jetzt habe ich ein neues vollbeschaltetes
board geeagelt...und möchte darauf testen.
jetzt bin ich an dem punkt wo ich den controller halt mal voll
beschalten will...simulation ist das eine..aber es geht hier um ein
feedback fürs brennen!!!! und bevor ich mir einen controller nach dem
anderen versaue frage ich lieber leute die davon ahnung
haben..schliesslich kostet das alles geld!! UND DAS STEHT NICHT IM
TUTORIAL!! das ein anfänger nicht alles gleich von anfang an versteht
sollte auch dir klar sein..er lernt ja erst noch!! und dafür gibt es
diesen bereich hier glaub ich auch!! wenn jemand hier fragen zu
elektrischen sachen hat die ich trivial finden hau ich ihm auch nicht
gleich sowas an den kopf!! also vielleicht gibts ja leute die ein wenig
mehr hilfe anbieten..danke an klaus

von Peter D. (peda)


Lesenswert?

Du solltest aber schon zuerst ins Datenblatt sehen, bevor Du die Platine
machst.
Schließlich mußt du ja wissen, welchen Pins Sonderfunktionen haben
(Reset, Quarz, SPI usw.).
Und solange Du die Sonderfunktionen nicht verstanden hast, solltest Du
die Pins besser reserviert lassen.

D.h. wenn Du gleich zu Anfang alle Pins ausreizt, dann hast Du was
falsch gemacht.
Nimm dann zuerst mal den ATMega16.

Bzw. in der Praxis ist es oft möglich Pins mehrfach zu verwenden, da
man sie ja jederzeit in ihrer Funktion umschalten kann.

Man kann z.B. Tasten in einer Matrix verschalten, ein LCD mittels
Schieberegister über 3 Leitungen ansteuern, LEDs multiplexen, für SPI
und I2C eine Leitung gemeinsam verwenden, mehrere I2C oder 1-Wire an
den gleichen Leitungen anschließen usw.


Peter

von Tim (Gast)


Lesenswert?

ich kann nicht jede woche neu ätzen..deshalb hab ich ein board gebaut wo
ich halt alles belegen kann (mittels dip schalter) wie ich es will.
ich möchte mir ein ziemlich einfaches programm schreiben um das nochmal
klar zu machen.
an den eingängen sind 11 taster (portb und portd) an portc und
portd-pin0 sind 7 leuchtdioden angeschlossen. beim drücken jedes
tasters soll also eine andere kombination an den leds ausgegeben
werden..frage: ist das jetzt wirklich ein prog das ihr zu hoch für nen
anfänger haltet??? wenn ich das datenblatt richtig verstanden hab..das
is bei englisch immer so ne sache bei mir :) - muss man halt die
zusatzfunktionen erst freischalten..also standartmässig sind es alles
io ports!!! ich würde den reset also ständuig auf high schalten über
dip was bei dem board kein prob ist..es geht mir nur ums brennen!!..is
das so kompliziert?! ich will nur nicht erst wieder chips
bestellen..dann is bis mitte nächster woche erstmal ruhepause :/

von Peter D. (peda)


Lesenswert?

Also nochmal:

RESET, MOSI, MISO, SCK führst Du auf einen Connector (siehe Tutorial)
zum Programmieren.

XTAL1 und XTAL2 je 22pF gegen Masse und einen Quarz vorsehen, damit Du
bei Bedarf mit externen Takt arbeiten kannst.

RXD, TXD mit Standardbeschaltung MAX202 und Sub-D9 vorsehen, wenn Du
mal was mit der UART zum PC machen willst.

Jetzt darfst Du alle übrigen Pins mit LEDs oder Tasten beschalten, wie
Du lustig bist.


Peter

von Tim (Gast)


Lesenswert?

PS..
scheint wohl schneller zu gehen 30 zeilen text zu schreiben was man
machen sollte und was nicht also 9 zeilen assembler..danke auch :(

von Tim (Gast)


Lesenswert?

die frage ist ob ich die ports MOSI MISO SCK RXD TXD trotzdem als
eingang nutzen darf oder nicht mit der uart will ich auf dem board
erstmal gar nichts machen

von Peter D. (peda)


Lesenswert?

Scherzkecks, wie soll man denn in Assembler beschreiben, welch Pins für
Sonderfunktionen frei bleiben müssen ?


Peter

von Tim (Gast)


Lesenswert?

vielleicht über ein register oder so..das frage ich ja..ich will im
prinzip keine sonderfunktionen da ich erst angefangen hab.. aber der
reset sollte schon bleiben damit ich den chip weiterhin nutzen kann für
isp

von Peter D. (peda)


Lesenswert?

Der Erfahrene kann natürlich verschiedene Funktionen kombinieren.

Der Anfänger tut sich damit eher schwer, sollte also die einzelnen
Sachen exklusiv lassen, wenn er nicht gerade auf graue Haare steht.


Ich hatte Dich so verstanden, daß Du das Bord längere Zeit benutzen
willst und dann ist eine UART schnell interessant (Bootloader,
Debugausgaben).


Peter

von Tim (Gast)


Lesenswert?

nein..ich will mit dem board über einen timer die eingangsänderungen
abfragen..später die int0 int1 geschichten vielleicht mal nen zweiten
timer dazu..ist reines experimentierboard halt mit externen osc. die
verschaltung dafür hab ich auch geändert weil man den reset wie mir
oben gesagt wurde nicht als ausgang nutzen soll. es sind zwar pads auf
der platine mit denen ich extern später mal was zufügen kann, aber das
ist erstmal uninteressant..wie gesagt..läuft über 8fach dips.
wie man nen port als aus oder eingang definiert ist im tutorial schön
gezeigt..nur leider nicht für den portb..und dazu würde ich halt gern
mehr wissen..frage ich halt anders:
  ldi r16, 0xFF
  out DDRC, r16      ;Port C durch Ausgabe von 0xFF ins
                     ;Richtungsregister DDRB als Ausgang konfigurieren
  ldi r16, 0x00
  out DDRB, r16      ;Port B durch Ausgabe von 0x00 ins
                     ;Richtungsregister DDRD als Eingang konfigurieren
  ldi r16, 0xFF
  out PORTC, r16     ;PORT C auf 0xFF setzen -> alle LEDs aus

kann man das so an port c machen oder muss ich was einfügen damit man
reseten kann..wenn ja was??
das ist ein etwas abgewandeltes bsp aus dem tutorial io grundlagen.
die frage dazu: arbeitet dieser mit externen oder internen takt und
wenn er intern ist..wie bekomme ich ihn auf extern..das sind doch nun
wirklich nur noch 4 befehle oder so..also bitte..keine langen
diskusionen sondern einmal helfen..danke an die die mich erhören
gruss tim

von Sebastian (Gast)


Lesenswert?

Also ich hab auch erst ne weile gebraucht aber man kommt hinter alles
irgendwann.

Für ISP benötigst du MOSI, MISO, SCK und /RESET. Da der Mega 8 zu wenig
Pins hat, ist der /RESET Pin mit ner doppel Funktion belegt. Die kann
man aber nur nutzen wenn man per Fuse den AVR sagt man will dies tun.
Wenn du also die Fuse brennst hast du keinen Reset Pin mehr dafür einen
I/O Pin. Da du dann kein /RESET hast, kannst du KEIN ISP mehr machen.
Der Atmel lässt sich dann nur noch im parallel - Mode programieren.

Im Program kannst du da gar nix einstellen. Wenn die Fuse nicht
programmiert hast, kannst du in DDRC schreiben was du willst. Es ändert
nichts an der Funktion des /RESET Pins.

von Tim (Gast)


Lesenswert?

ah..danke sebastian...fuse deshalb wahrscheinlich weil du beim brennen
irgendwas zerstörst und damit den pin 6 als io definierst. das passiert
also nur beim brennen..gut..da weiss ich bescheid..ich dachte man müsste
das über die programmierung machen :)
bit gesetzt heisst zweitfunktion, bit gelöscht io..aber das war ja dann
wohl falsch..danke für die aufklärung!! :)
wie sieht das beim oscillator aus?? hat da noch wer was für mich??
dann frag ich auch nicht weiter :)

von Tim (Gast)


Lesenswert?

so langsam komm ich dahinter..also die zweitbelegung ist nur möglich
wenn ich fuses zerstöre und somit entgültig oder wie?! das würde
bedeuten das ich wenn ich isp nutze die 3 pins (mosi miso sck) nicht
als eingang belegen darf da ich für io an den drei pins die fuses
brennen muss..stimmt das so???

von thkais (Gast)


Lesenswert?

Nein.
1. Die Fuse kann wieder zurückgesetzt werden, ist also nicht für immer
zerstört.
2. mosi miso sck werden nicht durch eine Fuse ein/ausgeschaltet,
sondern automatisch. (Programmieralgorithmus, siehe Datenblatt)
Die Datenblätter vom Atmel sind wirklich vorbildlich - dort steht
genau das alles drin.
Wie schon mehrfach erwähnt, kann man miso mosi und sck auch anderweitig
verwenden. Allerdings sollte man sich darüber im klaren sein, was man
macht. Beispielsweise die Verwendung des sck als Eingang ist nich so
gut - wenn Deine Applikationsschaltung den Pin auf Low zieht, kann Dein
Programmierer machen was er will - er wird den Controller nicht
programmieren können.
Den Reset-Pin würde ich nur im absoluten Notfall als Portpin
verwenden, denn Du schießt Dir ins Knie, wenn Du den Reset
abschaltest.
Und immer schön dran denken: Eine Fuse gesetzt, d.h. programmiert,
bedeutet: Fuse = 0. (Steht auch im Datenblatt)
Solange Du nur mit einer Experimentierplatine herumprobierst, würde ich
es nicht komplizierter machen, als notwendig.

von Klaus (Gast)


Lesenswert?

Hi Tim,

mit Spaßvogel hast du garnicht so unrecht.

Auch ich habe es nicht böse gemeint, doch deine Fragen zeigten ganz
deutlich, dass du dich nicht ernsthaft mit dem Datenblatt befasst hast.
Daher mein sehr überspitzter undiplomatischer Hinweis.

Dachtest du, meine Anfangszeit war leichter? Auch ich habe Platinen
verschrottet weil ich sie zu voreilig entwickelt hatte. Dies passiert
jedem mal, der kreativ etwas selbst macht (naja, den notorischen
"Nachbauern" passiert sowas seltener). <ironie> Doch man kann nicht
erwarten, dass ATMEL die Funktion des Resetpins ändert, nur weil du ihn
schon anderweitig verplant hast. :) </ironie>

Und wenn ich mir so die anderen Beiträge ansehe muss ich feststellen,
dass fast überall ein (teils sehr dezenter) Hinweis zu finden ist, dass
du die Nase mal ins Datenblatt stecken solltest. :) Nicht so direkt wie
ich, aber immerhin. Da lag ich also gar nicht so doll daneben.

Beste Grüße und viel Erfolg, Klaus (Großes K und kleine Laus)

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.