Hallo Zusammen, bin komplett neu hier und mache gerade meine erstne ERfahrungen mit dem Assembler Programmieren. HAb mir auch schon Lektüre gekauft usw. Muss jetzt einen Vortrag über die Serielle Übertragung halten und ein Progrämmchen schreiben. Das erste Hinderniss ist welche Schnittstelle es ist S0 oder S1 und welchen Modus sie unterstützt. Weiß das Jemand? Ich habe ein Microcontrollerboard mit UART, ADC´s LED´s Display usw. und Programmieren tu ich das über Flip bzw. KEIL. Kann mir evtl. JEmand weiterhelfen der sich auskennt? Steh irgendwie komplett im Wald :-) Wäre echt spitze. Wäre auch dankbar wenn ich tipps bekomme auf was ich beim PRogrammeiren achten soll. Das PRogramm soll evtl erstmal nur Senden und wenn es möglich ist über ein Terminal am PC was ausgeben oder dergleichen. Danke schonmal im Vorraus.
> Das erste Hinderniss ist welche Schnittstelle es ist S0 oder S1 und > welchen Modus sie unterstützt. Der AT89C5131 ist im Kern ein Standard-8051 und hat (zumindest nach meinem Datenblatt) nur eine serielle Schnittstelle (UART). Weiterhin gibt es noch serielle Busse I2C un SPI. Die Datenübertragung erfolgt Zeichenweise über das Register SBUF. Wenn ein Zeichen empfangen wurde, setzt der UART das Flag RI (Receive Interrupt, kann aber auch einfach per Polling jb RI, Zeiche_Abholen bedient werden) Das Sende-Flag TI zeigt an, dass das vorige Zeichen vollständig versendet wurde. Man kann das Flag auf 2 Arten nutzen: - Zeichen senden, warten bis TI=1, TI löschen - warten bis TI=1, Zeichen senden, TI löschen Der Unterschied ist, dass man im 2. Fall weiterarbeiten kann und nicht auf das Zeichen warten muss (das dauert ja einige ms). Dabei muss aber bei der Initialisierung darauf geachtet werden, dass man TI auf 1 setzt, sonst hängt das Programm beim ersten senden. Fehlt nur noch die Initialisierung im Register SCON und die Baudratenerzeugung. Serielle Betriebsarten sind eigentlich nur 2 interessant. Mode 1 (8 Bit UART) und Mode 3 (9 Bit UART, nutzbar für Parity). Die Modi 0 und 2 sind Synchrone Schnittstellen, die (fast) niemand mehr braucht. Die Baudrate kann beim 89C5131 der Timer 1, Timer 2 oder der Baudratengenerator erzeugen. Der BRG kann eh nix anderes, also nimmt man den, wenn vorhanden. Initialisierung für 12 MHz-Quarz, 4800 Baud, mit Timer 1:
1 | orl PCON,#10000000b ;Bit SMOD1=1 bei 4800 Baud |
2 | mov TH1,#243 ;Reloadwert ins Timer-HByte |
3 | mov TL1,#243 ;Anfangswert Timer |
4 | anl TMOD,#00001111b ;8-Bit-Timer1 mit Reload |
5 | orl TMOD,#00100000b ; |
6 | setb TR1 ;Start Timer1 |
7 | mov SCON,#01010010b ;8-Bit-UART, Empfang zulassen, TI setzen |
8 | clr ES ;kein serieller Interrupt |
9 | clr ET1 ;kein Timer-Interupt |
Initialisierung mit Baudratengenerator für 9600 Baud, 12MHz:
1 | orl PCON,#10000000b ;SMOD1=1 bei 9600 Baud |
2 | mov BDRCON,#00011111b ;int. Baudraten-Generator für Senden und Empfangen, SPD=1 |
3 | mov BRL,#217 ;Reloadwert für int. Baudratengenerator |
4 | mov SCON,#01010010b ;8-Bit-UART, Empfang zulassen, TI gesetzt |
5 | clr ES ;kein serieller Interrupt |
Programmteil Zeichen_Senden:
1 | jnb TI,weiter ;ist Schnittstelle frei? |
2 | mov SBUF,#41h ;Ascii „A“ ausgeben |
3 | ; oder mov SBUF,#'A' |
4 | clr TI ;Flag löschen, Schnittstelle belegt |
5 | weiter: |
Programmteil Zeichen_empfangen:
1 | jnb RI,weiter ;Sprung wenn kein Zeichen empfangen |
2 | mov a,SBUF ;Zeichen abholen |
3 | clr RI ;Empfangsflag löschen |
4 | weiter: ;weiter im Programm |
Für die Berechnung der Baudrate (Formeln siehe Datenblatt oder Lehrbuch) muss man beim int.Baudratengenerator beachten, das nicht der Maschinentakt (FOsz/12 bzw. FOsz/6 bei X2-Mode) sondern der Peripherietakt FPER= FOsz/2 einzusetzen ist. Mit 12MHz-Quarz ist bei 38400 Baud schluss, mit 11.0592MHz geht es bis 115.200 Baud. tschuessle B.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.