ATtiny2313-TPS          

mit oder ohne AfA und TRACE-Mode, von Heinz D.              
Elektronik-Labor  Projekte   TPS


 

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. Die Ausgänge ISP/AfA werden für die externe Anzeige oder den ISP-Anschluß benötigt. Ist TPS-2313-AfA.hex aufgespielt und AfA angeschlossen, kann der Trace-Mode (Reset mit S1, Step mit S1) genutzt werden und es fehlen die blauen Befehle. Die roten Befehle stehen nicht zur Verfügung. Die fehlenden Befehle können leicht durch geänderte Programmierung umgangen werden.

 

 Es können vier Varianten kompiliert werden 1MHz oder 8MHz, je nach Devide-Fuse. Mit der Konstanten Const AfA = 1 wird AfA hinzu kompiliert.

'------------------------------------------------------------------------------------------------------

'$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

 Const Afa = 0                                               'bedingte Kompilierung AfA
'------------------------------------------------------------------------------------------------------
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. 

Download: TPS-2313-bas-hex-zip

 

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



Elektronik-Labor  Projekte   TPS