- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: ATtiny13 und Studio4 in Assembler

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61

    ATtiny13 und Studio4 in Assembler

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute,
    seit einem halben Jahr habe ich von Bascom zu AVR-Studio4 in Assembler gewechselt.
    Es ist schon eine Umstellung.
    Ein Tiny13 ist mit Bascom als Ortungspieper programmiert.
    Dazu dienen 3 DIP-Schalter mit der Bezeichnung "sw1 | sw2 | sw3" für verschiedene Zeiten.

    Die Schalter wurden in Bascom mit Alias den Ports zugewiesen.
    sw1 Alias Pinb.4 (oder PINB,PB4)
    sw2 Alias Pinb.1
    sw3 Alias Pinb.2
    Ich lese nun schon in allen möglichen Büchern, um sowas auch im Assembler zu realisieren.
    In den Direktiven gibt es den Befehl .DEF...aber damit kann ich nur den Arbeitsregistern R0-R31
    einen Namen zuweisen, keinen Port-Register.
    Hat jemand von Euch eine Idee?

    Grüße

    Rolf

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von hegewald
    ... von Bascom zu AVR-Studio4 in Assembler gewechselt ...
    ... in Bascom mit Alias ... sw1 Alias Pinb.4 (oder PINB,PB4) ... sowas auch im Assembler zu realisieren ...
    Und das geht in Assem bler nicht? Hmmmm. Ich hatte in Assem bler viel mit #define-s gearbeitet, z.B. hieß das Allzweckregister r16 öfters kurz "a", ein einzelner Pin z.B. servo1 und so. WENN das Register r16 a heissen kann, warum sollten dann Portregister nicht auch benannt werden können? Leider hatte ich auf die Schnelle in meinen Quellen dazu kein Beispiel mit Port-Alias gefunden.

    Mal ein Beispiel aus meinem Code für (m)einen Servotester (klick) mit einem tiny13, siehe die Aliase servo1, msmin und msges. Vielleicht hilft Dir das? (Oder diese Beiträge? - klick)

    Code:
    ;===================================================================================
    ; Speicherbelegung
    ;r14  low-Byte der ADC-Wandlung (lsb)
    ;r15  high-Byte der ADC-Wandlung: Beide ergeben einen Wert zwischen 0...1023
    ;r16 Mehrzweck, high-Byte in Pausen "pause_an", "pause_aus", "led_ende" u.ä.
    ;r17   low-Byte in Pausen, s.o.
    ;
    ;r18  --  --
    ;r19  --  --
    ;r20  --  --
    ;
    ;r21  Byte  Steuerbyte. Es werden nur Bits ausgewertet
    ;  "Rampe" an-aus, 1=Rampe an, bit 1 = Servo 1 , bit 5 = Servo 2
    ;  Übernahme Rampenwert, 1=Daten wurden noch nicht übernommen vom
    ;  Hauptprogramm in die ISR, 0=ISR hat Daten abgeholt und zwar
    ;   bit 2 = Servo 1 , bit 6 = Servo 2
    ;r22  1/2 Word lsb Zeitwert Rampe aus auf-ab-Rechnerei im Hauptprogramm
    ;r23  1/2 Word msb zu r26
    ;r24  1/2 Word LSB Zeitwert Rampe aus ADC/Poti im Hauptprogramm
    ;r25  1/2 Word MSB  wird vom r14/15 geholt und zurechtgerechnet
    ;
    ;r26  1/2 Word LSB GESAMTDAUER Servoimpuls MUSS in r26/27 sein wegen sbiw
    ;r27  1/2 Word MSB Zeitwert für GESAMTDAUER Servoimpuls, etwa 500 Takte ?
    ;
    ;r28  1/2 Word lsb LSB RampenCOUNTER Servo1, wird in ISR runtergezählt
    ;r29  1/2 Word msb MSB   Counter stammt vom ADC
    ;r30  1/2 Word lsb LSB Auf-ab-COUNTER Servo2, wird in ISR runtergezählt
    ;r31  1/2 Word msb MSB
    ;
    ;===================================================================================
    ; ..................
    ;===================================================================================
    ; Deklarationen für den Praeprozessor
    ; Konstanten  ####### evtl. auch keine Konstanten definiert
    ;
    #define a r16 ;Kurzbezeichung für Allzweckregister r16
    ;
    ; Anschlussbelegung, vgl. srv-adc+pwm-x29b.asm
    #define servo1 3 ;Servo 1 auf Port PB3
    #define potiadc 2 ;Poti 1 am Port PB4 geht auf ADC-Kanal 2
    ;
    ;Festwerte und div. Daten für adcdat etc ====>
    #define adcpsc 7 ; =7 ==> Clock/128, 9,6 MHz werden 75 kHz, vgl. doc, S93
    ;#define adcdat 3 ;Dummywert vom ADC   ###>>> "Nur" 8Bit-Wandlung ! ? ! 
    #define msges 5000 ;Gesamtzeit der Rampe: 5000 ISR-Zyklen sind 20 ms
    #define mstest 1000     ;Test ergibt mit mstest 500 und tmprs 40: für 2,0 ms
                            ;  das heisst: 4 µs Interrupt-Abstand (Fehler +4%)
    #define msmin 100     ;Minimalwert für Rampe: 0,5 ms
    #define tmrprs  38     ;Preset im Timer-Register (hoffentlich für CTC)
    ;
    ;===================================================================================
    ; Hauptprogramm
    ;===================================================================================
    ;
    anfang:
    ; .......
    ;===================================================================================
    ;
    ;
    isr_ctc: ;=== Immer wieder Veränderungen
    ;
     sbiw r27:r26,1 ;Pointer von 5000 runterzählen
        ;  für EINEN Servoimpuls von 20 ms
     breq i_neu  ;  .. und Spezialfall "null" ==> Daten umschaufeln
        ;  und Rampe einschalten. WENN keine neuen Daten da
        ;  sind, dann alte Daten nehmen :(
    ;
    ; Jetzt wird nachgesehen, ob eine der Rampen ausgeschaltet werden muss. Das steht
    ; im Portbit ddrb
    ;
    isr_nn:  ;=== Zähler der ISR steht nicht auf Null
    s1_pran: ;=== Servo1: Prüfe, ob Rampe ist an
     in r20,portb
     sbrs r20,servo1 ;Ist Rampe von servo1 an?
     rjmp i_raus  ;Wenn Rampe nicht an ist, dann gleich raus
    ;
     sbiw r29:r28,1 ;Decrementiere Rampenwert
     brne i_raus  ;weiter, wenn noch nicht Null zu servo2
     cbi portb,servo1 ;  Sonst Lösche Rampe für Servo1
    ;
     rjmp i_raus sbiw r29:r28,1
     breq i_neu
     rjmp i_raus
    i_neu:    ;Daten neu in Register und port servo1 umschalten
     ldi r28,low(msmin)
     ldi r29,high(msmin)
    ; mov r17,r15  ;Es ist adlar gesetzt, das ADCLH ist in r15
     ldi r18,0
     add r28,r15
     adc r29,r18
        ;Und ADC-Wert gleich nochmal draufaddieren
        ;  aber nur die Hälfte
     clc   ;Clear carry für anschliessende Division /2
     ror r15  ;
     add r28,r15
     adc r29,r18
    ;
     ldi r26,low(msges) ;Loopgrenzen für Gesamtloop 20 msec
     ldi r27,high(msges)
     sbi portb,servo1 ;  Und setze Rampe für Servo1. FERTIG
    ;
    i_raus:
     reti  ;=====----->>>>>
    ;
    ;===================================================================================
    ; Ende des Quellcodes
    ;===================================================================================
    Ciao sagt der JoeamBerg

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Hubert und Oberallgeier,
    danke für Eure Hilfe!
    zu Hubert...habe schon das halbe AVR - Tutorial gelesen, aber zu den Vorschlag von Oberallgeier

    #define sw1 PINB,PB4
    stand nichts! Auch in meinen Buch zum AVR-Assembler war nichts zu lesen.
    Und es funktioniert tadellos.
    Schlau geworden bin ich auch, wie ich die PULLUP-Widerstände am Portb setze.
    Nun werde ich über Timer0 3 Zeiten von 20 / 30 / 40 Minuten aufbauen.

    Grüße

    Rolf

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Viele der Tutorials und Bücher sind noch für den alten Assembler. Der kann den Befehl #define noch nicht. Da hat man so etwas per .equ Direktive gemacht. Bei AVR Studio4 kann man zwischen der alten und neuen Version des Assemblers wählen.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Hallo Leute,
    ich hänge mit den Tiny13 auf dem Schlauch...und habe schon das Datenblatt studiert.
    Anfangsteile vom Quelltext und Aufruf der ISR am Ende:

    .INCLUDE "tn13def.inc" ; Deklarationen für Tiny13
    .EQU takt = 1000000 ; Systemtakt 1 MHz
    #define test PINB,PB3
    #define sw1 PINB,PB4
    #define sw2 PINB,PB1
    #define sw3 PINB,PB2
    rjmp start ; Reset-Einsprung
    .ORG OVF0addr ; Interupt-Vektoren
    rjmp TIM0_OVF ; Sprung zur ISR

    start: ldi r16,LOW(RAMEND) ; Stapel anlegen
    out SPL,r16

    ldi r16,0x01 ; Bitmuster 0000 0001
    out DDRB,r16 ; PortB (PB0 ist Ausgang)
    ldi r16,0b00011110 ; PB1-PB4 = PULLUP
    out PORTB,r16

    ;Interrupt-ISR
    TIM0_OVF: push r16
    in r16,SREG
    dec r17
    pop r16
    out SREG,r16
    reti
    Der Compiler vom Studio4 gibt Fehlermeldung "TIM0_OVF" undefiniertes Symbol.
    Beim Tiny2313 läuft das anstandslos...ich weiß nicht mehr weiter.
    Auch wenn ich in der loop-Schleife "rcall zeit4" eingebe, und die Routiene mit ret beende,
    kommt die Fehlermeld. zeit4 undef. Symbol

    Grüße

    Rolf

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.08.2011
    Beiträge
    61
    Sorry, hab den Fehler gefunden!

    Vor der ISR und den Aufrufen der Zeiten stand ein ".EXIT", und das hat mich 4 Stunden gekostet.

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von hegewald
    ... ein ".EXIT", und das hat mich 4 Stunden gekostet.
    Ein langsamer Ausgang . . . *ggg*. Aber besser ein .exit in der Software als der .exitus des Controllers.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von hegewald Beitrag anzeigen
    ;Interrupt-ISR
    TIM0_OVF: push r16
    in r16,SREG
    dec r17
    pop r16
    out SREG,r16
    reti
    Hallo,
    ich bin Anfänger in ASM, aber könnte es sein, daß das grüne push fehlt oder das rote pop zuviel ist?

    ;Interrupt-ISR
    TIM0_OVF: push r16
    in r16,SREG
    push r16
    dec r17
    pop r16
    out SREG,r16
    pop r16
    reti


    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Searcher Beitrag anzeigen
    ..., aber könnte es sein, daß das grüne push fehlt oder das rote pop zuviel ist?
    Nein, nur vertauscht, richtig wär's so:
    Code:
    TIM0_OVF:
    push    r16
    in      r16,SREG
    dec     r17
    out     SREG,r16
    pop     r16
    reti
    Der Originalcode:
    Code:
    pop    r16
    out    SREG,r16
    stellt dagegen SREG mit einem Wert wieder her, den R16 beim Aufruf des Interrupts hatte, was für kreatives Verhalten des Codes sorgt.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. AVR-Studio4.18
    Von walterk im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 14.08.2010, 19:29
  2. AVR Studio4
    Von roy-sam im Forum Robby RP6
    Antworten: 4
    Letzter Beitrag: 28.03.2010, 16:54
  3. AVR Studio4.16; C; ATmega32
    Von walterk im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 09.08.2009, 21:00
  4. AVR Studio4 und ATTINY26
    Von The Man im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 28.11.2006, 20:27
  5. AVR Studio4 Takteinstellung
    Von Schrödi im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 19.08.2004, 15:01

Berechtigungen

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

Labornetzteil AliExpress