0

This is my code:

START:
    LDI R18, 0XFF
    OUT DDRB, R18 //LET PORT B AS OUTPUT
    LDI R16, 0B01110101
    OUT TCCR0A, R16
    LDI R17, 0B01110101
    OUT TCCR0B, R17
    LDI R24, 0XFF
    OUT DDRD, R24 // LET PORT AS INPUT
    OUT OCR0A, R18


MAIN:

    IN R18, PINB //LOAD PORT B TO R18
    CPI R18, 0B00000000 //CHECK IF R18 == 0
    BREQ SPEED1 // JUMP TO SPEED1 IF R18 == 0
    OUT OCR0A, R16
    OUT OCR0B, R17

    IN R18, PINB //LOAD PORTB TO R18
    CPI R18, 0B00000001 //CHECK IF R18 == 1
    BREQ SPEED2 // JUMP TO SPEED2 IF R18 == 1
    OUT OCR0A, R16
    OUT OCR0B, R17

    IN R18, PINB //LOAD PORTB TO R18
    CPI R18, 0B00000010 //CHECK IF R18 == 2
    BREQ SPEED3 // JUMP TO SPEED3 IF R18 == 2
    OUT OCR0A, R16
    OUT OCR0B, R17

    IN R18, PINB //LOAD PORTB TO R18
    CPI R18, 0B00000011 //CHECK IF R18 == 1
    BREQ SPEED4 // JUMP TO SPEED4 IF R18 == 3
    OUT OCR0A, R16
    OUT OCR0B, R17

    RJMP MAIN

SPEED1:
    LDI R16, 0B00000001
    OUT PORTD, R16
    LDI R17, 255
    RET

SPEED2:
    LDI R16, 0B00000001
    OUT PORTD, R16
    LDI R17, 180
    RET

SPEED3:
    LDI R16, 0B00000001
    OUT PORTD, R16
    LDI R17, 100
    RET

SPEED4:
    LDI R16, 0B00000001
    OUT PORTD, R16
    LDI R17, 0
    RET

This is my Proteus: circuit diagram

AND WHEN I RUN, THIS ERROR HAPPENED:
Invalid opcode 0xFFFF at PC=0x8C02

I do not have any idea what have happen there. any help would be appreciated.

Peter Cordes
  • 328,167
  • 45
  • 605
  • 847
acemal9
  • 1
  • 1
  • 2
    Do not post code as images. Anyway, your problem seems to be that your `SPEED*` are subroutines that end with a `RET` but you simply branch to them instead of calling so there is no return address. – Jester Jan 17 '23 at 12:45
  • may i know how i need to correct the code. i apologize, i am not very familiarize with the assembly code – acemal9 Jan 17 '23 at 13:39
  • Well, if you want to keep the subroutines then negate the conditions and use some form of `CALL`. – Jester Jan 17 '23 at 13:50

0 Answers0