Forum: Mikrocontroller und Digitale Elektronik Software für Datenstring senden über UART beim PIC 16F627


von Bernhard Weiß (Gast)


Lesenswert?

Hallo,

vorweg mal: Ich bin Student und muß am Montag eine kleine Software für 
den PIC 16F627A bei meinen Dozenten abgeben. Nun hatte ich 3 Wochen 
dafür Zeit.
Jedoch kam ich bis heute (aus diversen Gründen ;-) nicht dazu, mich in 
MPLAB und Assembler von den PICs einzuarbeiten. Wer schreibt mir also 
schnell eine kleine Software (zumindest Auszug, die Initialisierung und 
Konfiguartion schaffe ich noch selber) für folgendes Problem.

Es soll ein DatenString über den UART mit 4800 Baud gesendet werden, der 
sich wie folgt zusammensetzt:

# 1 A2 A1 1 2 3 4 5 CS CR


Dabei sollen alles Zeichen als ASCII Zeichen gesendet werden.
Erklärung der Zeichen:

#  :  Startzeichen des Telegrams
1  :  Konstante
A2 :  Adresse 2 (geht von 40h bis 47h)
A1 :  Adresse 1 (geht von 40h bis 5Fh)
1  :  Konstante
2  :  Konstante
3  :  Konstante
4  :  Konstante
5  :  Konstante
CS :  Checksumme (setzt sich aus XOR von der 1. Konstante bis zur 
letzten
      Konstante im Telegramm zusammen)
CR :  Carriage Return (Abschlusszeichen)

Dieses Telegramm soll nun alle 5ms über den UART mit 4800 Baud gesendet 
werden. (Das geht über einen Timer-Interrupt und Zähler)
Nun noch eine kleine Schwierigkeit: Die Adresse setzt sich aus A2 und A1 
zusammen, womit insgesamt 256 Adressen gesendet werden können (beginnend 
mit @@ (www.asciitable.com)) Es soll nun alle 5ms eine Adresse 
hochgezählt werden und das gleiche Telegramm gesendent werden. Nach der 
255. Adresse _G oder 47h 5Fh soll wieder bei Adresse @@ oder 40h 40h 
begonnen werden.
Das wäre dann aber alles.

Für einen versierten PIC Programmieren sollte das in 10 Minuten möglich 
sein. Ich wäre jedenfalls für Code-Ideen sehr dankbar, da mir derjenige 
dann echt aus der "Patsche" ;-) helfen würde. Ich hätte mich früher 
einarbeiten sollen, ich weiß aber Klausuren, Klausuren...
Bitte um Hilfe!!!
Vielen Dank schon mal für anregende Antworten.

Gruß
Berne

von Bernhard Weiß (Gast)


Lesenswert?

Hallo nochmal,

ich bräuchte nur einen Codeschnipsel für den Zähler und den UART.
Vielen Dank schon mal für Hilfen.

Gruß
Berne

von Franko P. (sgssn)


Lesenswert?

Hallo Berne

hab hier ien fertiges Programm (aber nicht deine Anwendung). Um bisschen 
Arbeit kommst aber nicht rum. Die UART-Schnittstelle wird mit 9600 Baud 
betrieben und der TIMER1 wird glaub ich verwendet.

Gerhard

von Franko P. (sgssn)


Angehängte Dateien:

Lesenswert?

tia, wo ist der Dateianhang ?

von Bernhard Weiß (Gast)


Lesenswert?

Hallo Gerhard,

vielen Dank für deine Hilfe. Werd mir das Programm mal ansehen und 
schauen, was sich rausziehen lässt.
Wenn noch jemand ein ähnliches Programm hat und hier zur Verfügung 
stellen würde, wäre ich sehr dankbar.

Gruß
Bernhard Weiß (Berne)

von Dieter Werner (Gast)


Lesenswert?

>Dieses Telegramm soll nun alle 5ms über den UART mit 4800 Baud gesendet
>werden. (Das geht über einen Timer-Interrupt und Zähler)

Irgendwie habe ich da ein Verständnisproblem.
Das Telegramm ist 11 Zeichen lang, ein Zeichen dauert bei 4800 baud ca. 
2ms; ein Telegramm also 22ms.
Wie soll man das alle 5ms senden können?

von Bernhard Weiß (Gast)


Lesenswert?

Hallo Werner,

in einer Sekunde 4800Baud heißt das ein Baud 208µs braucht. Du hast dich 
wahrscheinlich im Kopf um eine Zehnerpotenz verrechnet. Könntest du mir 
eventuell einen Codeschnipsel für den TimerInterrupt (ca. 5ms bei 8MHz) 
und wie ich dann in die Senderoutine springe geben?
Die Initialisierung für den UART bräcuhte ich auch noch.
Nicht dass ich mich nicht einarbeiten will, aber ich schreibe am Montag 
wieder mal eine Klausur, und da muß man einfach Prioritäten setzen. Wäre 
Dir für deine Hilfe sehr dankbar.

Gruß
Berne

von Franko P. (sgssn)


Lesenswert?

nö, der Dieter Werner hat schon richtig gerechnet, wenn man davon 
ausgeht, dass dein Datenstring 11 Zeichen umfasst. Ein Zeichen besteht 
in der Regel aus 1 Startbit, 8 Datenbit und 1 Stopbit = 10 Bit. 
10*11*208us = 22ms (genau sogar 22,9ms).

Gerhard

von Bernhard Weiß (Gast)


Lesenswert?

Hallo Gerhard,

danke für die Rechnung. Ich lasse das ganze dann auf 115200 Baud laufen, 
wenn das möglich ist.
Könnte mir dann mal jemand einen kurzen kommentierten ASM- Codeschnipsel 
für den Timer-Interrupt (und wie ich zur UART Senderoutine springe), 
sowie für den Adresszähler und die UART Initialisierungsroutine 
beschreiben.
Mit 115200 Baud sollten ja die 5ms ausreichen. Vielen Dank für die 
Hilfen.

Gruß
Berne

von Franko P. (sgssn)


Lesenswert?

Mann Bernhard, open your eyes !!! steht doch alles drin:

;Interupt:
  ORG     0x004             ; interrupt vector location
  movwf   w_temp            ; save off current W register contents
  movf  STATUS,w          ; move status register into W register
  movwf  status_temp       ; save off contents of STATUS register

; ISR code can go here or be located as a call subroutine elsewhere
  btfsc  PIR1, RCIF      ;Receive int
  call  Receive
  btfsc  PIR1, TMR1IF    ;Timer Überlauf
  call  T1ISR

  movf    status_temp,w     ; retrieve copy of STATUS register
  movwf  STATUS            ; restore pre-isr STATUS register contents
  swapf   w_temp,f
  swapf   w_temp,w          ; restore pre-isr W register contents
  retfie                    ; return from interrupt

Das ist die Interrupt Service routine. da steht doch schon dein Timer1 
-Interrupt: T1ISR

Die Senderoutine beschränkt sich auf das Senden von einem Zeichen. Das 
Zeichen, das gesendet wird, steht im Arbeitsregister W, die Routine 
heisst SendByte.

Gerhard



von Bernhard Weiß (Gast)


Lesenswert?

Hallo Gerhard,

vielen Dank für deine Hilfe. Nur noch die Frage: Was sind die W 
Register.
Ist das das Arbeitsregister? Und für was wird es verwendet?

Gruß Berne

von Franko P. (sgssn)


Lesenswert?

Das W-Register ist "das Arbeitsregister", so wie das A-register oder der 
Accumulator das bei den alten 8-Bit-Mikroprozessoren war. Über dieses 
W-Register werden Daten transportiert und Daten verändert (logisch, 
arithmetisch).

Schau dir vielleicht mal das an:

http://www.sprut.de/electronic/pic/grund/grund.htm

Vielleicht hilft dir das ein bisschen

Gerhard

von Dieter Werner (Gast)


Lesenswert?

Ich arbeite seit 3 Jahren mit PIC18F... Controllern, kann also für 16er 
leider keinen Code beitragen.

Nochmal zurück zur Geschwindigkeit, Du brauchst mindestens 38400 Bd um 
auf < 5ms zu kommen. Mit dem geplanten 8MHz Takt ist 38400 auf jeden 
Fall realisierbar, dazu muss SPBRG mit 12 dezimal geladen werden. Höhere 
Baudrate geht nicht, da sonst die Abweichung von der Sollfrequenz zu 
hoch wird (sollte auf jeden Fall < 2% sein).

Um 115200 Bd realisieren zu können ist ein sog. Baudratenquarz nötig, 
die Frequenz muss ein ganzzahliges Vielfaches von (Baudrate * 16) sein.
Da bieten sich 7,3728 MHz oder 11,0592 MHz an.

von Michael (Gast)


Lesenswert?

Hallo zusammen

Zum Thema Textstring hätte ich da auch nochmal eine kleine Frage, wenn 
ich die hier mal dazwischen fragen darf ?
Ich bin gerad dabei ganz simpel Textstrings über UART zum Terminal zu 
senden. Das klappt auch schon ganz gut. Nur ist es notwendig jeden 
Buchstaben einzelnt zu übertragen oder kann ich auch einen Textstring 
übertragen. Sprich ohne immer....

movlw (ASCII Zeichen)
movwf (TX register)

Vielen Dank für eure Hilfe.

Viele Grüße
Micha

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.