====== AVR3: Using 7-deg display ====== In this scenario, you will implement a code that displays on the 7-segment display.\\ ** Prerequisites **\\ You need to book one of the AVR laboratory nodes and ensure the video stream is live. ** Scenario **\\ Implement an algorithm that displays your birth year (or any other 4-digit number) on the LED 7-segment display. ** Result **\\ Observe the number via the video stream. ** Start **\\ Use AVR GCC syntax (as in the instruction): node compilation facilities are preconfigured, and you do not need to build a Makefile; still, it is necessary to follow the exact AVR GCC syntax, e.g., in the case of ''.equ''.\\ Use the function ''display_digit'' that handles displaying a single digit, as provided in the [[..:..:sut|]] to bootstrap your code. Also note you need to define a stack to use ''delay'' separately (if you use ''rcall'' and ''ret'' instructions). It is obligatory. In this algorithm, you go "full throttle". You should implement a loop that displays four consecutive digits. At 16 MHz, shield latches responsible for handling the display are close to their limits but still operate fine. Naturally, in a real-world scenario, you would not waste energy implementing it this way. Would you? ** Step 1 **\\ Compose application definitions and configuration. Set up a stack. We do not use the'.section' directive here, but if you plan to use RAM, '.sections' are required and simplify your code. ; --- Single .equ for RAM End --- .equ SPH, 0x3E ; Stack Pointer High .equ SPL, 0x3D ; Stack Pointer Low .equ SER_PORT, 0x05 ; PORTB I/O address .equ SER_PIN, 0 ; GPIO8 .equ DDRD, 0x0A ; Data Direction Port D .equ DDRB, 0x04 ; Data Direction Port B .equ CLK_PORT, 0x0B ; PORTD I/O address .equ CLK_PIN, 7 ; GPIO7 .equ LAT_PORT, 0x0B ; PORTD I/O address .equ LAT_PIN, 4 ; GPIO4 .equ RAMEND, 0x08FF ; Arduino Uno memory size .section .text .org 0x0000 rjmp RESET reset: ; Initialise Stack Pointer using hi8 and lo8 functions ldi r16, lo8(RAM_END) out SPL, r16 ldi r16, hi8(RAM_END) out SPH, r16 ** Step 2 **\\ Configure pins that control the display as outputs (GPIO 8, GPIO 7, GPIO 4): ; Initialise display control outputs sbi DDRB, SER_PIN ; Set PB0 as output sbi DDRD, CLK_PIN ; Set PD7 as output sbi DDRD, LAT_PIN ; Set PD4 as output ** Step 3 **\\ Make a loop that calls the 'display_digit' function four times, varying the numbers and positions. Load arguments. As you use constant variables (the easiest, naturally, use ''ldi'' to load registers. Note that digit indexes are zero-based; thus, the leftmost digit is at position 0, and the rightmost is at position 3. **Step4** Copy ''display_digit'' function from the manual to your code and put it after the end of your main loop. main_loop: ; Display Pattern A (D2, D4 ON) ldi r16, PATTERN_A out PORTB, r16 rcall delay_2s ; Display Pattern B (D1, D3 ON) ldi r16, PATTERN_B out PORTB, r16 rcall delay_2s rjmp main_loop ** Result validation **\\ You should be able to see the number on the 7-segment display via the video stream. ** FAQ **\\ When using the printed version of this manual, please refer to the latest online version for the most up-to-date list of FAQs.\\ **It does not show up at all**: Did you compile and upload to the device? Those are separate steps: it is not enough to just compile, but you also need to "flash" the MCU. Also, check your video stream if it "ticks" - the time embedded into the video stream should change. Your code may be working OK, but the video stream can be frozen, so you cannot see it working properly! //