Ein Sparrow mit zwei Tiny13           

eine Idee von Heinz D.                      
Elektronik-Labor  Projekte  AVR 




Ein Tiny13 dient zur Signalaufbereitung und als ISP-Interface: 1410-Sparrow-mit-Zweit-T13.zip
Dieser Entwurf ist nicht ausreichend getestet!


Vorteile

Hysterese >2mVeff im .bas einstellbar (Rauschabstand in Zeile 47),
Übersteuerungsfest bis ~1Veff,
während Sck=1 ändert sich Mosi nicht,
nach timeout sind die Line-Signale wirkungslos, tristate.


Hardware
C1+C2 (100nF = HP~300Hz) können in aller Regel entfallen.
R1+R2 (10k) legen den Pegel zusammen mit den internen Pullup für die AD-Wandler auf ~Vcc/3 bis ~Vcc/2.
Die Res-Led ist optional, zeigt jedoch den Programmier-Vorgang an (Prog-Led).
Die Port-Zuordnung kann im .bas leicht geändert werden.

Firmware (das wichtigste)
Der Mittelwert+Hysterese wird vorsichtshalber zweimal ermittelt (Zeile 55-57),
dann wird auf Leadin auf dem Datenkanal gewartet,
der Target-AVR wird auf Reset gezogen, Prog-Sequenz einleiten,
in Zeile 61 bis 67 werden die Durchläufe gezählt und beim Ausbleiben von Sck in Powerdown gewechselt,
('timeout' (65000) muss ggf. vergrößert (DWORD) oder verkleinert werden, in Zeile 63.)
in Zeile 69 wird Mosi gesetzt und gehalten,
wenn Line_L=1, wird die While-Schleife in Zeilen 71 bis 74 wird durchlaufen, Sck=1, sonst/dann Sck=0,
die Sub ab Zeile 78 wird solange durchlaufen, bis keine Änderung mehr vorkommt,
bei starkem Rauschen kann die Sub hängen.
(ggf. braucht die Sub bei gestörten Signalen eine Hysterese.)


Data "1 4 1 0 - S p a r r o w "                             'Prog-Name im .hex-File
' 1410-Sparrow mit zweitem T13
' Pegelaufbereitung für ISP, Line=90,7us+90,7us
'
' Benutzung:
' 1. Line und Target-AVR anschliessen
' 2. Master-AVR-Reset = Start, >1s warten für den Mittelwert
'
' dieses Programm dient Ausbildungszwecken
'-------------------------------------------------------------------------------
' ATTiny13 20PU
' 1 /Reset/B5/Ad0 <- Taste
' 2 B3/Ad3 <- Line_L + 10k pulldown
' 3 B4/Ad2 <- Line_R + 10k pulldown
' 4 GND
' 5 B0/mosi/oc0a -> Target-AVR-Mosi
' 6 B1/miso/Int0/oc0b -> Target-AVR-Reset (ggf.Led)
' 7 B2/Sck/Ad1/T0 -> Target-AVR-Sck
' 8 +Vcc
'-------------------------------------------------------------------------------
$crystal = 9600000
$regfile = "attiny13.dat"
$hwstack = 16
$swstack = 16
$framesize = 16
'$programmer = 19 'USBASP
$asm
ldi r16, 128 ' clock prescaler
Out Clkpr , R16 ' doc2535, T13, Seite 28
ldi r16, 0 ' clock = clock / 1
Out Clkpr , R16 ' (T13=9,6MHz)
nop ' wait
nop
nop
nop
$end Asm ' =11,5Cyclen pro Durchlauf

Ddrb = &B00111
Portb = &B11000 'Pullup für Adc 2+3

Sck Alias Portb.0 : Res Alias Portb.1 : Mosi Alias Portb.2
Line_l Alias Getadc(3) : Line_r Alias Getadc(2)
Sck = 0 : Res = 1 : Mosi = 0

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Const Hysterese = 8 ' Triggerschwelle 8= ~25mV

Declare Sub Mittelwert

Dim I As Word 'timeout
Dim Mittelwert_l As Integer , Mittelwert_r As Integer

Init:
Mittelwert 'Schwelle festlegen
Wait 1
Mittelwert
Do : Loop Until Line_r > Mittelwert_r 'leadin auf data ?
Res = 0 'Target-AVR-Reset = Prog-Led
I = 0 'timeout zurücksetzen
Do
I = I + 1
If I > 65000 Then 'timeout ?
Res = 1 'ext. Reset aufheben
Ddrb = 0 'tristate
Powerdown
End If

If Line_r > Mittelwert_r Then Mosi = 1 Else Mosi = 0 'data= 0 oder 1 ?

While Line_l > Mittelwert_l 'clk ?
Sck = 1 'ja
I = 0 'timeout zurücksetzen
Wend 'clk auf 0 ?
Sck = 0
Loop 'nächstes Datum
'-------------------------------------------------------------------------------
Sub Mittelwert:
Do ' data
Mittelwert_r = Mittelwert_r + Line_r
Mittelwert_r = Mittelwert_r / 2
Loop Until Line_r = Mittelwert_r
Mittelwert_r = Mittelwert_r + Hysterese
Do ' Sck
Mittelwert_l = Mittelwert_l + Line_l
Mittelwert_l = Mittelwert_l / 2
Loop Until Line_l = Mittelwert_l
Mittelwert_l = Mittelwert_l + Hysterese
End Sub
'end ---------------------------------------------------------------------------



Elektronik-Labor  Projekte  AVR