Forum: Mikrocontroller und Digitale Elektronik 8051 (SiLabs) und RS232 Problem


von awesome (Gast)


Lesenswert?

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 ?
1
$include (c8051f330.inc)                  ; Include register definition file.
2
3
4
5
;-----------------------------------------------------------------------------
6
; RESET and INTERRUPT VECTORS
7
;-----------------------------------------------------------------------------
8
9
            ; Reset Vector
10
            cseg AT 0
11
            ljmp Main                     ; Locate a jump to the start of
12
                                          ; code at the reset vector.
13
14
;-----------------------------------------------------------------------------
15
; CODE SEGMENT
16
;-----------------------------------------------------------------------------
17
18
19
Blink       segment  CODE
20
21
            rseg     Blink                ; Switch to this code segment.
22
            using    0                    ; Specify register bank for the
23
                                          ; following program code.
24
25
Main:
26
            ; Disable the WDT.
27
            anl   PCA0MD, #NOT(040h)      ; clear Watchdog Enable bit
28
29
            ; Enable the Port I/O Crossbar
30
            orl   P0SKIP, #0ffh            ; skip LED pin in crossbar
31
                                          ; assignments
32
            mov   XBR1, #40h              ; enable Crossbar
33
            orl   P1MDOUT, #0ffh           ; make LED pin output push-pull
34
            orl   P1MDIN, #00h            ; make LED pin input mode digital
35
            call init
36
           
37
            
38
            
39
mainloop:
40
            
41
            call char_in
42
            mov P1,A              
43
44
            jmp mainloop
45
46
char_in :
47
48
  jnb ri0,$
49
  mov a,sbuf0
50
  clr ri0
51
  ret
52
53
init:
54
  mov  tmod,#00100000b
55
  mov  th1,#0fdh
56
  mov  scon0,#01010000b
57
  setb  tr1
58
  ret
59
;-----------------------------------------------------------------------------
60
; End of file.
61
62
END

von Ralf (Gast)


Lesenswert?

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!

von Ralf (Gast)


Lesenswert?

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

von awesome (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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

von awesome (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

Ja, tu das. Hier der Link zum ConfigTool:

http://www.silabs.com/public/documents/software_doc/othersoftware/Microcontrollers/en/ConfigAndConfig2Install.exe

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

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.