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
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
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)
>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?
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
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
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
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
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
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
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.
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