Forum: Mikrocontroller und Digitale Elektronik PIC 10F206 Speicherplatz?


von Thomas (Gast)


Lesenswert?

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

von Uwe N. (ulegan)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

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

von Dieter W. (dds5)


Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.