Atmega8-Anlaufprobleme

Gast #254647
Lesenswert?

Hallo Zusammen,

ich habe einen Atmega8 und habe entsprechend dem Tutorial die das
ISP-Interface, die MC-Schaltung und ein I/O-Board gebaut.
Jetzt hab ich einmal ein Programm geschrieben, mit dem ich alle Ports
als Ausgang definiere und in einer Schlaufe sie jeweils 1 und 0
wechsle.
Das Problem: Die Led´s leuchten nicht. :(

Folgende möglichen Fehlerquellen kann ich ausschließen:

- Led hat zu den passenden Pins Kontakt, und funktioniert auch, wenn
man den Ausgang manuell auf Masse zieht
- Programm lässt sich mittels PonyProg aufspielen und auch wieder
auslesen (Daher gehe ich davon aus, dass auch das drauf ist)

Frage: Muss ich den MC seperat über einen Reset booten? Oder reicht es,
wenn ich ihn vom ISP abklemm und mit dem I/O-Board verbinde?
Ist für einen ATmega8-16U die richtige include Datei "m8def.inc"?

Ich würde mich sehr über eure Hilfe freuen, da doch schon ein paar
Stunden drauf gegangen sind.

Gruß

Michi
Angehängte Dateien:
#254648
Lesenswert?

Du hast die Datenrichtung nicht definiert, Die Ports sind noch als
Eingang geschaltet.

Schau dir mal das Programm im Anhang mit AVR-Studio an und versuche mal
mit Hilfe des Datenblattes (Vollversion!) nachzuvollziehen, was (und
warum so und nicht anders) dort gemacht wird.
Du kannst dazu auch den Simulator bemühen.

...
Angehängte Dateien:
Gast #254649
Lesenswert?

Hat dein AVR einen Takt? Je nachdem, wie du ihn konfiguriert hast,
entweder extern per Quarz oder den internen aktiviert.
Ohne Takt läuft das Programm nicht los.
Allerdings würde dann glaube ich auch nicht prgrammiert werden (bin ich
mir unsicher gerade).
Reset-Pin kannst du ja mal auf +5V legen, dann sollte es loslaufen.

Soweit ich sehe, ist dein Programm OK, also Ausgänge definierst du
(keine Ahnung, was HanneS meint). alle Bits in den DDRx sind bei dir
1.

Du schaltest die LEDs wahnsinnig schnell ein und gleich wieder aus,
vielleicht siehst du nur nicht, dass sie leuchten?

Probier mal ein Programm raufzuladen :

.INCLUDE "m8def.inc"
.DEF mp = R16
main:
ldi mp,0xFF
out DDRB,mp
ldi mp,0x00
out PORTB,mp
loop:
rjmp loop


Und danach mal:

.INCLUDE "m8def.inc"
.DEF mp = R16
main:
ldi mp,0xFF
out DDRB,mp
ldi mp,0xFF
out PORTB,mp
loop:
rjmp loop

jörn
Gast #254651
Lesenswert?

Vielen Dank euch Dreien!!!!

Also Hannes sein Programm funktioniert.

Dazu hätte ich aber noch ein paar Fragen:

- ist das  "reti  " für das Programm relevant?(was macht es)
- wie wir der MC über die Software resetet?

Den ResetPin hab ich mit einen 10K Widerstand zusammen mit einem 47pF
Kondensator gegen Masse an Vcc gehängt, wie in Anleitung.

Auf jeden Fall habt Ihr mir sehr weitergeholfen.
Jetzt weiss ich wenigstens, dass die Schaltung funzt.

Michi
#254653
Lesenswert?

Wegen des RETI in der Int-Vektortabelle in diesem Fall auch mal im
Datenblatt unter Interrupt sources nachschlagen.
Es ist an dieser Stelle sehr wichtig und dient als Platzhalter für
unbenutzte Interrupts. Es sorgt also dafür, dass jeder Sprung zur ISR
auch an die richtige Adresse des Flash kommt.

Das geht zwar auch mit der .org-Direktive, aber ich habe guten Grund,
dafür zu sorgen, dass die Hexdatei linear (unfragmentiert, lückenlos)
bleibt.

...
#254654
Lesenswert?

@Jörn:
Hast recht, hatte ich irgendwie übersehen... :-(

Mir ging es aber auch noch darum, zu zeigen, dass
Interrupt-Programmierung viel einfacher ist, als viele Anfänger denken.
Auf alle Fälle ist es flexibler als der Einsatz von ellenlangen
Warteschleifen. Und damit kann man nicht früh genug beginnen.

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren