Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Write an assembly program (ATMega128) that calculates a 4 bit CRC code with a polynomial of x 4 + x + 1 (named CRC-4-ITU). The

Write an assembly program (ATMega128) that calculates a 4 bit CRC code with a polynomial of x4 + x + 1 (named CRC-4-ITU). The program should call the first subroutine to read the input from a DIP switch pack (8-bit input) on UNI-DS6; then it should calculate the 4-bit CRC code in the second subroutine. It should finally display the CRC code on UNI-DS6 LCD display in a third subroutine. The output should be displayed in two formats: Binary and HEX. It is expected that you will read, understand, and use necessary portions of the LCD driver assembly code provided in the APPENDIX. The program should then go back to the beginning and keep running the three routines in an infinite loop

APPENDIX:

; *************************************************************************** ; LCD Application main.asm -- LCD with an Atmel ATmega128 processor ; ; *************************************************************************** ; File: main.asm ; Date: 13/03/2016 ; Target: ATmega128 ; Hardware: UN-DS6 Development Board ; ; Summary: 4-bit LCD interface, PortC D7-D4 to LCD ; ; ; *************************************************************************** .INCLUDE "m128def.inc" .equ fclk = 8000000 ; system clock frequency (for delays) ; register usage .def temp = R16 ; temporary storage ; LCD interface .equ lcd_D7_port = PORTC ; lcd D7 connection .equ lcd_D7_bit = PORTC7 .equ lcd_D7_ddr = DDRC .equ lcd_D6_port = PORTC ; lcd D6 connection .equ lcd_D6_bit = PORTC6 .equ lcd_D6_ddr = DDRC .equ lcd_D5_port = PORTC ; lcd D5 connection .equ lcd_D5_bit = PORTC5 .equ lcd_D5_ddr = DDRC .equ lcd_D4_port = PORTC ; lcd D4 connection .equ lcd_D4_bit = PORTC4 .equ lcd_D4_ddr = DDRC .equ lcd_E_port = PORTB ; lcd Enable pin .equ lcd_E_bit = PORTB5 .equ lcd_E_ddr = DDRB .equ lcd_RS_port = PORTB ; lcd Register Select pin .equ lcd_RS_bit = PORTB2 .equ lcd_RS_ddr = DDRB ; LCD module Lines .equ lcd_LineOne = 0x00 ; line 1 .equ lcd_LineTwo = 0x40 ; line 2 ; LCD Defined instructions .equ lcd_Clear = 0b00000001 ; ASCII 'space' for all characters .equ lcd_Home = 0b00000010 ; first position on first line .equ lcd_EntryMode = 0b00000110 ; shift cursor from left to right on read/write .equ lcd_DisplayOff = 0b00001000 ; turn display off .equ lcd_DisplayOn = 0b00001100 ; display on, cursor off, don't blink character .equ lcd_FunctionReset = 0b00110000 ; reset the LCD .equ lcd_FunctionSet4bit = 0b00101000 ; 4-bit data, 2-line display, 5 x 7 font .equ lcd_SetCursor = 0b10000000 ; set cursor position 8 ; ****************************** Reset Vector ******************************* .org 0x0000 jmp start ; jump over Interrupt Vectors, Program ID etc. ;******************************* Program ID ********************************* .org INT_VECTORS_SIZE text: .db "Hello",0 ; ****************************** Main Program Code ************************** start: ; initialize the stack pointer to the highest RAM address ldi temp,low(RAMEND) out SPL,temp ldi temp,high(RAMEND) out SPH,temp ; configure the microprocessor pins for the data lines sbi lcd_D7_ddr, lcd_D7_bit ; 4 data lines - output sbi lcd_D6_ddr, lcd_D6_bit sbi lcd_D5_ddr, lcd_D5_bit sbi lcd_D4_ddr, lcd_D4_bit ; configure the microprocessor pins for the control lines sbi lcd_E_ddr, lcd_E_bit ; E line - output sbi lcd_RS_ddr, lcd_RS_bit ; RS line - output ; initialize the LCD controller call lcd_init_4d ; initialize the LCD display for a 4-bit interface here: IN R16, PINB; ; display the first line of information ldi ZH, high(text) ; point to the information that is to be displayed ldi ZL, low(text) ldi temp, lcd_LineOne ; point to where the information should be displayed call lcd_write_string_4d ; display the second line of information ldi ZH, high(text) ; point to the information that is to be displayed ldi ZL, low(text) ldi temp, lcd_LineTwo ; point to where the information should be displayed call lcd_write_string_4d ; endless loop rjmp here ; ****************************** End of Main Program Code ******************* ; ============================== 4-bit LCD Function Calls ====================== ; Name: lcd_init_4d -- initialize the LCD module for a 4-bit data interface lcd_init_4d: ; Power-up delay ldi temp, 100 ; initial 40 mSec delay call delayTx1mS ; IMPORTANT - At this point the LCD module is in the 8-bit mode and it is expecting to receive ; 8 bits of data, one bit on each of its 8 data lines, each time the 'E' line is pulsed. ; 9 ; Since the LCD module is wired for the 4-bit mode, only the upper four data lines are connected to ; the microprocessor and the lower four data lines are typically left open. Therefore, when ; the 'E' line is pulsed, the LCD controller will read whatever data has been set up on the upper ; four data lines and the lower four data lines will be high (due to internal pull-up circuitry). ; ; Fortunately the 'FunctionReset' instruction does not care about what is on the lower four bits so ; this instruction can be sent on just the four available data lines and it will be interpreted ; properly by the LCD controller. The 'lcd_write_4' subroutine will accomplish this if the ; control lines have previously been configured properly. ; Set up the RS and E lines for the 'lcd_write_4' subroutine. cbi lcd_RS_port, lcd_RS_bit ; select the Instruction Register (RS low) cbi lcd_E_port, lcd_E_bit ; make sure E is initially low ; Reset the LCD controller. ldi temp, lcd_FunctionReset ; first part of reset sequence call lcd_write_4 ldi temp, 10 ; 4.1 mS delay (min) call delayTx1mS ldi temp, lcd_FunctionReset ; second part of reset sequence call lcd_write_4 ldi temp, 200 ; 100 uS delay (min) call delayTx1uS ldi temp, lcd_FunctionReset ; third part of reset sequence call lcd_write_4 ldi temp, 200 ; this delay is omitted in the data sheet call delayTx1uS ; Preliminary Function Set instruction - used only to set the 4-bit mode. ; The number of lines or the font cannot be set at this time since the controller is still in the ; 8-bit mode, but the data transfer mode can be changed since this parameter is determined by one ; of the upper four bits of the instruction. ldi temp, lcd_FunctionSet4bit ; set 4-bit mode call lcd_write_4 ldi temp, 80 ; 40 uS delay (min) call delayTx1uS ; Function Set instruction ldi temp, lcd_FunctionSet4bit ; set mode, lines, and font call lcd_write_instruction_4d ldi temp, 80 ; 40 uS delay (min) call delayTx1uS ; The next three instructions are specified in the data sheet as part of the initialization routine, ; so it is a good idea (but probably not necessary) to do them just as specified and then redo them ; later if the application requires a different configuration. ; Display On/Off Control instruction ldi temp, lcd_DisplayOff ; turn display OFF call lcd_write_instruction_4d ldi temp, 80 ; 40 uS delay (min) 10 call delayTx1uS ; Clear Display instruction ldi temp, lcd_Clear ; clear display RAM call lcd_write_instruction_4d ldi temp, 4 ; 1.64 mS delay (min) call delayTx1mS ; Entry Mode Set instruction ldi temp, lcd_EntryMode ; set desired shift characteristics call lcd_write_instruction_4d ldi temp, 80 ; 40 uS delay (min) call delayTx1uS ; This is the end of the LCD controller initialization as specified in the data sheet, but the display ; has been left in the OFF condition. This is a good time to turn the display back ON. ; Display On/Off Control instruction ldi temp, lcd_DisplayOn ; turn the display ON call lcd_write_instruction_4d ldi temp, 80 ; 40 uS delay (min) call delayTx1uS ret ; --------------------------------------------------------------------------- ; Name: lcd_write_string_4d ; Purpose: display a string of characters on the LCD ; Entry: ZH and ZL pointing to the start of the string ; (temp) contains the desired DDRAM address at which to start the display ; Exit: no parameters ; Notes: the string must end with a null (0) ; uses time delays instead of checking the busy flag lcd_write_string_4d: ; preserve registers push ZH ; preserve pointer registers push ZL ; fix up the pointers for use with the 'lpm' instruction lsl ZL ; shift the pointer one bit left for the lpm instruction rol ZH ; set up the initial DDRAM address ori temp, lcd_SetCursor ; convert the plain address to a set cursor instruction call lcd_write_instruction_4d ; set up the first DDRAM address ldi temp, 80 ; 40 uS delay (min) call delayTx1uS ; write the string of characters lcd_write_string_4d_01: lpm temp, Z+ ; get a character cpi temp, 0 ; check for end of string breq lcd_write_string_4d_02 ; done ; arrive here if this is a valid character call lcd_write_character_4d ; display the character ldi temp, 80 ; 40 uS delay (min) call delayTx1uS rjmp lcd_write_string_4d_01 ; not done, send another character 11 ; arrive here when all characters in the message have been sent to the LCD module lcd_write_string_4d_02: pop ZL ; restore pointer registers pop ZH ret ; --------------------------------------------------------------------------- ; Name: lcd_write_character_4d ; Purpose: send a byte of information to the LCD data register ; Entry: (temp) contains the data byte ; Exit: no parameters ; Notes: does not deal with RW (busy flag is not implemented) lcd_write_character_4d: sbi lcd_RS_port, lcd_RS_bit ; select the Data Register (RS high) cbi lcd_E_port, lcd_E_bit ; make sure E is initially low call lcd_write_4 ; write the upper 4-bits of the data swap temp ; swap high and low nibbles call lcd_write_4 ; write the lower 4-bits of the data ret ; --------------------------------------------------------------------------- ; Name: lcd_write_instruction_4d -- Send a byte of information to the LCD instruction register lcd_write_instruction_4d: cbi lcd_RS_port, lcd_RS_bit ; select the Instruction Register (RS low) cbi lcd_E_port, lcd_E_bit ; make sure E is initially low call lcd_write_4 ; write the upper 4-bits of the instruction swap temp ; swap high and low nibbles call lcd_write_4 ; write the lower 4-bits of the instruction ret ; --------------------------------------------------------------------------- ; Name: lcd_write_4 Send 4-bits of information to the LCD module ; Entry: (temp) contains a byte of data with the desired 4-bits in the upper nibble ; (RS) is configured for the desired LCD register ; (E) is low ; (RW) is low lcd_write_4: ; set up D7 sbi lcd_D7_port, lcd_D7_bit ; assume that the D7 data is '1' sbrs temp, 7 ; check the actual data value cbi lcd_D7_port, lcd_D7_bit ; arrive here only if the data was actually '0' ; set up D6 sbi lcd_D6_port, lcd_D6_bit ; repeat for each data bit sbrs temp, 6 cbi lcd_D6_port, lcd_D6_bit ; set up D5 sbi lcd_D5_port, lcd_D5_bit sbrs temp, 5 cbi lcd_D5_port, lcd_D5_bit ; set up D4 sbi lcd_D4_port, lcd_D4_bit sbrs temp, 4 cbi lcd_D4_port, lcd_D4_bit ; write the data ; 'Address set-up time' (40 nS) 12 sbi lcd_E_port, lcd_E_bit ; Enable pin high call delay1uS ; implement 'Data set-up time' (80 nS) and 'Enable pulse width' (230 nS) cbi lcd_E_port, lcd_E_bit ; Enable pin low call delay1uS ; implement 'Data hold time' (10 nS) and 'Enable cycle time' (500 nS) ret ; ============================== End of 4-bit LCD Subroutines =============== ; ============================== Time Delay Subroutines ===================== ; Name: delayYx1mS Delay of (YH:YL) x 1 mS delayYx1mS: call delay1mS ; delay for 1 mS sbiw YH:YL, 1 ; update the the delay counter brne delayYx1mS ; counter is not zero ; arrive here when delay counter is zero (total delay period is finished) ret ; --------------------------------------------------------------------------- ; Name: delayTx1mS Provide a delay of (temp) x 1 mS delayTx1mS: call delay1mS ; delay for 1 mS dec temp ; update the delay counter brne delayTx1mS ; counter is not zero ; arrive here when delay counter is zero (total delay period is finished) ret ; --------------------------------------------------------------------------- ; Name: delay1mS -- Delay of 1 mS delay1mS: push YL ; [2] preserve registers push YH ; [2] ldi YL, low (((fclk/1000)-18)/4) ; [1] delay counter ldi YH, high(((fclk/1000)-18)/4) ; [1] delay1mS_01: sbiw YH:YL, 1 ; [2] update the the delay counter brne delay1mS_01 ; [2] delay counter is not zero ; arrive here when delay counter is zero pop YH ; [2] restore registers pop YL ; [2] ret ; [4] ; --------------------------------------------------------------------------- ; Name: delayTx1uS Delay of (temp) x 1 uS with a 8 MHz clock frequency delayTx1uS: call delay1uS ; delay for 1 uS dec temp ; decrement the delay counter brne delayTx1uS ; counter is not zero ; arrive here when delay counter is zero (total delay period is finished) ret ; --------------------------------------------------------------------------- ; Name: delay1uS ; Purpose: Delay of 1 uS with a 8 MHz clock frequency delay1uS: push temp ; [2] Consume clock cycles pop temp ; [2] ret ; [4] ; ============================== End of Time Delay Subroutines ==============

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Visual C# And Databases

Authors: Philip Conrod, Lou Tylee

16th Edition

1951077083, 978-1951077082

Students also viewed these Databases questions