mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART funzt nich - ASM (Assembler) - ATMEGA16


Autor: Alex B (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

warum funktioniert der Quellcode nicht?
Er schickt zwar die Punkte, aber er empfängt einfach nie was..

Kann mir vllt jemand helfen?

Mit freundlichen Grüßen
Alex

Autor: Michael Frangenberg (startrekmichi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist du dir sicher, dass er beim Empfang wirklich den Interrupt nach
"INT_RXC" macht? Weil folgendes sagt mir grad nix:
".org URXCaddr
        rjmp INT_RXC"

logischerweise musst du "rjmp INT_RXC" an die Stelle schreiben, wo er
beim USART Receive Complete Interrupt hinspringt und das wäre bei
"         reti;rjmp USART_RXC         ; USART RX Complete Handler"

Autor: Alex B (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
geht auch nicht..

Autor: Hartmut Gröger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Versuch mal die rjmp durch jmp und reti durch reti und nop zu
ersetzen.

Mfg HG

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht auch nich :(

Autor: Hartmut Gröger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich weiss zwar nicht wie dein Code jetzt aussieht, aber versuch mal
einfach dir Struktur der Interrupttabelle aus den Datenblatt zu
übernehmen. Ansonsten schau dir die Codebeispiele noch mal genau an.

Mfg HG

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die interrupttabelle ist ja 1 zu 1 von anderen programmen kopiert..
sollte also eigentlich gehen.. aber irgendwie wills ned.. kein plan
warum.. ich probier einfach mal weiter rum..

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART
empfangen wurde
INT_RXC:
1.  push temp        ; temp im stack sichern
2.  in temp, UDR     ; Empfangenes Byte in R16(temp) laden
3.  ldi temp, 0x02
4.  out PORTA, temp   ; R16 über PortA (LEDs) ausgeben
5.  pop temp   ; temp wiederherstellen
6.  reti     ; Interrupt beenden

Hi,
Was ist mit 3.? Egal was du empfängst, Du gibts immer 0x02 aus...

Muss man in einer Interruptroutine generell das SREG sichern, Du seztz
mit Sicherheit das Z-Flag, wenn du "NULL" empfängst.
Sonst: Es könnte sein, das deine Interrupttabelle aus einem Programm
mit einem anderen Chip stammt. da sieht die Tabelle dann anders aus.
Habe ich jetzt aber nicht überprüft.
Gruß
Axel

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du seztz, er seztz, sie seztzen, sieht zugegeben komisch aus

"Du setzt" ist wohl richtig, sorry.

Autor: Dave W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schicke bitte nochmal den Quelltext..

c&p ist nicht immer gut:
"die interrupttabelle ist ja 1 zu 1 von anderen programmen
kopiert.."

Ab 16kB Flash sind die IntVektoren immer mit 2 Words bestückt (für
JMP).

Deswegen nochmal den Quelltext.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nun ich denke eins geht nur:
etweder die Interrupttabelle mit allen Ints untereinander aufführen.
Dann aber mit JMP statt RJMP( siehe Dave, siehe Datenblatt Mega16 Seite
44), oder nur mit den vordefinierten Adressen aus der mega16.inc
(.xxxadr) arbeiten. diese sollten auf alle Fälle stimmen.

Du kannst das Programm doch mal in's AVR Studio laden und das URXC
Flag von Hand setzen, dann siehst du, welcher IntVector angesprungen
wird.

Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
nur mit Reti in der Tabelle springt das Prog sonstwo hin

Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
mit reti+nop passt es,

beim ersten posting hat es auch gepasst:

".org URXCaddr
        rjmp INT_RXC"

war schon richtig..

Andere (gemeine) Frage:
Warum hast Du das nicht selbst schonmal im AVR Studio probiert?
Machst wohl noch nicht so lange, oder?

Gruß auch an alle
AxelR.

Autor: Alex B (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist nochmal der Quellcode, ich hab die Teile, die nichts damit zu
tun haben, herausgeschnitten.
In der INT_RXC schaltet er nur zum Testen die LEDs in einen
festgelegten Status um, damit ich sehen kann, ob er überhaupt was
empfängt.
und ja, ich schreib das ganze in avr-studio und bin selbstverständlich
blutiger anfänger.. bis jetzt habe ich assembler ausschließlich für den
pc verwendet, das hier ist mein erster controller.
allerdings hatte ich doch auch schon ein programm geschrieben, in dem
der chip empfangen konnte und die leds danach geformt hat.

mfg

Autor: Alex B (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier nochmal der alte quellcode, der funktioniert hat.

Autor: Alex B (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
jetzt habe ich die interrupt-tabelle mal dem bild, dass hier gepostet
wurde angeglicher...läuft genausowenig..
ich schätze mal, dass es nur eine kleinigkeit ist, die hier überhaupt
nicht passt, aber welche?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist es zuviel verlangt, mal in das Datasheet vom Controller
reinzuschauen? Da steht auf Seite 44 schon drin wie die IRQ-Tabelle
auszusehen hat. Deine Version braucht 4 Worte pro Eintrag, vorgesehen
sind 2 (Mega16 aufwärts).

Der Tip oben mit den NOPs ist nicht ganz passend. NOP nach RETI
braucht's nur dann, wenn für den jeweiligen Vektor kein JMP drin
steht. Also entweder JMP, oder RETI/NOP.

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum funktioniert das ganze in dem einen programm, und im anderen
nicht??

Autor: Erkan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sag mal, hast Du Brett vorm Kopf, oder was?
Benutzt Du IRQ-Tabelle mußt Du jeden Eintrag mit 2 Words füllen, OK?

Also, IRQ-Tabelle ohne ISR (Interrupt Service Routine) =

 RETI  ;  1 Word
 NOP   ;+ 1 Word = 2 Words

Mit ISR =

 JMP int_rxc  ;  2 Word

ODER

 RJMP int_rxc ;  1 Word
 NOP          ;+ 1 Word = 2 Words

Machst Du es so wie

.org URXCaddr
        rjmp int_rxc

braucht man das nicht zu machen weil durch .org URXCaddr die Adresse
für den INT-Vektor für URXC an die rivhtige Stelle gepflantzt wird.
Solltest Du aber noch einen Interrupt hinzufügen mußt Du das je nach
Adresse ob niedriger oder höher davor oder dahinter setzen.

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sag mal.. entweder blick ich hier überhaupt nix mehr, oder sonst was..
guck dir meinen vorletzten beitrag mal an.. interrupt.asm ...da hab ich
es doch genauso gemacht, wie du es eben beschrieben hast. und ganz am
anfang vom beitrag hatte ich es ja auch noch so:
.org URXCaddr
        rjmp int_rxc
und es funktionierte nicht... und in dem alt.asm was ich hier gepostet
habe, ist auch eine interrupttabelle mit NUR rjmp und reti und die
funktionierte ja komischerweise auch..

ich check langsam echt nix mehr :/

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und ganz am
anfang vom beitrag hatte ich es ja auch noch so:
.org URXCaddr
        rjmp int_rxc
und es funktionierte nicht...

doch, das hat funktioniert!
Nur hast Du die empfangenen Daten mit 0x02 überschrieben. Eigentlich
wolltest Du nur zusätzlich die LED schalten, hast aber mit "ldi
temp,0x02" den Wert den Du vorher mit "in temp, UDR" immer wieder
überschrieben. Wenn Du die Ausgabe "formen" willst, (was immer das
heissen mag) musst Du , wenn überhaupt "andi temp,0x02" machen und
das dann ausgeben.

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das hab ich nur als beispiel gemacht, um zu sehen, ob das unterprogramm
überhaupt aufgerufen wird. wäre es aufgerufen worden, wäre es völlig
egal gewesen, WAS empfangen worden wäre. somit hätten sich alle leds
bis auf das 2. ausschalten müssen (oder das 2. an).
--> tut es aber nicht

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso...

gehts denn nun?

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, sonst hät ichs selbstverständlich gleich gesagt ^^
ich hab schon alles mögliche ausprobiert.. ich verzweifel langsam..
warum geht das nicht?

Autor: Alex B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier sind doch lauter ehrfahrene leute, die wahrscheinlich schon
ettliche controller programmiert haben. ich selbst habe nur erfahrung
mit pic-controllern, aber ich wollte halt mal nen ATMEL-Controller
ausprobieren. Bloß der will nicht so wie ich.
Wenn jemand mal kurz ein programm schreiben könnte, welches einfach die
empfangenen bytes über port A (LED-Leuchten) wieder ausgibt.. das lad
ich dann mal drauf und teste es, falls derjenige keinen baugleichen
controller hat.

mfg

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.