EmbDev.net

Forum: µC & Digital Electronics how to display data on multiplexed 4x7-seg by atmega32


von Andyy Q. (qamishlo)


Attached files:

Rate this post
useful
not useful
I have some project and need some help. So project is make an asm code 
(asemmbly code)for 4 digit x 7-segment(4 digit multiplexed 7-seg) some 
thing like driver...so I have to control digits by PORTC (bits 0,1,2,3) 
and control segment's leds by PORTB (B0,...,B7), by using timer0 
overflow interrup and ATmega32..:!!interrupt time is about 4 ms. so how 
to show as example 1101 number on my segments?

in this page 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
there is some tutorial about multiplexting but the example is about 
counting..so in my project I need only to display wanted data on 
segments.

von Floh (Guest)


Rate this post
useful
not useful
you may solve it this way:
first timer0 int:
PORTB gets information for the first number and PC0 goes low to switch 
the first seven-segment on.
nex timer0 int:
PC0 goes high to deactivate the first seven segment.
PORTB gets information for the second number.
PC1 goes low to activate second seven segment.

same for the next interupts, so that the result will be like:
first segment, then next, then next, then last, begin aggain with first.

with 4 ms timer interrupt u get about 64 Hz display rate.

:-) hope it helps

von Floh (Guest)


Rate this post
useful
not useful
ähm short qustion:
what resistor values do you use for the segments?
Because you must ensure not to exceed the maximum current into 
PC0,PC1,PC2 or PC3.
current int these pins is the sum of all acivated cathodes of the seven 
segment with my program idea described above.
:-)

von Andyy Q. (qamishlo)


Rate this post
useful
not useful
thank you very much:)hmm I just want to programm it.:)I haven't built it 
yet..so I don't know what is resistor's values..:
here is my trying but it dosn't work.. maybe u can help me...I don't 
know exactly how to display data on portB



.include "m32def.inc"

.equ    Nbr_of_digits=4
.equ    A=0x1234

      .dseg
      .org  0x60
t0_ovf_cnt: .byte  2  ;timer 0 overflow counter(16-bit)
NextDigit:  .byte   1
Tulos:    .byte  1
      .org 0x100
Result:   .byte 20

B:      .byte  2
      .cseg
      .org  0
      jmp    Start

      jmp    EXT_INT0_SVC
      jmp    EXT_INT1_SVC
      jmp    EXT_INT2_SVC

      jmp    TIMER2_COMP_SVC
      jmp    TIMER2_OVF_SVC
      jmp    TIMER2_CAPT_SVC

      jmp    TIMER1_COMPA_SVC
      jmp    TIMER1_COMPB_SVC
      jmp    TIMER1_CVF_SVC

      jmp    TIMER0_COMP_SVC
      jmp    TIMER0_OVF_SVC

      jmp    ST_COMPLETE_SVC    ;serial transfer complete
      jmp    RX_COMPLETE_SVC
      jmp    DR_EMPTY_SVC    ;USART DATA Reg  Empty
      jmp    TX_COMPLETE_SVC

      jmp    AD_READY_SVC
      jmp    EEPROM_READY_SVC

      jmp    ANA_COMA_SVC
      jmp    TWI_SVC        ;2 Wire Serial Interface
      jmp    SPM_READY_SVC

Start:
    ldi R16, Low(RAMEND)
    out SPL, R16
    ldi R16,HIGH(RAMEND)
    out SPH,R16
    clr   r17
    ldi   r19, Nbr_of_digits  ;laskuri

    ldi    YL,LOW(Result)
    ldi    YH,HIGH(Result)

    ldi     r16, $FF
         out     DDRB, r16
;
        ldi     r16, $0F
        out     DDRC, r16

    ldi    r16,0b11111110
    sts    NextDigit, r16
;
    call ShowHex


    call TIMER0_OVF_SVC_INIT



    sei                ;Global Interrupt Enable


LOOP:
      rjmp  LOOP

TIMER0_OVF_SVC_INIT:


      in  r16,TCCR0
      ori  r16,(1<<CS00) ;bittien asetus
      ;ori  r16,(1<<CS02)|(1<<CS00) ;bittien asetus
      out  TCCR0, r16

      in  r16,TIMSK
      ori  r16,(1<<TOIE0)
      out  TIMSK,r16

      clr  r16
      sts  t0_ovf_cnt,r16  ;alapään nollaus
      sts  t0_ovf_cnt+1,r16  ;yläpään nollaus

      ret

TIMER0_OVF_SVC:

  push  r24
  in    r24,SREG
  push  r24
  push  r25

  lds    r24,t0_ovf_cnt
  lds    r25,t0_ovf_cnt+1
  adiw  r25:r24,1
  sts    t0_ovf_cnt,r24
  sts    t0_ovf_cnt+1,r25


  pop    r25
  pop    r24
  out    SREG,r24
  pop    r24
  sei
  ldi   r19,Nbr_of_digits
  dec   r19
  breq   TIMER0_OVF_SVC_INIT

  ;tähän toiminto eli digitien päivitys
  ;joku tila muuttuja, jonka arvo kasvaa yhdellä(ram:ssa)
        reti

EXT_INT0_SVC:
EXT_INT1_SVC:
EXT_INT2_SVC:
TIMER2_COMP_SVC:
TIMER2_OVF_SVC:
TIMER2_CAPT_SVC:
TIMER1_COMPA_SVC:
TIMER1_COMPB_SVC:
TIMER1_CVF_SVC:
TIMER0_COMP_SVC:
;TIMER0_OVF_SVC:
ST_COMPLETE_SVC:
RX_COMPLETE_SVC:
DR_EMPTY_SVC:
TX_COMPLETE_SVC:
AD_READY_SVC:
EEPROM_READY_SVC:
ANA_COMA_SVC:
TWI_SVC:
SPM_READY_SVC:

      reti

Nibble2Bin:


      ldi    ZL,LOW ( ConvTbl<<1 )
     ldi    ZH,HIGH( ConvTbl<<1 )

    andi  r16,0x0f
    clr    r17

    add    ZL,r16
      adc    ZH,r17

      lpm    r18,Z
      st    Y+, r18
    out   PORTB, Y+
    ret
    .org 0x200
ConvTbl:
  .db 0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101
  .db 0b01111100,0b00000111,0b01111111,0b01100111,0b00001010,0b00001011
  .db  0b00001100,0b00001101,0b00001110,0b00001111

ShowHex:
    clr r16
    clr  r17
    ldi r16,LOW(A)
    ldi  r17,HIGH(A)

    sts  B,r16
    sts  B+1,r17

    call Byte2Nibble

    ;lds    r16,A
    ;swap  r16
    ;andi  r16,0x0f


    ret
Byte2Nibble:
    push  r16
    swap  r16
    andi  r16,0x0f



    call  Nibble2bin

    pop    r16
    andi  r16,0x0f

    call  Nibble2bin

    ret

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.