PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer => Fehlermeldungen beim compilieren



The Man
13.02.2007, 22:20
Hello again,
ich habe im myavr Workpad folgenden Code geschrieben, der durch den Wertevergleich des Timers mit einem Register einen Port an und aus schalten soll.

main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
ldi r16,0b00000101
out TCCR0,r16
ldi r16,0b11111111
out DDRC,r16
ldi r17,0b00000001
;Hier Init-Code eintragen.
;------------------------------------------------------------------------
mainloop: wdr
an:
cpi TCNT0,r16
BREQ weiter
rjmp an ;Hier den Quellcode eintragen.
weiter:
51 ldi r16,0b0000000
out PORTC,r16
ldi r16,0b11111111
aus:
59 cpi TCNT0,r17
BREQ weiterr
rjmp aus
weiterr:
rjmp mainloop


Dazu bekomme ich folgende Fehlermeldung:

Assembler Meldungen:
m8.asm:51 51: Fehler: number must be less than 32
51: Fehler: Zulässig sind nur Register oder Werte im Bereich: 0 to 31
51: Warnung: Der Ausdruck bzw. die Sprungmarke befindet sich möglicherweise außerhalb der 8-bit Zahlenbereiches.
m8.asm:59 59: Fehler: number must be less than 32
59: Fehler: Zulässig sind nur Register oder Werte im Bereich: 0 to 31
59: Warnung: Der Ausdruck bzw. die Sprungmarke befindet sich möglicherweise außerhalb der 8-bit Zahlenbereiches.


Kann mir da jemand sagen, was nicht stimmt?

Danke

teslanikola
13.02.2007, 23:04
hast due das includefile dan definiert? das Wäre ne möglichkeit, und das Lo8 und Hi8 mach da mal Low und High draus

SprinterSB
13.02.2007, 23:24
Bist du sicher, daß der Assembler weiß, was du mit 0b... meinst? Das ist zumindest überaus unüblich. Nur einige gepatchte gcc verstehen das.

Hanni
14.02.2007, 07:59
1. Schlag mal nach, wofür der Befehl cpi gut ist.
2. Schlag ausserdem nach welche Bereiche ein breq überspringen kann ....

als Referenz empfehle ich das Instruction Set (http://atmel.com/dyn/resources/prod_documents/doc0856.pdf)


Bist du sicher, daß der Assembler weiß, was du mit 0b... meinst? Das ist zumindest überaus unüblich. Nur einige gepatchte gcc verstehen das.

zumindest das AVR Studio erkennt es ohne Probleme (also der Assembler dort)

Jahn Kohlhas
14.02.2007, 08:48
hallo,

hab das ganze mal in mein Workpad kopiert und die übersetzungsfehler ausgebügelt... aber nicht kontrolliert ob der code logisch korrekt ist ;-)



;+----------------------------------------------------------------------
;| Title : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion : ...
;| Schaltung : ...
;+----------------------------------------------------------------------
;| Prozessor : ATmega8
;| Takt : 3,6864 MHz
;| Sprache : Assembler
;| Datum : ...
;| Version : ...
;| Autor : ...
;+----------------------------------------------------------------------
.include "AVR.H"
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
ldi r16,0b00000101
out TCCR0,r16
ldi r16,0b11111111
out DDRC,r16
ldi r17,0b00000001
;Hier Init-Code eintragen.
;------------------------------------------------------------------------
mainloop:
an: ;falsch cpi TCNT0,r16 ... cpi -> vergleiche register mit konstante
in r18,TCNT0
cp r18,r16
breq weiter
rjmp an ;Hier den Quellcode eintragen.
weiter:
ldi r16,0b0000000
out PORTC,r16
ldi r16,0b11111111
aus:
; falsch cpiTCNT0,r17
in r18,TCNT0
cp r18,r16
breq weiterr
rjmp aus
weiterr:
rjmp mainloop

;------------------------------------------------------------------------



gruß jahn

The Man
14.02.2007, 11:07
Ähm...ja....
hab wohl die goldene Regel mit dem IN vergessen...

Und Danke für die Antworten.