Differences

This shows you the differences between two versions of the page.

Link to this comparison view

en:multiasm:exercisesbook:avr:sut:scenarios:avr3 [2026/05/03 19:59] – created pczekalskien:multiasm:exercisesbook:avr:sut:scenarios:avr3 [2026/05/12 10:01] (current) pczekalski
Line 1: Line 1:
 +====== AVR3: Using 7-segment 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.
 +<code asm>
 +; --- 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
 +</code>
 +
 +** Step 2 **\\
 +Configure pins that control the display as outputs (GPIO 8, GPIO 7, GPIO 4):
 +<code asm>
 +    ; 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
 +</code>
 +
 +** 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.
 +<code asm>
 +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
 +</code>
 +
 +** 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!
 +//
  
en/multiasm/exercisesbook/avr/sut/scenarios/avr3.txt · Last modified: 2026/05/12 10:01 by pczekalski
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0