Habe folgendes Programm zum Empfangen von mehreren aneinander hängenden ASCII-Zeichen für den PIC geschrieben. Es ist zur Zeit nur ziemlich einfach und ohne diverse extras, jedoch kann zum beispiel der name mittels hyperterminal übertragen werden. Sollte der Name oder eben die Zeichenfolge länger als ungefähr zehn Bytes sein werden falsche Bytes empfangen. Der Fehler ist jedoch nicht immer an der gleichen Stelle darum weis ich jetzt nicht mehr weiter. Hier mal das Hauptprogramm, da ich nicht denke dass es an der init liegt: main btfss PIR1,5 goto main loop1 movf RCREG,w movwf INDF incf FSR,f movf FSR,w sublw .50 btfsc STATUS,Z goto loop1 goto main Waron könnte der Fehler liegen????
keiner eine ahnung würd mich nämlich auch interessieren ..
Also woran liegt denn nun der Fehler ? Die Endlosschleife bis PIR1,5 (RCIF) gesetzt wird ist im Prinzip schon mal richtig. Das empfangene Byte (RCREG) wird über w nach INDF gespeichert. Auf welche Adresse wurde FSR denn initialisiert ? Durch das Lesen von RCREG wird PIR1,5 wieder auf 0 gesetzt. Mit incf FSR,f zeigt dieses auf die nächsthöhere Adresse. Auch gut. Aber was soll denn bitteschön dieser Code bewirken ? sublw .50 btfsc STATUS,Z goto loop1 goto main Vielleicht doch mal den vollständigen Code posten, das könnte positve Auswirkungen auf eine brauchbare Lösung haben.
@ Dieter Werner "Aber was soll denn bitteschön dieser Code bewirken ? sublw .50 btfsc STATUS,Z goto loop1 goto main" Mit diesem Teil wir die Anzahl der auf einmal zu empfangenden Bytes festgelegt. Hier ist der komplette Code (nur mal eine erste Version ohne GLiederung,etc.) #include <p16f88.inc> MOVLW 0x51 ;initialize pointer MOVWF FSR ;to RAM init movlw b'00000000' ; all ports low movwf PORTA movlw b'00000000' ; all ports low movwf PORTB bsf STATUS,RP0 ; switch to bank 1 movlw b'00000000' movwf TRISA movlw b'00000100' movwf TRISB bcf STATUS,RP0 ; switch to bank 0 banksel SPBRG ; switch to the bank of SPBRG movlw .25 movwf SPBRG ; set baudrate to 9600 banksel TXSTA bsf TXSTA,2 ; set BRGH for High Speed Baud rate bcf TXSTA,4 ; enable asynchronous serial port banksel RCSTA bsf RCSTA,7 ; enable asynchronous serial port bsf RCSTA,4 ; enable reception banksel PORTA main bcf STATUS,RP0 ; switch to bank 0 NOP btfss PIR1,5 ; bit test file skip if something is send goto main loop1 NOP NOP movf RCREG,w ; mov data to working movwf INDF ; mov working to EMPFANG incf FSR,f movf FSR,w ; move EMPFANG to working sublw .50 ; subtartc EMPFANG -E btfsc STATUS,Z goto loop1 goto main ; go to main end
> movf FSR,w > sublw .50 > btfsc STATUS,Z > goto loop1 > goto main >Mit diesem Teil wird die Anzahl der auf einmal zu empfangenden Bytes festgelegt. Ähem, das wage ich zu bezweifeln. Die Funktion dieses Programmstücks ist nichts anderes, als bei FSR = 50 die loop1 so oft zu wiederholen bis FSR <> 50 ist, und das ist genau einmal. Als Effekt würde nur das Datenbyte von Adresse 50 nochmal auf 51 geschrieben. SPBRG = 25 passt für 4MHz Takt, es sollte aber auf jeden Fall ein Quarz(oszillator) verwendet werden sonst kann das Timing zu stark abweichen. Wenn der PIC später mal noch andere Sachen erledigen soll, benutzt man besser einen Interrupt um das Byte im Speicher abzulegen (zählt aber dann schon zu den fortgeschrittenen Programmiertechniken). Ein echter Tip in Bezug auf die Fehlfunktion war aus dem Code nicht zu gewinnen, sieht soweit fürs erste brauchbar aus. Viel Erfolg beim weiteren Programmieren.
Hallo Nur ein Hinweis: Für den PIC gibt es auch günstige C-Compiler. Abgesehen davon, dass man die Internals des PIC ein wenig besser kennen lernt erscheint mir nur die Codegrösse und Geschwindigkeit ein Vorteil. Leztere beide sind aber in vielen Fällen nicht relevant und manche Compiler sind in der Umsetzung auch recht effizient. Letztlich kann man seinen Code (je nach Programmierstil) auch besser portieren und man gelangt schneller ans Ziel. Für die RS232 gibt es bereits eine Menge fertige Libraries. Wenn du nicht Asm musst, dann würde ich heutzutage eher C empfehlen. Freundliche Grüsse Geri
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.