Bei vielen Anwendungen wird der AD-Wandler nicht genutzt.
Ich habe mit TPS-2313 versucht alle anderen Befehle in den Tiny 2313 zu quetschen,
dabei musste der Wait-Befehl Federn lassen und wurde durch die Formel WAITms
2^k ersetzt. Dadurch werden die langen Zeiten etwas kürzer.
Der (EE-)programmierte 2313 kann (nackt) in die Anwendung
(Optokoppler/Relais/LED's..) gesteckt werden.
'------------------------------------------------------------------------------------------------------
'$crystal = 1000000
't2313 ab Werk
'Config
Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B
Pwm = Clear Up
Config
Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B
Pwm = Clear Up
'------------------------------------------------------------------------------------------------------
TPS-2313-1MHz.hex;
TPS-2313-1MHz-AfA.hex (1MHz = ab Werk);
TPS-2313-8MHz.hex;
TPS-2313-8MHz-AfA.hex (8MHz = Devide-Fuse=aus).
Ob 1MHz oder 8MHz richtig ist, können Sie mit einem kurzen Blink-Programm und einer Uhr prüfen. (71; 54; 2A; 33; die LEDs sollten im Sekundentakt weiterschalten.
Im Foto ist zu sehen, das (B6)Miso auf 4094Clk und (B7)Sck
auf 4094Dat geht !
Ich habe nicht alle Kombinationen getestet. Es können noch
Fehler enthalten sein.
Noch ein Wort zum ISP-Anschluss. Ich habe mir einen
6-pol-ISP Inline-Adapter gebaut, der für viele AVR's passt und im Gegensatz zu
ISP-6/ISP10 auch auf dem Steckbrett zu gebrauchen ist. Der
Mosi/Miso/Sck/-/-/GND-Block wird gemeinsam gesteckt, Reset und +5V mit
Einzeladern.
'2313-TPS, Original von B.Kainka,
'ausgedünnt und TRACE-Mode hinzugefügt von Heinz D.,
'
'
' gnd -> ISP
' ------ 2313 ------ (Res)-> ISP
' Res <-A2-1 /RESET VCC 20 +5V +5V -> ISP
' In.0 <-D0-2 RXD SCL 19-B7-> sclk -> AfA dat94 ISP
' In.1 <-D1-3 TXD DO 18-B6-> miso -> AfA clk94 ISP
' S2 <-A1-4 XTAL2 SDA 17-B5-> mosi -> frei ISP
' S1 <-A0-5 XTAL1 OC1B 16-B4-> Pwm2
' In.2 <-D2-6 INT0 OC1A 15-B3-> Pwm1
' In.3 <-D3-7 INT1 OC0A 14-B2-> Out.3
' Out.0 <-D4-8 T0 AIN1 13-B1-> frei
' Out.1 <-D5-9 OC0B/T1 AIN0 12-B0-> frei
' gnd-10 GND ICP 11-D6-> Out.2
' ------------------
'$prog &HFF , &H64 , &HDF , &HFF ab Werk all fuse bytes.
'$prog &HFF , &HE4 , &HDF , &HFF devide=aus all fuse bytes.
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$regfile = "ATtiny2313.dat" '1/(8)MHz
'$crystal = 1000000 't2313 ab Werk
'Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
$crystal = 8000000 't2313 devide-Fuse=aus
Config Timer1 = Pwm , Prescale = 8 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
$hwstack = 48 '40
$swstack = 20 '16
$framesize = 36 '32
Const Afa = 1 'bedingte Kompilierung AfA
Start Timer1 '
Declare Sub Afa_dat '16 Bit holen
Declare Sub Afa_out '16 Bit ausgeben
Declare Sub Ee_rd 'EEbyte holen
Declare Sub Ee_wr 'EEbyte speichern
Declare Sub Jp_hk 'Jp H*16+n
Declare Sub Out_4 'ausgabe auf 4 LED
Declare Sub Skip 'incr PC
Declare Sub S10
Declare Sub S11
Declare Sub S20
Dim A As Byte 'Register
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim Pc As Byte 'ProgramCounter
Dim Eebyte As Byte 'Kom+Dat
Dim Dat As Byte 'Dat
Dim Kom As Byte 'Kom
Dim H As Byte 'H-Register
Dim Adrret As Byte 'Rücksprung-Adr
Dim State As Byte 'State
Dim Dd As Word 'temp
Dim I As Word 'temp für AfA
Dim J As Byte 'temp für AfA
Dim K As Byte 'temp für Out_4
Dim Trace As Byte
'S1+2-----------vv
Ddra = &B00000011 'S1+S2 4
Porta = &B00000011 'Pullup 4
'Out.3---------v
Ddrb = &B11011100 'AfA+Pwm+Out.3=B2+Ain
'Pwm---------^^
'Out.0-2---vvv
Ddrd = &B11110000 'Out+In
Portd = &B00001111 'Pullup
'In-----------^^^^
S1 Alias Pina.0 : S2 Alias Pina.1 't2313
In4 Alias Pind :
In0 Alias Pind.0 : In1 Alias Pind.1 :
In2 Alias Pind.2 : In3 Alias Pind.3 't2313
Out4 Alias Portd :
Out0 Alias Portd.4 : Out1 Alias Portd.5 :
Out2 Alias Portd.6 : Out3 Alias Portb.2 't2313
Dat4094 Alias Portb.7 : Clk4094 Alias Portb.6 'Ausgabe auf AfA
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#if Afa = 1 : Afa_out : #endif 'CLS
Waitms 200
If S2 = 0 Then Goto Programmieren 'S2 nach Reset ? 6
#if Afa = 1 : If S1 = 0 Then Trace = 1 : #endif 'Trace nur mit AfA 10
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ausfuehren: 'INTERPRETER
Do :
Portd = Portd Or &B00001111 'Pullup In.0-3
Ee_rd
#if Afa = 1 : If Trace = 1 Then : Afa_dat : Afa_out : S10 : S11 : End If : #endif 'Trace nur mit AfA
A = A And 15 'säubern
K = Dat 'für Out_4
If Kom = 1 Then Out_4 'Port direkt laden
If Kom = 2 Then : Dd = 2 ^ Dat : Do : Waitms 1 : Decr Dd : Loop Until Dd = 0 : End If
If Kom = 3 Then Pc = Pc - Dat Else Skip 'Jr -n
If Kom = 4 Then A = Dat 'Ld A,n
K = A 'für &H54 Out_4
Select Case Eebyte
Case &H51 : B = A 'LD ziel,A ' 16
Case &H52 : C = A
Case &H53 : D = A
Case &H54 : Out_4 '
#if Afa = 0 : Case &H55 : Out0 = A.0 : #endif 'fehlen mit AfA
#if Afa = 0 : Case &H56 : Out1 = A.0 : #endif
#if Afa = 0 : Case &H57 : Out2 = A.0 : #endif
#if Afa = 0 : Case &H58 : Out3 = A.0 : #endif '
Case &H59 : Pwm1a = A * 17 '
Case &H5A : Pwm1b = A * 17
Case &H61 : A = B 'LD A,quelle
Case &H62 : A = C '
Case &H63 : A = D '
Case &H64 : A = In4 '
Case &H65 : A = In0
Case &H66 : A = In1
Case &H67 : A = In2
Case &H68 : A = In3 '
Case &H71 : A = A + 1 'Mathe+Logic
Case &H72 : A = A - 1
Case &H73 : A = A + B
Case &H74 : A = A - B
Case &H75 : A = A * B
Case &H76 : A = A / B
Case &H77 : A = A And B
Case &H78 : A = A Or B
Case &H79 : A = A Xor B
Case &H7A : A = Not A '1's-Complement
Case &HC1 : If A > B Then Skip 'Jr+1,condition
Case &HC2 : If A < B Then Skip '
Case &HC3 : If A = B Then Skip '
Case &HC4 : If In0 = 1 Then Skip ' '
Case &HC5 : If In1 = 1 Then Skip
Case &HC6 : If In2 = 1 Then Skip
Case &HC7 : If In3 = 1 Then Skip
Case &HC8 : If In0 = 0 Then Skip
Case &HC9 : If In1 = 0 Then Skip
Case &HCA : If In2 = 0 Then Skip
Case &HCB : If In3 = 0 Then Skip
Case &HCC : If S1 = 0 Then Skip
Case &HCD : If S2 = 0 Then Skip
Case &HCE : If S1 = 1 Then Skip
Case &HCF : If S2 = 1 Then Skip '
End Select
If Kom = 8 Then H = Dat 'H=k
If Kom = 9 Then Jp_hk 'Jp H*16+k
If Kom = 10 Then : If C >= 1 Then : Jp_hk : C = C -1 : End If : End If 'Jp Hk
If Kom = 11 Then : If D >= 1 Then : Jp_hk : D = D -1 : End If : End If 'Jp Hk
If Kom = 13 Then : Adrret = Pc : Jp_hk : End If 'Call Hk
If Kom = 14 Then Pc = Adrret 'Return
If Kom = 15 Then Pc = 0 'Jp 0
Loop
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Programmieren:
S20 'warte bis S2 losgelassen
Do
Ee_rd 'Kom + Dat holen
State = 1
#if Afa = 0 : K = Pc And 15 : Out_4 : Waitms 300 : #endif 'AdrLo kurz ausgeben
Do
#if Afa = 1 : Afa_dat : Afa_out : #endif 'alles anzeigen
#if Afa = 0 : K = Dat : If State < 3 Then K = Kom : Out_4 : #endif 'Kom oder Dat anzeigen
While S1 = S2 : Wend 'warte auf s1/s2
If S1 = 0 Then 'STEP ->
If State = 5 Then : Dat = Dat + 1 : Dat = Dat And 15 : End If '
If State = 3 Then : State = 5 : Dat = 0 : End If '
If State = 2 Then : Kom = Kom + 1 : Kom = Kom And 15 : End If '
If State = 1 Then : State = 2 : Kom = 0 : End If '
S10 'warte solange S1=0
End If
If S2 = 0 Then 'NEXT -^
If State < 3 Then : State = 3 : Else : Ee_wr : Skip : End If
S20 'warte solange S2=0
End If
Loop Until State = 0
Loop
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sub Ee_wr
Eebyte = Kom * 16 : Eebyte = Eebyte + Dat : Writeeeprom Eebyte , Pc : End Sub '
'-------------------------------------------------------------------------------
Sub Ee_rd
Readeeprom Eebyte , Pc : Dat = Eebyte And 15 : Kom = Eebyte / 16 : End Sub '
'-------------------------------------------------------------------------------
Sub Jp_hk: '
Pc = H * 16 : Pc = Pc + Dat : End Sub 'Jump H*16 +n
'-------------------------------------------------------------------------------
Sub Out_4: '
Out4 = K * 16 : Out3 = K.3 : End Sub 'anzeigen
'-------------------------------------------------------------------------------
Sub Skip '
Incr Pc : State = 0 : End Sub
'-------------------------------------------------------------------------------
Sub S10
Do : Loop Until S1 = 1 : Goto S22 : End Sub 'warte bis S1 losgelassen
Sub S11
Do : Loop Until S1 = 0 : Goto S22 : End Sub 'warte bis S1 gedrückt
Sub S20
Do : Loop Until S2 = 1 : 'warte bis S2 losgelassen
S22:
Waitms 99 : End Sub
'-------------------------------------------------------------------------------
'Prog-Counter + Kom + Dat anzeigen
#if Afa = 1
Sub Afa_dat 'Daten holen
I = Pc * 16 :
I = I + Kom :
I = I * 16 :
I = I + Dat
End Sub
Sub Afa_out: 'anzeigen
J = 0
While J < 16 :
Dat4094 = I.j :
Clk4094 = 1 : 'Takt
Clk4094 = 0 :
J = J + 1
Wend : :
End Sub
#endif
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'AfA=Anzeige für AVR mit 4094, Anschluß und Speisung über den ISP-Anschluß
'2 hintereinanderschalten für 2 Byte = 4 Nibble
'
' ------ 4094 ------
' ISP -> +5V 1 str 16 +5V
' ISP -> dat94 2 dat En0 15 +5V
' ISP -> clk94 3 clk 14 LED4 L-Nibble
' H-Nibble LED0 4 13 LED5 "
' " LED1 5 12 LED6 "
' " LED2 6 11 LED7 "
' " LED3 7 Do2 10
' ISP -> gnd 8 Do1 9 dat-out-> zum 2. 4094
' ------------------
'-------------------------------------------------------------------------------
'Ende