Datum: 21.03.2008 12:54
Hallo liebe Leute ! Ich habe folgendes Problem: Ich habe ein µC Programm geschrieben welches Daten über die serielle Schnittstelle empfangen soll. Das ganze ist eigentlich ganz einfach. Über ein Java Programm schicke ich einen 8 stelligen, binären Wert. Nun hängt an meinem µC an den Ausgangspings eine Platine mit 8Leds. Diese 8 Leds sind parallel geschalten, so dass ich jede einzeln ansteuern kann. Nun ist mein Problem, dass das mit dem empfangen leider nicht so funktioniert wie ich mir das vorstelle. D.h ich komme zwar in die Schleife die empfangen soll aber weiter geht es nicht. Wie ich festgestellt habe liegt es daran, dass das Flag ri0 welches anspringen sollte wenn Daten kommen sich nicht ändert. Könnt ihr mir vielleicht sagen was an dem Programm falsch ist ?
$include (c8051f330.inc) ; Include register definition file.
;-----------------------------------------------------------------------------
; RESET and INTERRUPT VECTORS
;-----------------------------------------------------------------------------
; Reset Vector
cseg AT 0
ljmp Main ; Locate a jump to the start of
; code at the reset vector.
;-----------------------------------------------------------------------------
; CODE SEGMENT
;-----------------------------------------------------------------------------
Blink segment CODE
rseg Blink ; Switch to this code segment.
using 0 ; Specify register bank for the
; following program code.
Main:
; Disable the WDT.
anl PCA0MD, #NOT(040h) ; clear Watchdog Enable bit
; Enable the Port I/O Crossbar
orl P0SKIP, #0ffh ; skip LED pin in crossbar
; assignments
mov XBR1, #40h ; enable Crossbar
orl P1MDOUT, #0ffh ; make LED pin output push-pull
orl P1MDIN, #00h ; make LED pin input mode digital
call init
mainloop:
call char_in
mov P1,A
jmp mainloop
char_in :
jnb ri0,$
mov a,sbuf0
clr ri0
ret
init:
mov tmod,#00100000b
mov th1,#0fdh
mov scon0,#01010000b
setb tr1
ret
;-----------------------------------------------------------------------------
; End of file.
END
|
Datum: 21.03.2008 12:57
Tja, das liegt dann wohl daran dass du deine serielle Schnittstelle des Controllers nicht konfiguriert hast. Sie kann ja nicht wissen, mit welcher Geschwindigkeit du arbeiten willst. Ralf PS: Welchen Pegelwandler hast du genommen? Aufpassen bei Rx des Controllers mit der Porteinstellung, auf keinen Fall als Ausgang schalten!
Datum: 21.03.2008 13:11
Korrektur: Du hast sie initialisiert (habs zu spät gesehen, sorry). Hm... Hast du die Baudrate richtig berechnet? Ich empfehle dafür das ConfigTool von SiLabs zu verwenden (gibts auf der HP frei zum Download). P1MDIN = 0x00 --> Warum auf Analog Input gesetzt? Laut Datenblatt musst du es auf 0xFF setzen, wenn es kein Analog Input sein soll. P1MDOUT: Hängen deine LEDs an GND oder VCC? Wenn sie an VCC hängen, dann den Port als OpenDrain schalten. Deine Crossbar-Configuration lässt die serielle Schnittstelle gar nicht an die PortPins!!! Deswegen ändert sich dein RI-Flag auch nicht!!! Wie bereits empfohlen, die Crossbar-Config nicht von Hand machen, sondern mit dem Silabs Tool. Und den Output des Tools dann prüfen!!! Ralf
Datum: 22.03.2008 15:30
Das mit der Analog Einstellung war nur ein Fehler, war beim ersten Versuch auch auf Digital gestellt, hat trotzdem nicht funktioniert. Jede Led wird eigens über einen Pin versorgt und ist an Masse angeschlossen. Die Schaltung hab ich im Anhang drin.
Datum: 22.03.2008 16:43
Ohne Vorwiderstände wird das aber nix. Das kokelt bloß, wenns dumm läuft. Hast du die Konfigurationssoftware von Silabs mal verwendet? Wie gesagt, wenn du die serielle nicht nach aussen lässt, wirds nicht gehen... Ralf
Datum: 22.03.2008 20:16
Vorwiderstände sind vorhanden und auch nach dem Strom dimensioniert, so dass ich nicht zuviel ausm µC ziehe. Ich werde mich jetzt auf die Suche nach dem Config Tool machen und dann meine Erlebnisse schildern. Vielen Dank Ralf :D
Datum: 23.03.2008 23:38
Ja, tu das. Hier der Link zum ConfigTool: http://www.silabs.com/public/documents/software_do... Mit dem Tool kannst du sämtliche Configurationen festlegen (Ports, UART(s), Timer, usw.) Allerdings empfehle ich, den generierten Output auch zu prüfen, es kam schon vor, dass der Output falsch war (Fehler macht jeder mal). Also einfach die generierten Einstellungen mit dem Datenblatt vergleichen. Ralf
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel
