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 nochmal, ich bräuchte nur einen Codeschnipsel für den Zähler und den UART. Vielen Dank schon mal für Hilfen. 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
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.