www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8515 auf Atmega16L


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich habe folgendes Problem:
Einen Assemblercode in avr gcc für den Atmega8515 für einen Atmega16L 
verwenden.
//
// local functions
//
;    r24    r22
; void startSCI(u08 mode, u08 address)
startSCI:
    cbi  MP3_PORT,MP3_PIN    ; activate VS1001 Chip Select
    rcall  spi_tx_rx      ; send the mode (READ or WRITE)
    mov  r24,r22        ; get address
    rjmp  spi_tx_rx      ; send address

; void endSCI(void)
endSCI:
     sbi   MP3_PORT, MP3_PIN    ; set CS hi
    clr  r25        ; do a 10us
    rcall  delay10us      ; delay
    ret

spi_tx_rx:
    out   SPDR, r24      ; send over SPI
vspi1:    sbis   SPSR,SPIF      ; while flag is clear
     rjmp   vspi1        ; wait for SPI
     in   r24, SPDR      ; and get input data
    ret          ; done


//
// global functions
//

;      r24
;void vs1001_send_data(u08 data)
  .global vs1001_send_data
vs1001_send_data:  
    cli
     sbi  BSYNC_PORT,BSYNC_PIN    ; start BSYNC
    out   SPDR, r24      ; send over SPI
    nop
    nop
    nop
     cbi  BSYNC_PORT,BSYNC_PIN    ; stop BSYNC
vssd1:    sbis   SPSR,SPIF      ; while flag is clear
     rjmp   vssd1        ; wait for SPI
    sei
     ret
 

;    r24    
;u16 vs1001_read(u08 address)
  .global vs1001_read
vs1001_read:
    mov  r22,r24        ; address in r22
    ldi  r24,VS1001_READ
    rcall   startSCI      ; start SCI communication
      clr  r24
     rcall  spi_tx_rx      ; get a byte
    mov  r23,r24
      clr  r24
     rcall  spi_tx_rx      ; get a byte
    mov  r22,r24
      rcall  endSCI
      mov  r24,r22        ; get back word
      mov  r25,r23        ; get back word
      ret

;       r24    r23/r22
;void vs1001_write(u08 address, u16 data)
  .global vs1001_write

vs1001_write:
    mov  r18,r22        ; save register
    mov  r22,r24        ; address in r22
    ldi  r24,VS1001_WRITE
    rcall   startSCI      ; start SCI communication
      mov  r24,r23        ; get hi byte
     rcall  spi_tx_rx      ; send it
      mov  r24,r18        ; get lo byte
     rcall  spi_tx_rx      ; send it
      rjmp  endSCI

  
; send a 32 byte block of data to the VS1001   
; using the SPI port.               
;      r25/r24
;void vs1001_send_32(char *pData);

  .global vs1001_send_32

vs1001_send_32:
    mov   r31,r25        ; transfer input pointer to Z
    mov   r30,r24
      ldi  r25,32        ; init loop counter
vs32_2:    ld   r24,Z+        ; get a byte and inc pointer
    rcall  vs1001_send_data
     dec  r25        ; dec loop counter
     brne  vs32_2        ; loop if not zero
     ret


;      r25/r24
; void vs1001_nulls(u16 nNulls)
  .global vs1001_nulls
  
vs1001_nulls:
    mov  r30,r24  
    mov  r31,r25  
vs1001_nulls_2:    
    clr  r24    
    rcall  vs1001_send_data
    sbiw  r30,1
    brne  vs1001_nulls_2
    ret

;      r24  r22    
;void vs1001_setvolume(u08 left, u08 right)
  .global vs1001_setvolume
vs1001_setvolume:
    mov  r23,r24  
    ldi  r24,11        ; volume register
    rjmp  vs1001_write


.comm vs1001_xtalcomp,2        ; compensation value for the VS1001 xtal

;      r24
;void vs1001_reset(bool bLoud)
  
  .global  vs1001_reset
  
vs1001_reset:
    push   r24
    ldi  r25,8
    clr  r24
    rcall  vs1001_nulls
    
    ldi  r24,VS1001_MODE
    clr  r23
    ldi  r22,4  
    rcall  vs1001_write
    rcall  delay10us      ; delay
w_dreq:
    sbis  DREQ_PORT-2,DREQ_PIN    ;  wait for DREQ
    rjmp  w_dreq
    clr  r25
    ldi  r24,32;
    rcall  vs1001_nulls

    ; set CLOCKF to compensate for a non 24,576 MHz x-tal
    ldi  r24,VS1001_CLOCKF
    lds  r23,vs1001_xtalcomp+1    
    lds  r22,vs1001_xtalcomp    
    rcall  vs1001_write
    
    ; set sound enchance bit
    
    pop  r24
    clr  r22        ; clear r22
    ror  r24        ; rotate bit into carry
    ror  r22        ; rotate carry to high bit of r22
    clr  r23
    ldi  r24,VS1001_MODE
    rjmp  vs1001_write


;           r25/r24
; void vs1001_setcomp(u16 comp)
.global vs1001_setcomp
vs1001_setcomp:
    sts  vs1001_xtalcomp,r24
    sts  vs1001_xtalcomp+1,r25
    ret


die Fehlermeldung :../vs1001.s:93: Error: number must be less than 32
an Stellen die mit den Portzugriffen und dem SPI zutun haben.

Wie soll ich diese Stellen umschreiben damit das alles wieder 
funktioniert?

Danke

Autor: spess53 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi

>Wie soll ich diese Stellen umschreiben damit das alles wieder
>funktioniert?

Kennzeichne mal die Stellen, an denen Fehler auftreten. Eigentlich 
dürfte es keine Probleme geben, das die IO-Adressen für SPI identisch 
sind.

MfG Spess

Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Es sind folgende Stellen:

bei denen die Fehlermeldung auftritt:
cbi  MP3_PORT,MP3_PIN    ; activate VS1001 Chip Select
sbi   MP3_PORT, MP3_PIN    ; set CS hi
sbis   SPSR,SPIF      ; while flag is clear
sbi  BSYNC_PORT,BSYNC_PIN    ; start BSYNC
cbi  BSYNC_PORT,BSYNC_PIN
cbi  BSYNC_PORT,BSYNC_PIN    ; stop BSYNC
sbis  DREQ_PORT-2,DREQ_PIN

wo mit sbi,cbi,sbis gearbeitet wird

Ich habe gelesen dass das mit der avr version zusammenhängt.

Autor: spess53 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi

>Ich habe gelesen dass das mit der avr version zusammenhängt.

Nein, nur mit dem AVR-Typ.

Die Meldung

Fehlermeldung :../vs1001.s:93: Error: number must be less than 32

Deutet darauf hin, das 'MP3_PORT'... falsch definiert sind.

MfG Spess

Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich sehe das es mit dem sbi, cbi und sbis zusammenhängt

Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
teils verstehe ich nicht warum das nicht fuktioniert da es ein fertiges 
funktionierendes Programm war

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
> teils verstehe ich nicht warum das nicht fuktioniert da es ein fertiges
> funktionierendes Programm war

Naja. Der Code oben ist ein Teil eines Programms. Es fehlen z.B. die 
Definitionen der Makros xxx_PORT und xxx_PIN. Wie Spess schon 
geschrieben hat, sind die zu kontrollieren.

Möglicherweise steht in einer Includedatei was drin ala "Wenn als µC-Typ 
Atmega8515 definiert ist, dann bedeutet xxx_PORT DIES und wenn nicht 
dann DAS." Bei einem Wechsel auf den Atmega16L ohne Anpassung einer 
solchen bedingten Makrodefinition klappt's nicht mehr.

Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich kompiliere die ganze Assembler Datei.
#include <avr/io.h>
//
// VS1001 I/O pins
//

#define MP3_PORT  PORTB
#define BSYNC_PORT  PORTB    
#define DREQ_PORT  PORTB

#define MP3_PIN    PB4        // MP3 control bit 
        
#define DREQ_PIN  PB2        // DREQ signal
#define BSYNC_PIN   PB3             // BSYNC signal


//
// VS1001 commands
//
#define VS1001_READ  0x03
#define VS1001_WRITE  0x02

//
// VS1001 registers
//
#define VS1001_MODE      0x00
#define VS1001_STATUS  0x01
#define VS1001_INTFCTLH  0x02
#define VS1001_CLOCKF  0x03
#define VS1001_PLAYTIME  0x04
#define VS1001_AUDATA  0x05
#define VS1001_VOLUME  0x0B


  .section  .text

//
// local functions

Das ist der Programmteil den ich vorher noch nicht hier gepostet habe.

Autor: holger (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Versuchs mal so:

#define _ASSEMBLER_ 1
#define __SFR_OFFSET 0

#include <avr/io.h>

Autor: holger (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ach shit die Foren Formatierung hat zugeschlagen;)
#define __ASSEMBLER__ 1
#define __SFR_OFFSET 0

#include <avr/io.h>

Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
@holger

Vielen Vielen Dank
Jetzt kommen die Fehler nicht mehr.
was bedeuten genau diese Anweisungen?

Jetzt ist dort noch ein Fehler mit

rcall  delay10us


befindet sich dieser Befehl in einer weitern header Datei?

Danke

Autor: Hannes Lux (hannes)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Mr. D schrieb:
> Jetzt ist dort noch ein Fehler mit
> rcall  delay10us
>
>
> befindet sich dieser Befehl in einer weitern header Datei?

Nein, der Befehl "RCALL" befindet sich im Befehlssatz des Assemblers.

Die von RCALL aufgerufene Routine mit dem Label "delay10us" liegt da, 
wo sie der Autor des Programms hingelegt hat. Da wirst Du wohl mal in 
allen zum Projekt gehörenden Dateien suchen müssen.

Viele professionelle Programmierer meinen, dass modularer Aufbau des 
Programms mit Auslagerung der Teile in separate Dateien (nach C-Manier) 
den Quellcode übersichtlicher macht. Aber ab einer gewissen 
Zerstückelung bekommt ein Außenstehender ein "Sucht-Problem", man sucht 
und sucht und sucht... - Und wenn man es gefunden hat, dann hat man 
vergessen, wonach man gesucht hat...

Ja, auch ich arbeite gelegentlich mit Include-Dateien, aber man kann es 
auch übertreiben.

...

Autor: Mr. D (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
@Hannes Lux

Vielen Dank

Tatsächlich hat sich diese Routine in einer extra .c Datei befunden, wo 
wirklich genau nur diese eine Funktion steht.

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net