VU-Meter oder Voltmeter           

in Bascom und Assembler, von Heinz D.                      
Elektronik-Labor  Projekte   AVR   T13-Contest



Mehr als 12 LED kann man an einen Tiny13 nicht anschließen (Charlieplexing, n*n-n, 4*4-4=12), wenn man den AD-Wandler braucht. Eine Hardware, viermal Software:

1. VU-Meter.asm: In Assembler ist die Division durch 23,2 nicht so einfach. Die Division durch 16 ergibt 69mV/Stufe (0..760mV). Mit einem Spannungsteiler am ADC kann dann jede (höhere) Spannung eingestellt werden. Durch schnelles Wiederholen wird eine Balkenanzeige erzielt.

2. VU-Meter.bas: Die Balkenanzeige macht fast das gleiche, wie .asm. Hier kann die Division durch 93 genau eingestellt werden und 0,1V/Stufe wird erreicht.

3. Voltmeter.asm: Die Einzel-LED Anzeige eignet sich besser als Voltmeter (69mV/Stufe).

4. Voltmeter.bas: Es macht fast das gleiche in Basic mit 100mV/Stufe.






Nur 4 Drähte braucht das 12-LED-Feld und kann leicht abgesetzt betrieben werden! Die 4 LED-Widerstände sollen >=120R betragen. Bei Ansteuerung mit Wechselspannung wird zwar kein Gleichrichter benötigt, aber es wird der Spitzenwert angezeigt. Für Lautsprecher muss ein Spannungsteiler (100k in Reihe, 4k7 parallel zum ADC) verwendet werden und die Leistung auf Effektiv umgerechnet werden.



Die dB-Anzeige ist relativ zu verstehen und kann mit einem Spannungsteiler/Poti an fast jedes Mischpult angepasst werden (min. 10k in Reihe).



Ein Vergleich Bascom/Assembler: Beide sind fast gleich schnell.

Download:
VU-Meter-asm-hex.zip
VU-Meter-bas-hex-zip
Voltmeter-asm-hex.zip
Voltmeter-bas-hex.zip
' Oster-Contest, VU-Meter, Voltmeter 0-1,1V
'
' LED einzeln
'-------------------------------------------------------------------------------
' alle Fuse-Byte ab Werk
'-------------------------------------------------------------------------------
$regfile = "attiny13.dat"
$crystal = 1200000 ' 9,6MHz/8
$hwstack = 8

Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim Temp As Word

Do 'Hauptprogramm
Main:
Ddrb = 0 'LED aus
Temp = Getadc(2) 'Wert holen
Temp = Temp / 93 'auf 11 Stufen reduzieren
If Temp = 0 Then : Ddrb = 3 : Portb = 1 : End If
If Temp = 1 Then : Ddrb = 5 : Portb = 1 : End If
If Temp = 2 Then : Ddrb = 9 : Portb = 1 : End If
If Temp = 3 Then : Ddrb = 3 : Portb = 2 : End If
If Temp = 4 Then : Ddrb = 6 : Portb = 2 : End If
If Temp = 5 Then : Ddrb = 10 : Portb = 2 : End If
If Temp = 6 Then : Ddrb = 5 : Portb = 4 : End If
If Temp = 7 Then : Ddrb = 6 : Portb = 4 : End If
If Temp = 8 Then : Ddrb = 12 : Portb = 4 : End If
If Temp = 9 Then : Ddrb = 9 : Portb = 8 : End If
If Temp = 10 Then : Ddrb = 10 : Portb = 8 : End If
If Temp = 11 Then : Ddrb = 12 : Portb = 8 : End If
If Temp > 10 Then : Ddrb = 12 : Portb = 8 : End If
Loop 'nochmal
' End P






;===============================================================================================
;
; Oster-Contest: Voltmeter, Punktanzeige 69mV/Teil (0..0,8V)
;
;===============================================================================================
;
; ATtiny13
; _____ _____
; | |_| | 1N4148 /
; |Res Vcc|-------+---|<|---+-o o-o +4,5V-6V
; | | | |
; | | --- C1 |
; | sck| --- 1u |
; +-----|PB3 PB2|-----+ | |
; | | | | | |
; | | | | | |
; | | miso| | | |
; | +---|ADC2 PB1|---+ | | |
; | | | | | | | |
; | | | | | | | |
; | | | mosi| | | | |
; | | +-|Gnd PB0|-+ | | | |
; | | | |_____________| | | | | |
; | | o--o--o--o--o--o--|-|-|-+ schwarz |
; | | o--o--o--o--o--o--|-|-|-----------+ rot
; | +-o o o o o-----+ | | gelb
; +------+ | +----------+ |
; +---------------+
; B4 B3 B2 B1 B0 Batt
;
;
; ALLE GND-Anschlüsse MÜSSEN (sternförmig) auf kürzestem Weg am Pin 4 zusammenlaufen,
; um keine Spannungsabfälle auf ADC(2) zu übertragen.
;===============================================================================================
; ADC(2)=PB.4 wird per Interrupt in r16 geholt. Uref auf 1,1V eingestellt
; der ADC-Wert wird für die Anzeige durch 16 geteilt
;===============================================================================================
; Fuse 0b0110_1010
; devide=^ ^^^^=9,6MHz
;===============================================================================================
.DEVICE ATtiny13 ; für gavrasm
.cseg ; codesegment
.org 0 ; adr 0
rjmp init ; Reset vector
reti ; Int0 interrupt vector
reti ; PCINT0 vector
reti ; TC0 overflow vector
reti ; Eeprom ready vector
reti ; Analog comparator int vector
reti ; TC0 CompA vector
reti ; TC0 CompB vector
reti ; WDT vector
rjmp int_adc ; ADC conversion complete vector
;--------------------------------
Int_adc: ; Aufruf NUR, wenn neuer Wert verfügbar
in r16,ADCh ; Lese ADC-Wert, obere 8Bit
lsr r16
lsr r16
lsr r16
lsr r16 ; /16
reti ; zurück ins Hauptprogramm
;--------------------------------
init:
init_adc: ;
ldi r16,0b01100010 ; - 1 1 - - - 1 0
Out Admux , R16 ; ref-^ ^adlar ^+^-adc2
ldi r16,0b00000000 ; - - - - - 0 0 0
Out Adcsrb , R16 ; ^+^+^-Free Run
ldi r16,0b11101110 ; 1 1 1 0 1 1 1 1
Out Adcsra , R16 ; ena-^ ^-start ^+^+^-prescale
sei ;
;--------------------------------
main:
ldi r17,0 ;
cpse r16,r17 ;
rjmp eins ;
ldi r17,0b00000011 ;
out ddrb,r17 ;
ldi r17,1 ; LED 0,1,2
out portb,r17 ;
rjmp main ;
eins: ;
ldi r17,1 ;
cpse r16,r17 ;
rjmp zwei ;
ldi r17,0b00000101 ;
out ddrb,r17 ;
ldi r17,1 ; LED 0,1,2
out portb,r17 ;
rjmp main ;
zwei: ;
ldi r17,2 ;
cpse r16,r17 ;
rjmp drei ;
ldi r17,0b00001001 ;
out ddrb,r17 ;
ldi r17,1 ; LED 0,1,2
out portb,r17 ;
rjmp main ;
drei: ;
ldi r17,3 ;
cpse r16,r17 ;
rjmp vier ;
ldi r17,0b00000011 ;
out ddrb,r17 ;
ldi r17,2 ; LED 3,4,5
out portb,r17 ;
rjmp main ;
vier: ;
ldi r17,4 ;
cpse r16,r17 ;
rjmp funf ;
ldi r17,0b00000110 ;
out ddrb,r17 ;
ldi r17,2 ; LED 3,4,5
out portb,r17 ;
rjmp main ;
funf: ;
ldi r17,5 ;
cpse r16,r17 ;
rjmp sechs ;
ldi r17,0b00001010 ;
out ddrb,r17 ;
ldi r17,2 ; LED 3,4,5
out portb,r17 ;
rjmp main ;
sechs: ;
ldi r17,6 ;
cpse r16,r17 ;
rjmp sieben ;
ldi r17,0b00000101 ;
out ddrb,r17 ;
ldi r17,4 ; LED 6.7.8
out portb,r17 ;
rjmp main ;
sieben: ;
ldi r17,7 ;
cpse r16,r17 ;
rjmp acht ;
ldi r17,0b00000110 ;
out ddrb,r17 ;
ldi r17,4 ; LED 6.7.8
out portb,r17 ;
rjmp main ;
acht: ;
ldi r17,8 ;
cpse r16,r17 ;
rjmp neun ;
ldi r17,0b00001100 ;
out ddrb,r17 ;
ldi r17,4 ; LED 6.7.8
out portb,r17 ;
rjmp main ;
neun: ;
ldi r17,9 ;
cpse r16,r17 ;
rjmp zehn ;
ldi r17,0b00001001 ;
out ddrb,r17 ;
ldi r17,8 ; LED 9,10,11
out portb,r17 ;
rjmp main ;
zehn: ;
ldi r17,10 ;
cpse r16,r17 ;
rjmp elf ;
ldi r17,0b00001010 ;
out ddrb,r17 ;
ldi r17,8 ; LED 9,10,11
out portb,r17 ;
rjmp main ;
elf: ;
ldi r17,11 ;
cpse r16,r17 ;
rjmp zwolf ;
ldi r17,0b00001100 ;
out ddrb,r17 ;
ldi r17,8 ; LED 9,10,11
out portb,r17 ;
rjmp main ;
zwolf: ;
ldi r17,0b00001100 ;
out ddrb,r17 ;
ldi r17,8 ; LED 9,10,11
out portb,r17 ;
rjmp main ;
;===============================================================================================
;end









Elektronik-Labor  Projekte   AVR   T13-Contest