Hallo,
ich steh Heut mal wieder völlig auf'm Schlauch,
peils nicht mit dem Pseudo-Befehl DA
Sprut erklärt das so:
DA   Ablage von 14-Bit-Zahlen/Text im Programmspeicher
Syntax:   DA <string>
DA <zahlenwert>
Beschreibung   Der DA-Befehl erzeugt 14-Bit Zahlen, und fügt sie an der 
aktuellen Stelle im Programmcode ein. Er ist vor allem zur Speicherung 
von Text gedacht. Wird der DA-Befehl von einem String gefolgt, so werden 
immer 2 Zeichen des Strings in den 7-Bit ASCII-Code gewandelt, und zu 
einer 14-Bit-Zahl zusammengefasst. Wird der DA-Befehl dagegen von einem 
Zahlenwert gefolgt, so wird dieser 14-bittig im Programmspeicher 
abgelegt. Was die Originalzahl größer als 14 Bit, so wird sie 
abgeschnitten.
Beispiel:
DA  "abcdef"  ; erzeugter Code: 0x30E2 0x31E4 0x32E6 0x3380
Kann das Beispiel schon mal nicht nachvollziehen :´(
sehe keinen Zusammenhang mit dem ASCII-Code ???
Mir ist auch nicht klar wie ich dann damit im Programm arbeite bzw. wie 
bekomme ich diese Werte ins W-Register
Kann das einer mal für Dummys erklären Bitte :)
mfg
Manfred 
   
  
  
 
      
      
  
  
  
   
  
  
      Manfred John schrieb:
> DA  "abcdef"  ; erzeugter Code: 0x30E2 0x31E4 0x32E6 0x3380
 1  | 0x30E2 = 0b11000011100010
  |  2  |            1100001         = 0x61 = a
  |  3  |                   1100010  = 0x62 = b
  |  
  
   
  
  
 
      
      
  
  
  
   
  
  
      Manfred John schrieb:
> Mir ist auch nicht klar wie ich dann damit im Programm arbeite bzw. wie
> bekomme ich diese Werte ins W-Register
Bei alten PIC16 konnte man nur über ein angesprungenes RETLW Daten aus 
dem ROM laden, da geht das nicht. Neuere PIC16 haben Steuerregister 
dafür. 
   
  
  
 
      
      
  
  
  
   
  
  
      A. K. schrieb:
> 0x30E2 = 0b11000011100010
>            1100001         = 0x61 = a
>                   1100010  = 0x62 = b
Autsch, hat ich selber sehen müssen (na ja hab höllisch Kopfschmerzen)
A. K. schrieb:
> Bei alten PIC16 konnte man nur über ein angesprungenes RETLW Daten aus
> dem ROM laden, da geht das nicht. Neuere PIC16 haben Steuerregister
> dafür.
ka ob das mein 16F727 kann, nach welchen Steuerregistern muss ich denn 
da Ausschau halten?
EDIT:
Ich kann nichts finden mit dem das "Auslesen" beim 16F727 möglich wäre.
Leider kenn ich auch nicht die Technik mit der das bei Pic's die diese 
Möglichkeit bieten funktioniert! 
   
  
  
 
      
      
  
  
  
   
  
  
      Hier mal ein Auszug aus einer Routine für den 16F mit der ich Strings 
ausgebe, Achtung, für die Routine darf der Text keine 256Byte Grenze 
überschreiten.
Vielleicht hilft es dir ja.
 1  | MSG:   addwf PCL ,F 
  |  2  |         dt "Testtring",0
  |  3  | 
  |  4  | 
  |  5  | ; NUllterminierten String ausgeben (evtl. 256 Byte Grenze beachten !)
  |  6  | LCD_WrtTXT:   
  |  7  |   MOVLW   0
  |  8  | LCD_WrtTXT_lp:   
  |  9  |   MOVWF   LCD_TXTPTR     ; aktuelle Stringposition
  |  10  |   CALL   MSG         ; <-- hier wird das Zeichen geholt
  |  11  |   ANDLW   0x0FF          ; Ende der Nachricht wenn NULL
  |  12  |   BTFSC   STATUS, Z
  |  13  |   GOTO   LCD_WrtTXT_END             
  |  14  |   call  OutLcdDaten    ; Zeichen ausgeben
  |  15  |   MOVF   LCD_TXTPTR,W
  |  16  |   ADDLW   1             ; und das nächste Zeichen
  |  17  |   GOTO   LCD_WrtTXT_lp
  |  18  | LCD_WrtTXT_END:
  |  
 
Holger 
   
  
  
 
      
      
  
  
  
   
  
  
      Manfred John schrieb:
> Ich kann nichts finden mit dem das "Auslesen" beim 16F727 möglich wäre.
Beispiel: PIC16LF1904: PMDATL/H PMADRL/H.
Bei 727 geht das möglicherweise nicht in der 7/7 Variante. 
   
  
  
 
      
      
  
  
  
   
  
  
      Holger W. schrieb:
> Hier mal ein Auszug aus einer Routine für den 16F mit der ich Strings
> ausgebe, Achtung, für die Routine darf der Text keine 256Byte Grenze
> überschreiten.
Das ist allerdings die klassische Variante mit Strings in 1x8 Bit pro 14 
Bit via RETLW. 
   
  
  
 
      
      
  
  
  
   
  
  
      A. K. schrieb:
> Beispiel: PIC16LF1904: PMDATL/H PMADRL/H.
>
> Bei 727 geht das möglicherweise nicht in der 7/7 Variante.
Nein der hat das leider nich muss mich ich halt mit RETLW zufrieden 
geben :)
@Holger W.
Danke fürs Beispiel, so in etwa hatte ich das vor.
Danke euch
mfg
Manfred 
   
  
  
 
      
      
  
  
  
   
  
  
      Manfred John schrieb:
> ka ob das mein 16F727 kann, nach welchen Steuerregistern muss ich denn
> da Ausschau halten?
>
> EDIT:
> Ich kann nichts finden mit dem das "Auslesen" beim 16F727 möglich wäre.
> Leider kenn ich auch nicht die Technik mit der das bei Pic's die diese
> Möglichkeit bieten funktioniert!
Also lt. Datenblatt kann der PIC16F727 im Betrieb seinen Flash-Speicher 
auslesen.
Kapitel 18: PROGRAM MEMORY READ
Gruß
John 
   
  
  
 
      
      
  
  
  
   
  
  
      John Bauer schrieb:
> Also lt. Datenblatt kann der PIC16F727 im Betrieb seinen Flash-Speicher
> auslesen.
>
> Kapitel 18: PROGRAM MEMORY READ
Danke!
hät ich nicht mehr da nach gesucht. (ka wie so ich da nix gefunden 
hatte)
Wenn auch a biserl umständlich für ASCII und ich nich wirklich 
Platzmangel habe, werd ich's damit machen.
Immerhin sind die Daten dann schön "aufgeräumt" und ich spar mir das 
aufpassen auf die 0xFF grenzen :)
Bin mir nur noch nicht ganz klar wie ich mir die Einsprungadressen 
"merke"
Ist es möglich die oberen Bits des PC auszulesen o. den Stack um sowas 
in der Art zu realisieren:
______________________________________
Pagesel
Call LABEL1
Pagesel
Call LABEL2
.
.
LABEL2
gemerkter PC + x
loop
programm-mem auslesen
.
.
LABEL1
PC auslesen
Return
DA "abcdef",0
_____________________________________
Sind die Adressen von Labels eventuell auch noch einfacher verwerten?
oder bin ich da völlig auf dem Holzweg :-/
mfg
Manfred 
   
  
  
 
      
      
  
  
  
   
  
  
      Hallo Manfred,
hier ist mal ein Beispiel das ich mal für den PIC16F74 programmiert 
habe.
Die Variable "Text" muss in Bank2 oder in den Bereich, der in Bank2 
gespiegelt wird.
Gruß
John
 1  | ;###### Macros ######
  |  2  | 
  |  3  | Print macro Text_Label
  |  4  |    banksel PMADRH          ; Bank 2
  |  5  |    movlw   high Text_Label ; high-Adresse von Text (Program Memory)
  |  6  |    movwf   PMADRH
  |  7  |    movlw   low Text_Lebel  ; low-Adresse von Text (Program Memory)
  |  8  |    movwf   PMADR
  |  9  |    call    LCD_Text
  |  10  |    endm
  |  11  | 
  |  12  | Print_P macro Displ_pos, Text_Label
  |  13  |    Set_Cu  Displ_pos
  |  14  |    banksel PMADRH          ; Bank 2
  |  15  |    movlw   high Text_Label ; high-Adresse von Text (Program Memory)
  |  16  |    movwf   PMADRH
  |  17  |    movlw   low Text_Label  ; low-Adresse von Text (Program Memory)
  |  18  |    movwf   PMADR
  |  19  |    call    LCD_Text
  |  20  |    endm
  |  21  | 
  |  22  | Set_Cu macro Cursor_pos    ; Cursorposition setzten (Hex-Adresse von LCD)
  |  23  |    movlw   Cursor_pos
  |  24  |    iorlw   0x80
  |  25  |    call    LCD_C
  |  26  |    endm
  |  27  | 
  |  28  | 
  |  29  | ;###### Aufruf im Programm ######
  |  30  | 
  |  31  |    Set_Cu  0x02            ; Cursorposition setzen (Hex-Adresse von LCD)
  |  32  |    Print   Text_1          ; Text 1 ab Cursorposition ausgeben
  |  33  |    Print_P 0x16, Text2     ; Text 2 ab Position 0x16 ausgeben
  |  34  |    banksel ...             ; Print und Set_Cu ändern die Speicherbank -> danach
  |  35  |                            ; auf die, für den weiteren Programmablauf erforderliche
  |  36  |                            ; Bank, umschalten
  |  37  | 
  |  38  | ;###### Unterprogramme ######
  |  39  | 
  |  40  | LCD_Text  
  |  41  |    banksel PMCON1          ; Bank 3
  |  42  |    bsf     PMCON1, RD      ; lesen starten
  |  43  |    nop
  |  44  |    nop
  |  45  |    banksel PMDATH          ; Bank 2
  |  46  |    movfw   PMDATH          ; 6 Bit von high-byte in Text
  |  47  |    movwf   Text
  |  48  |    rlf     PMDATA, W       ; Bit 7 von low-byte in Carry
  |  49  |    rlf     Text, F         ; Bit 7 in Text als Bit 0
  |  50  |    movf    Text, W
  |  51  |    btfsc   STATUS, Z       ; ist Zeichen 'Null'?
  |  52  |    goto    Text_End        ;  - ja
  |  53  |    call    LCD_D           ;  - nein: Zeichen ausgeben
  |  54  |    banksel PMDATA          ; Bank 2
  |  55  |    movfw   PMDATA          ; 2. Zeichen laden
  |  56  |    andlw   0x7F            ; nur untere 7bit
  |  57  |    btfsc   STATUS, Z       ; ist Zeichen 'Null'?
  |  58  |    goto    Text_End        ;  - ja
  |  59  |    call    LCD_D           ;  - nein: Zeichen ausgeben
  |  60  |    banksel PMADR           ; Bank 2
  |  61  |    incf    PMADR, F        ; low-Byte um 1 erhöhen (Flash-Adresse +1)
  |  62  |    btfsc   STATUS, Z       ; Überlauf?
  |  63  |    incf    PMADRH, F       ;  - ja: high-Byte um 1 erhöhen
  |  64  |    goto    LCD_Text
  |  65  | Text_End
  |  66  |    return
  |  67  | 
  |  68  | 
  |  69  | LCD_D                      ; Unterprogramm um ein Zeichen an
  |  70  |                            ; Cursorposition auszugeben (RS=1)
  |  71  | 
  |  72  | LCD_C                      ; Unterprogramm um einen Befehl an
  |  73  |                            ; LCD zu senden (RS=0)
  |  74  | 
  |  75  | 
  |  76  | Text_1   da   "Temperatur\x00"  ; "Temperatur"
  |  77  | Text_2   da   "\x01C\x00"       ; "°C" (Benutzer def. Zeichen "°" in Adr. 0x01 von LCD)
  |  78  | Text_3   da   "          \x00"  ; Leerzeichen um einen Bereich vom LCD zu löschen
  |  79  | 
  |  80  |    END                     ; directive 'end of program'
  |  
  
   
  
  
 
      
      
  
  
  
   
  
  
      John Bauer schrieb:
> Hallo Manfred,
> hier ist mal ein Beispiel das ich mal für den PIC16F74 programmiert
> habe.
Ein wirklich sehr beeindruckendes Beispiel, wie kompliziert doch die 
PIC-Programmierung in Assembler ist.
Im Gegensatz dazu sieht die gleiche Aufgabe für den 8051 erheblich 
einfacher aus: 1  | ;       Demo: Textausgabe aus dem Flash des 8051
  |  2  | ;       ========================================
  |  3  | ;
  |  4  | main:
  |  5  |         mov     dptr, #text1            ; lade Datenpointer mit Textadresse
  |  6  |         call    lcd_text                ; Aufruf Ausgabefunktion
  |  7  | 
  |  8  |         mov     dptr, #text2            ; lade Datenpointer mit Textadresse
  |  9  |         call    lcd_text                ; Aufruf Ausgabefunktion
  |  10  | 
  |  11  |         jmp     $                       ; Endlos-Schleife
  |  12  | ;--------------------------------------------------------------------------
  |  13  | text1:
  |  14  |         db      'Hallo Welt'
  |  15  |         db      0                       ; 0 = Endezeichen
  |  16  | text2:
  |  17  |         db      'Text zwei'
  |  18  |         db      0                       ; 0 = Endezeichen
  |  19  | ;--------------------------------------------------------------------------
  |  20  | ;       UP: Ausgabe des Textes im Flash, auf den DPTR zeigt
  |  21  | ;       ===================================================
  |  22  | ;
  |  23  | _lcdt1:
  |  24  |         call    lcd_data                ; Ausgabe eines Bytes ans LCD
  |  25  |         inc     dptr                    ; zeige auf naechstes Byte
  |  26  | lcd_text:
  |  27  |         clr     a                       ; kein Offest
  |  28  |         movc    a, @a+dptr              ; lese Byte aus Flash
  |  29  |         jnz     _lcdt1                  ; ungleich 0 -> Anzeigen
  |  30  |         ret                             ;   gleich 0 -> return
  |  31  | ;--------------------------------------------------------------------------
  |  32  | lcd_data:                               ; hier LCD Ausgabe einfuegen
  |  33  |         ret
  |  34  | ;--------------------------------------------------------------------------
  |  
 
LCD_Text: statt 25 Instruktionen nur 6.
Nicht persönlich nehmen, aber ich bin doch schon sehr froh, daß ich 
keinen PIC programmieren muß.
Peter 
   
  
  
 
      
      
  
  
  
   
  
  
      Danke John,
auf die Idee, das mit einem Macro zu lösen wäre ich glaube nicht so 
schnell gekommen.
Mir ist nur nicht klar wie "movlw   high Text_Labe" funktioniert!
movlw mit 2 Operanden?????
g
Manfred 
   
  
  
 
      
      
  
  
  
   
  
  
      Peter Dannegger schrieb:
> Ein wirklich sehr beeindruckendes Beispiel, wie kompliziert doch die
> PIC-Programmierung in Assembler ist.
>
> Im Gegensatz dazu sieht die gleiche Aufgabe für den 8051 erheblich
> einfacher aus:
wayne 
   
  
  
 
      
      
  
  
  
   
  
  
      Manfred John schrieb:
> Mir ist nur nicht klar wie "movlw   high Text_Labe" funktioniert!
> movlw mit 2 Operanden?????
 1  | Text_1   da   "Temperatur\x00"
  |  
 
Das Label 'Text_1' beinhaltet die Adresse des ersten Zeichen des Strings 
im Flash.
 1  | movlw   high Text_Label
  |  2  | movlw   low Text_Lebel
  |  
 
Das 'high' und das 'low' sind Assembler Direktiven. Beim Kompilieren 
wird das entsprechende low- bzw. high-Byte des Labels eingesetzt.
Um Daten aus dem Flash auszulesen, muss man in PMADRH das high-Byte, und 
in PMADRL das low-Byte der zu lesenden Adresse schreiben.
(Achtung: die Registernamen der Controller sind nicht gleich. In meinem 
Code vom PIC16F74: PMADR ist beim PIC16F727: PMADRL)
Peter Dannegger schrieb:
> die  PIC-Programmierung in Assembler
Immer diese Verallgemeinerungen. 
   
  
  
 
      
      
  
  
  
   
  
  
      John Bauer schrieb:
> Das 'high' und das 'low' sind Assembler Direktiven.
Die hab ich wohl etwas vernachlässigt :)
Mal schauen was ich da noch alles für interessante Möglichkeiten 
übersehen habe.
Dank und Gruß
Manfred 
   
  
  
 
    
    
        
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
 
   
 
   
  
    
    
 
   |