Hallo, ich habe hier gerade in kleines Problem... ich möchte daten einlesen und speichern, damit ich die später wieder ausgeben kann. Nur leider ist das Datenwort so lang, dass ich dafür 12Bytes belegen muss... Ich bekomme das aber nicht hin. Schaff es nur mittels Pointer 8Byte einzulesen und die dann auszugeben. Der Pointer fängt bei mir bei 0x08 an und erhöt sich nach jedem einlesevorgang danach setze ich FSr wieder auf 0x08 und beginne die Bytes auszugeben. sobald ich aber das 9. mal Incrementiere, gibt der ausgang lauter 0en aus. mein code sieht so aus, MOVLW 0x08 MOVWF FSR Call Einlesen INCF FSR,.1 Call Einlesen INCF FSR,.1 Call Einlesen INCF FSR,.1 Call Einlesen INCF FSR,.1 Call Einlesen INCF FSR,.1 Call Einlesen INCF FSR,.1 Call Einlesen INCF FSR,.1 Call Einlesen ; INCF FSR,.1 ; Call Einlesen MOVLW 0x08 MOVWF FSR CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 INCF FSR,.1 CALL Ausgabe_0 ; INCF FSR,.1 ; CALL Ausgabe_0 ... ... Einlesen MOVLW .8 MOVWF marke1 Einlesen_1 BTFSC Input GOTO lesen_1 BTFSS Input GOTO lesen_0 GOTO Einlesen lesen_1 BCF STATUS,0 RLF INDF,.1 MOVFW INDF XORLW b'00000001' MOVWF INDF CALL WAIT DECFSZ marke1,.1 GOTO Einlesen_1 retlw .0 lesen_0 BCF STATUS,0 RLF INDF,.1 MOVFW INDF XORLW b'00000000' MOVWF INDF CALL WAIT DECFSZ marke1,.1 GOTO Einlesen_1 RETLW .0 ... ... Ausgabe_0 MOVFW INDF MOVWF Ausgabe MOVLW 0x08 MOVWF marke2 BCF STATUS,0 Ausgabe_1 RLF Ausgabe,.1 BTFSC STATUS,0 BSF Output_1 BTFSS STATUS,0 BCF Output_1 call WAIT DECFSZ marke2,.1 GOTO Ausgabe_1 retlw .0 ich kann mir vorstellen, dass der Speicher bei dem PIC begrenzt ist, aber welche möglichkeiten habe ich noch Bytes abzuspeichern? Würde mich über eine Antwort sehr freuen, da ich sonst nicht weiter komme :( Gruß Thomas
Du hast ganze 24 Byte Ram zur Verfügung. Von Adresse 8 bis 31, also eigentlich genug Platz für 9 Byte. Wo liegen denn die Variablen marke1, marke2 und Ausgabe? Überschneiden sich deren Adressen mit deinem Puffer? Gruß Uwe
meine variablen habe ich so definiert: cblock 0x10 loops loops2 marke1 marke2 Ausgabe endc #define Output_2 GPIO,2 #define Input GPIO,1 #define Output_1 GPIO,0
Thomas wrote: > meine variablen habe ich so definiert: > > cblock 0x10 Naja, dann ist der Fehler doch schon ziemlich gut erkennbar: Der String beginnt bei 0x08 und der cblock bei 0x10. Dazwischen ist genau 8 Byte Platz, wenn der String länger wird (12 Byte) überlappt er sich mit dem cblock und du liest die (auf 0 runtergezählten) Schleifenzähler. Leg mal den cblock auf 0x14, dann sollte das Programm laufen.
ah ok stimmt, Ich hab es jetzt so gemacht, kann es da irgendwelche probleme geben? kann man die variablen auch bei 0x00 anfangen lassen? habe mal gelesen, dass man 0x00 nicht verändern soll/ darf. Wo darf man anfragen Variablen zu schreiben? loops equ 0x10 loops2 equ 0x11 marke1 equ 0x12 marke2 equ 0x13 Ausgabe equ 0x14 ... ... MOVLW 0x15 MOVWF FSR ... ... Hier ist es so, dass ich ja nur 11 Bytes zu verfügung habe, weil man nur bis 0x1F schreiben kann. okok, wer lesen kann ist klar im vorteil... man darf ab adresse 0x08 anfangen zu schreiben. Mal sehen ob ich das hin bekomme. Vielen dank schonmal für die Hilfe!
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.