- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 28

Thema: Bascom-Bytevariable in ein Register laden

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    This is not a register problem. I get this problem, if the name of the variable in the brackets {} is wrong.
    In your case, do you dimmed a variable with name valaue as shown in the error message, or is there a typing error of valaue instead of value
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    35
    Beiträge
    1.461
    HI!

    Hm. The variable I use is a byval-Variable of a function.
    It is just like that:

    Code:
    Function Laybus(byval Value As Byte)                        
    
       'Variable In Register Kopieren:
       $asm
       lds R32, {Value}
    
       CBI   PORTC, 3
       SBRC R1, 0
       SBI  PORTC, 3
    
    
    
       $end Asm
    
    
    End Function
    The error message (spelling-corrected... ):
    Error: 5 Line: 884 No more space for BIT [VALUE] , in File.....

    Isn't ist possible, that there is no farther space?

    VLG Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Hi,

    there is no register r32 (r0 to r31).

    You can not use the syntax

    lds r31, {value}

    for a function/sub parameter or local variable. The address of a parameter or local variable is not known at compile time, so no SRAM address can be generated for {value}. Only the addresses of global variables are known at compile time and can be used with this syntax.


    You can work with following way:

    loadadr value, X
    ld r24, X

    loadadr can get the address of parameter/locals from the soft-stack, where the addresses of parameters and local variables are stored at runtime
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    35
    Beiträge
    1.461
    AH!

    Yes thanks! Now it works!

    Thank you!

    best regards,
    Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    35
    Beiträge
    1.461
    Hi!

    I have one more question about that...

    How can I load a register (R16) to my Value-Variable?
    ld X, r16??
    I don't think...

    VLG Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Hallo Tobi,

    ich habe gerade eben gemerkt, dass ich da in einem Post auf Englisch geantwortet habe. Das ist wahrscheinlich passiert, als ich auch gleichzeitig das Forum auf http://www.mcselec.com/forum offen hatte in Kombination mit der englischen Fehlermeldung in Deinem Post. Ich bitte um Vergebung, falls sich da jemand daran gestört hat.

    Der Umkehrbefehl ist:

    st X, r16

    Wenn Du Dich etwas weiter in ASM-Programmierung vertiefen willst, empfehle ich Dir, die ASM-Befehlsbeschreibung von ATMEL http://www.atmel.com/dyn/resources/p...ts/DOC0856.PDF herunterzuladen und Dir mal die möglichen Befehle anzuschauen.
    Weiters ist in jedem Datenblatt zu den AVR ziemlich hinten eine Auflistung der Befehle, welche dieser Prozessor beherrscht mit einem Hinweis, was dieser macht. Damit hast schon die Grundlagen für die ASM-Programmierung.
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    35
    Beiträge
    1.461
    HI!

    Ich hab mir schon überlegt, ob ich dich fragen soll, ob es da vllt. Login-Probleme gibt...

    ah.. st store.. danke ;D
    danke für den Tip, mein ASM reicht gerade mal zum Ports ein und ausschalten...

    Englisch stört mich generell nie, da muss man mal den Grips anstrengen!

    Danke dann nochmal!

    VLG Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    35
    Beiträge
    1.461
    Hi!

    Da das mit dem Schreiben so gut klappt, habe ich das gleich mal auch mit dem Lesen versucht.

    Folgender Code...:
    Code:
    Function Readbus()                                          'Den Wert vom Bus lesen
       Dim Value As Byte
    
       Ddrb = &B00000000                                        'Alles Eingänge
       Ddrc = &B11111100                                        'Umschaltung, dass es keine Crashes gibt.
    
       $asm
    
         in R17, pinc
    
    
         CBR R16, 0b00000001
         SBRC R17, 1
         SBR R16, 0b00000001
    
         CBR R16, 0b00000010
         SBRC R17,0
         SBR R16, 0b00000010
    
         in R17, pinb
    
    
         CBR R16, 0b00000100
         SBRC R17, 5
         SBR R16, 0b00000100
    
         CBR R16, 0b00001000
         SBRC R17, 4
         SBR R16, 0b00001000
    
         CBR R16, 0b00010000
         SBRC R17, 3
         SBR R16, 0b00010000
    
         CBR R16, 0b00100000
         SBRC R17, 2
         SBR R16, 0b00100000
    
         CBR R16, 0b01000000
         SBRC R17, 1
         SBR R16, 0b01000000
    
         CBR R16, 0b10000000
         SBRC R17, 0
         SBR R16, 0b10000000
    
         Loadadr Value , X
         st X, r16
    
       $end Asm
    
       Readbus = Value
    
    End Function
    Compiler schluckt's, liefert aber nur Datenmüll.

    Ich habe ja den verdacht, dass ich vlaue diesmal mit einer lds(nur andersherum) ähnlcihen funktion laden muss, oder?

    Nochmal Danke!

    VLG Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo tobi, warum nimmst du die langsame "funktion".
    nimm eine "sub" die ist etwas schneller. nimm ein "goto" und das ist noch schneller. wenn du mit ein varptr die sram-adresse einer variable erfragst, bekommst du die variable am schnellsten über die direkte adressenanfrage.
    habe ich mit fastavr-basic herausbekommen, wo ich mir den asm-source-code
    angeschaut habe.
    mfg pebisoft

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Ich nehme mal an, dass diese Funktion irgendwo mit

    Declare Function ReadBus () as Byte

    deklariert ist.

    Warum Du das B-Port mit
    Ddrb = &B00000000
    auf Input stellst, ist nicht ersichtlich. Das C-Port wird mit
    Ddrc = &B11111100
    für die Pins 2-7 auf Output und die Pins 0-1 auf Input gestellt.
    Im nachfolgenden Code scheinst aber alle 8 vom Port C eingelesenen Bits auszuwerten.

    Und nun zu Deiner eigentlichen Fragestellung.
    Einen Funktionswert kann Du auf folgende Weise:

    loadadr readbus, X
    st X, r16

    zurückgeben. Das obige Beispiel ist für den Fall, dass ReadBus einen Rückgabewert vom Type BYTE hat.
    Du kannst den Funktionsnamen wie einen Variablennamen mit loadadr verwenden.

    Ich gehe mal davon aus, dass diese Funktion primär einen experimentellen Charakter hat, um diverse Möglichkeiten zu testen. Befasse Dich mal mit dem Bascom Simulator, damit kannst Du Schritt für Schritt verfolgen, was in den einzelnen Registern und Speicherstellen passiert. Damit kannst Du nach herzenslust experimentieren, weil Du auch während der Simulation die Input-Pins im Pegel verändern kannst.
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests