PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Protokoll mit PIC aufzeichen und in Ram speichern



Pitt1986
03.11.2005, 14:49
hi leute,

ich versuch gerade ein protokoll zwischen meinem pc und einem kleinen gerät rauszufinden.
Das Gerät ist am lpt-port angeschlossen.
Eigentlich ist es ganz leicht, weil der computer an das gerät nichts sendet, sondern nur das gerät an den computer und zwar nur mit einer datenleitung bzw. nur an einem pin des lpt.
zwischen meinem pc und dem gerät hängt mein pic, der alles aufzeichen soll, aber irgendwie stimmt da was nicht.

die software zu dem gerät aufm pc liesst die daten die vom dem gerät gesendet wurden und überprüft ob diese richtig gesendet wurden.
jetzt hängt mein pic dazwischen und alles was von dem gerät reinkommt am RC5 gibt er am RD5 wieder zum pc aus. es wird alles richtig übertragen.

jetzt sollte der pic die daten, die in der ram gespeichert wurden nochmal an den pc übertragen, aber jetzt sind die daten die am pc ankommen nicht mehr vollständig bzw. total falsch.

woran kann das liegen. der code ist eigentlich ziemlich einfach aufgebaut

der pic soll nichts anderes machen als die zustände vom gerät annehmen und dann speichern und dann einfach zum pc weiterleiten.
also das annehmen der zustände und weiterleiten funktioniert sicher, weil die daten am pc richtig ankommen.
aber ob der pic diese zustände in der ram richtig ablegt, dass weiss ich nicht.

dann soll der pic die gespeicherten zustände aus der ram an den pc senden.

also ich weiss jetzt nicht ob der pic die zustände nicht speichert oder ob die zustände richtig gespeichert werden aber falsch gesendet werden.





.
.
.
movlw D'48'
movwf cablep6
movwf cablenp6
movlw D'1'
movwf count
movwf multicount
lfsr FSR0,0x70

main
btfss PORTC,5 ; TESTE LEITUNG OB AUS
movlw D'48'
btfsc PORTC,5 ; TESTE LEITUNG OB AUS
movlw D'49'
movwf cablenp6 ; SPEICHERE ZUSTAND
xorwf cablep6,0 ; ÜBERPRÜFE ZUSTAND MIT ALTEM ZUSTAND
btfss STATUS,Z
call savepc6

btfsc PORTB,2 ; WENN GEDRÜCKT DANN DIE DATEN VOM RAM AN PC SENDEN
call sendpcstart
goto main
;################################################# #####
;################################################# #####
;################################################# #####
;################################################# #####
;savecablepc6 ZUSTÄNDE VOM GERÄT IN RAM SPEICHERN UND ZUM PC WEITERLEITEN
savepc6
movf cablenp6,0 ; ZUSTAND IN CPU
movwf cablep6
movwf POSTINC0 ; ZUSTAND IM RAM SPEICHERN
btfss cablep6,0
bcf PORTD,5 ; LEITUNG ZUM PC AUF LOW SETZEN
btfsc cablep6,0
bsf PORTD,5 ; LEITUNG ZUM PC AUF HIGH SETZEN
bcf STATUS,Z
incf count,1 ; ZUSTÄNDE ZÄHLEN
btfsc STATUS,Z ; FALLS ÜBERLAUF
incf multicount,1 ; ERHÖHEN
return
;################################################# #####
;################################################# #####
;################################################# #####
;################################################# #####
sendpcstart ; GESPEICHERTE ZUSTÄNDE VOM RAM ZUM PC LEITEN
movf count,0
movwf oldcount
movf multicount,0
movwf oldmulti
lfsr FSR0,0x70
sendpcc
btfss INDF0,0
bcf PORTD,5
btfsc POSTINC0,0
bsf PORTD,5
movlw .60
movwf loops
warte
nop
nop
nop
nop
nop
nop
nop
nop
decfsz loops,1
goto warte
decfsz count,1
goto sendpcc
decfsz multicount,1
goto setcount

movf oldcount,0
movwf count
movf oldmulti,0
movwf multicount
return

setcount
movlw D'255'
movwf count
goto sendpcc




wäre sehr dankbar für hilfreiche antworten

mfg
pitt

PICture
03.11.2005, 18:42
der pic soll nichts anderes machen als die zustände vom gerät annehmen und dann speichern
Der PIC führt nur die im Programm enthaltene Befehle aus, sonst "weißt" er nicht, was er machen "soll". Ich sehe in Deinem Code die Speicherung überhaupt nicht. Deswegen speichert er gar nichts, oder?
MfG

stowoda
03.11.2005, 20:04
Hey Pitt1986!

Zeige uns doch bitte den kompletten Code und erläutere Deine Beschaltung.
Was ist das für ein "kleines Gerät" ??

Kannst Du irgendwelche Annahmen machen wie die Daten aussehen könnten die Du aufzeichen möchtest??
Werden sie synchron, asynchron übertragen??
Wie siehts aus mit der Größe der Daten??
Wie schnell ist die Übertragung??

Eine große Vereinfachung würde ein digitales Osziloskop darstellen, mit dessen Hilfe Du die Signale "sichtbar" machen könntest.

Wie PICture schon schrieb, kann ich auch nicht erkennen an welcher Stelle der PIC die Daten speichert.
Ich sehe da eine Variable: cablepc6, ist das dein reservierter Speicher für die Daten?
Dein Code ist sehr schlecht zu lesen, bist eher geizig mit den Kommentaren.. ;) Ich werde jetzt nicht spekulieren was dein Programm im Einzelnen bewirkt.. Deswegen wäre es nicht schelcht wenn Du uns Deinen Algorythmus erläutern könntest, vielleicht ist er fehlerhaft.
Ausserdem wäre es ratsam einen Interrupt zu verwenden um die daten auszulesen.

Gruß
lk

ps: achso, welchen PIC verwendest Du?

kalledom
09.12.2005, 20:02
Auf dieser Seite (http://www.domnick-elektronik.de/picasm.htm) findest Du PIC Assembler-Beispiele mit RS232 und Ringpuffern zur Ablage der empfangenen und zu sendenden Bytes. Und noch einiges mehr.

Andre_S
10.12.2005, 17:38
Hi Pitt,

habe mir jetzt nicht alles im Detail angeschaut oder in den Debugger rein genommen, (keine Lust den Kopf zu schreiben) aber ich hoffe jetzt mal das Deine Speicherfunktion zeitgleich wie die Ausgabe arbeitet.

Erstens was für einen Pic hast Du denn, Du speicherst ab 0x70 ( lfsr FSR0,0x70) die Daten, viele passen da nicht rein, dann ist Schluss mit aufzeichen, bei meinen 18F442 bei 0x2FF und bei vielen ist schon bei weniger Schluss.

Und wenn ich irgendwas geloggt habe habe ich auch "keine" Änderungen gespeichert, oder die Zeit wie lange das Signal angelegen hat, sonst macht man ja aus "10001101" -> "10101"
und das sieht mir hier so aus

movwf cablenp6 ; SPEICHERE ZUSTAND
xorwf cablep6,0 ; ÜBERPRÜFE ZUSTAND MIT ALTEM ZUSTAND
btfss STATUS,Z
call savepc6

Ok, aber habe es jetzt auf die schnelle nur überflogen, also Sorry falls ich was übersehen habe...

Gruß André